From mboxrd@z Thu Jan 1 00:00:00 1970 From: Benny Sjostrand Subject: [PATCH] cs46xx: once again SMP fixes, new aproach Date: Thu, 22 Aug 2002 23:29:20 +0200 Sender: alsa-devel-admin@lists.sourceforge.net Message-ID: <3D6557B0.5070007@cucumelo.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------050801060305010503040403" Return-path: Errors-To: alsa-devel-admin@lists.sourceforge.net List-Help: List-Post: List-Subscribe: , List-Unsubscribe: , List-Archive: To: tiwai@suse.de, alsa-devel@lists.sourceforge.net List-Id: alsa-devel@alsa-project.org This is a multi-part message in MIME format. --------------050801060305010503040403 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit Hi! This was hard nut break with good solution, with this solution I can only find two issues: 1 - for the moment I'm totally convinced that it's a excelent solution -;) 2- as I dont have any SMP machine (yet) I cant test it, untested code is condemned to fail. I will try to explain my theory, this diagram shows the SCB tree structure in overview: FGTaskTree ¦ | +-----------------+ +-----------------+ | TimingMasterSCB |---next_scb-- | WriteBackSCB |--nextSCB ... (misc functionality) +-----------------+ +-----------------+ | | sub_list_ptr (sub tree used for capture) | ... +-----------------+ | CodecOutSCB |--nullSCB +-----------------+ | sub_list_ptr | +-----------------+ | MasterMixSCB |--nullSCB +-----------------+ | sub_list_ptr | +-----------------+ +-----------------+ +-----------------+ | SRCTask_SPDIF |---nextSCB---| SRCTask_SCB0 |--nextSCB--| SRCTask_SCB1 |- ... (etc) +-----------------+ +-----------------+ +-----------------+ | | | sub_list_ptr sub_list_ptr sub_list_ptr | | | +-----------------+ +------------+ +-----------+ +-----------+ +-----------+ | AsynchFGRxSCB | | PCMReader1 |-nextSCB-| PCMReader2| | PCMReader3|-nextSCB-| PCMReader4|-nextSCB- ... (etc) +-----------------+ +------------+ +-----------+ +-----------+ +-----------+ | | | | | nullSCB nullSCB nullSCB nullSCB nullSCB (i hope you have a wide terminal and fixed font width) - The pcm_link/unlink only access SCB under it's related SRCTask_SCB*, it only touches the nex_scb_ptr, parent_ptr and sub_list_ptr on SRCTask.. so it can safely be running paralel with any other simultaneous operation on other parts of the tree, and it can be running paralell with others pcm_link/unlink related to other SRCTask*. - In create_pcm_channel the channel is initially created unlinked, which mean pcm_link must be called before playback start, invoked by playback_trigger. Anyway pcm_unlink was called in playback_open, which now can be removed. In this way the pcm_reader SCB will be initially floating, with no parent SCB and therefor we dont need any spin_lock in create_pcm_channel. - But, the _same_ PCM stream, playback_trigger cant run before playback_open has completed. Which make no sense, I supose the ALSA PCM core prevent a process from doing this to happen. - In pcm_link the PCMReaderSCB is always linked in after SRCTask* sub_list_ptr, then therefor is no need loop searching for the last free SCB in sublist. Conclusion what we got is: - No mutexes in playback_trigger - Independent spin_locks for each SRCTask* - spin_lock only needed in pcm_link/unlink and in cs46xx_dsp_remove_scb. With fewer and short spin_locks, theorically we manage to have good performance on SMP machines -:) That's all, ... i think ... Question, suggestion or whatever you got in mind about this is welcome, i'll try to be open. /Benny --------------050801060305010503040403 Content-Type: application/x-java-vm; name="cs46xx_patch" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="cs46xx_patch" ZGlmZiAtTmF1ciAtLWV4Y2x1ZGU9bW9kLWRlcHMuYyAtLWV4Y2x1ZGU9RW50cmllcyAtLWV4 Y2x1ZGU9TWFrZWZpbGUgLi4vY3ZzX3JlZi9hbHNhLWtlcm5lbC9pbmNsdWRlL2NzNDZ4eC5o IGFsc2Eta2VybmVsL2luY2x1ZGUvY3M0Nnh4LmgKLS0tIC4uL2N2c19yZWYvYWxzYS1rZXJu ZWwvaW5jbHVkZS9jczQ2eHguaAlUdWUgQXVnIDEzIDIzOjIyOjQ1IDIwMDIKKysrIGFsc2Et a2VybmVsL2luY2x1ZGUvY3M0Nnh4LmgJVGh1IEF1ZyAyMiAyMTo0MDo0OSAyMDAyCkBAIC0x ODE3LDYgKzE4MTcsOCBAQAogICBpbnQgY3VycmVudF9ncGlvOwogI2VuZGlmCiAjaWZkZWYg Q09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAorCXN0cnVjdCBzZW1hcGhvcmUgc3Bvc19tdXRl eDsKKwogCWRzcF9zcG9zX2luc3RhbmNlX3QgKiBkc3Bfc3Bvc19pbnN0YW5jZTsKICNlbHNl IC8qIGZvciBjb21wYXRpYmlsaXR5ICovCiAJY3M0Nnh4X3BjbV90ICpwbGF5YmFja19wY207 CmRpZmYgLU5hdXIgLS1leGNsdWRlPW1vZC1kZXBzLmMgLS1leGNsdWRlPUVudHJpZXMgLS1l eGNsdWRlPU1ha2VmaWxlIC4uL2N2c19yZWYvYWxzYS1rZXJuZWwvaW5jbHVkZS9jczQ2eHhf ZHNwX3Nwb3MuaCBhbHNhLWtlcm5lbC9pbmNsdWRlL2NzNDZ4eF9kc3Bfc3Bvcy5oCi0tLSAu Li9jdnNfcmVmL2Fsc2Eta2VybmVsL2luY2x1ZGUvY3M0Nnh4X2RzcF9zcG9zLmgJVHVlIEF1 ZyAyMCAwODowNTozOSAyMDAyCisrKyBhbHNhLWtlcm5lbC9pbmNsdWRlL2NzNDZ4eF9kc3Bf c3Bvcy5oCVRodSBBdWcgMjIgMjE6NDE6NDUgMjAwMgpAQCAtMTA5LDYgKzEwOSw3IEBACiAK IAlzbmRfaW5mb19lbnRyeV90ICpwcm9jX2luZm87CiAJaW50IHJlZl9jb3VudDsKKyAgICBz cGlubG9ja190IGxvY2s7CiAKIAlpbnQgZGVsZXRlZDsKIH0gZHNwX3NjYl9kZXNjcmlwdG9y X3Q7CkBAIC0xNDEsOCArMTQyLDYgQEAKIAlzZWdtZW50X2Rlc2NfdCBjb2RlOwogCiAJLyog UENNIHBsYXliYWNrICovCi0Jc3RydWN0IHNlbWFwaG9yZSBwY21fbXV0ZXg7Ci0KIAlkc3Bf c2NiX2Rlc2NyaXB0b3JfdCAqIG1hc3Rlcl9taXhfc2NiOwogCWludCBucGNtX2NoYW5uZWxz OwogCWludCBuc3JjX3NjYjsKQEAgLTE2Miw3ICsxNjEsNiBAQAogCXNuZF9pbmZvX2VudHJ5 X3QgKiBwcm9jX3NhbXBsZV9kdW1wX2luZm9fZW50cnk7CiAKIAkvKiBTQ0IncyBkZXNjcmlw dG9ycyAqLwotCXN0cnVjdCBzZW1hcGhvcmUgc2NiX211dGV4OwogCWludCBuc2NiOwogCWlu dCBzY2JfaGlnaGVzdF9mcmFnX2luZGV4OwogCWRzcF9zY2JfZGVzY3JpcHRvcl90IHNjYnNb RFNQX01BWF9TQ0JfREVTQ107CmRpZmYgLU5hdXIgLS1leGNsdWRlPW1vZC1kZXBzLmMgLS1l eGNsdWRlPUVudHJpZXMgLS1leGNsdWRlPU1ha2VmaWxlIC4uL2N2c19yZWYvYWxzYS1rZXJu ZWwvcGNpL2NzNDZ4eC9jczQ2eHhfbGliLmMgYWxzYS1rZXJuZWwvcGNpL2NzNDZ4eC9jczQ2 eHhfbGliLmMKLS0tIC4uL2N2c19yZWYvYWxzYS1rZXJuZWwvcGNpL2NzNDZ4eC9jczQ2eHhf bGliLmMJVHVlIEF1ZyAyMCAwODowNTozOSAyMDAyCisrKyBhbHNhLWtlcm5lbC9wY2kvY3M0 Nnh4L2NzNDZ4eF9saWIuYwlUaHUgQXVnIDIyIDIzOjI1OjQwIDIwMDIKQEAgLTg1NSw2ICs4 NTUsNyBAQAogCiAJaWYgKGNvcHlfZnJvbV91c2VyKGh3YnVmLCBzcmMsIGJ5dGVzKSkKIAkJ cmV0dXJuIC1FRkFVTFQ7CisKIAlzcGluX2xvY2tfaXJxKCZydW50aW1lLT5sb2NrKTsKIAlz bmRfY3M0Nnh4X3BsYXliYWNrX3RyYW5zZmVyKHN1YnN0cmVhbSwgZnJhbWVzKTsKIAlzcGlu X3VubG9ja19pcnEoJnJ1bnRpbWUtPmxvY2spOwpAQCAtODg1LDE1ICs4ODYsMTcgQEAKIHsK IAljczQ2eHhfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsK IAkvKnNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOyov CisJaW50IHJlc3VsdCA9IDA7CisKICNpZmRlZiBDT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQ CiAJY3M0Nnh4X3BjbV90ICpjcGNtID0gc25kX21hZ2ljX2Nhc3QoY3M0Nnh4X3BjbV90LCBz dWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YSwgcmV0dXJuIC1FTlhJTyk7CisjZWxz ZQorCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOwogI2VuZGlmCi0JaW50IHJlc3VsdCA9 IDA7CiAKLQlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKICNpZmRlZiBDT05GSUdfU05E X0NTNDZYWF9ORVdfRFNQCisKIAlpZiAoISBjcGNtLT5wY21fY2hhbm5lbCkgewotCQlzcGlu X3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwogCQlyZXR1cm4gLUVOWElPOwogCX0KICNlbmRp ZgpAQCAtOTA1LDYgKzkwOCw3IEBACiAJCQljczQ2eHhfZHNwX3BjbV9saW5rKGNoaXAsY3Bj bS0+cGNtX2NoYW5uZWwpOwogCQlpZiAoc3Vic3RyZWFtLT5ydW50aW1lLT5wZXJpb2RzICE9 IENTNDZYWF9GUkFHUykKIAkJCXNuZF9jczQ2eHhfcGxheWJhY2tfdHJhbnNmZXIoc3Vic3Ry ZWFtLCAwKTsKKwogCQkvKiByYWlzZSBwbGF5YmFjayB2b2x1bWUgKi8KIAkJc25kX2NzNDZ4 eF9wb2tlKGNoaXAsIChjcGNtLT5wY21fY2hhbm5lbC0+cGNtX3JlYWRlcl9zY2ItPmFkZHJl c3MgKyAweEUpIDw8IDIsIDB4ODAwMDgwMDApOwogI2Vsc2UKQEAgLTkyMCw2ICs5MjQsOCBA QAogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKIAljYXNlIFNORFJWX1BDTV9UUklH R0VSX1NVU1BFTkQ6CiAjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAorICAgICAg ICAvKiBtdXRlIGNoYW5uZWwgKi8KKwkJc25kX2NzNDZ4eF9wb2tlKGNoaXAsIChjcGNtLT5w Y21fY2hhbm5lbC0+cGNtX3JlYWRlcl9zY2ItPmFkZHJlc3MgKyAweEUpIDw8IDIsIDB4ZmZm ZmZmZmYpOwogCQlpZiAoIWNwY20tPnBjbV9jaGFubmVsLT51bmxpbmtlZCkKIAkJCWNzNDZ4 eF9kc3BfcGNtX3VubGluayhjaGlwLGNwY20tPnBjbV9jaGFubmVsKTsKICNlbHNlCkBAIC05 MzQsNyArOTQwLDExIEBACiAJCXJlc3VsdCA9IC1FSU5WQUw7CiAJCWJyZWFrOwogCX0KKwor I2lmbmRlZiBDT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQCiAJc3Bpbl91bmxvY2soJmNoaXAt PnJlZ19sb2NrKTsKKyNlbmRpZgorCiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtOTY0LDYg Kzk3NCw3IEBACiAJCWJyZWFrOwogCX0KIAlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2sp OworCiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtOTk0LDYgKzEwMDUsNyBAQAogCQkJcmV0 dXJuIGVycjsKIAkJc3Vic3RyZWFtLT5vcHMgPSAmc25kX2NzNDZ4eF9wbGF5YmFja19pbmRp cmVjdF9vcHM7CiAJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwMTEsNiArMTAyMyw3IEBA CiAJcnVudGltZS0+ZG1hX2FyZWEgPSBOVUxMOwogCXJ1bnRpbWUtPmRtYV9hZGRyID0gMDsK IAlydW50aW1lLT5kbWFfYnl0ZXMgPSAwOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwMjUs NyArMTAzOCw4IEBACiAJY3BjbSA9IHNuZF9tYWdpY19jYXN0KGNzNDZ4eF9wY21fdCwgcnVu dGltZS0+cHJpdmF0ZV9kYXRhLCByZXR1cm4gLUVOWElPKTsKIAogI2lmZGVmIENPTkZJR19T TkRfQ1M0NlhYX05FV19EU1AKLQlkb3duICgmY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2UtPnBj bV9tdXRleCk7CisgICAgZG93biAoJmNoaXAtPnNwb3NfbXV0ZXgpOworCiAJaWYgKCBjcGNt LT5wY21fY2hhbm5lbC0+c3JjX3NjYi0+cmVmX2NvdW50ID09IDEgJiYKIAkgICAgIGNwY20t PnBjbV9jaGFubmVsLT5zYW1wbGVfcmF0ZSAhPSBydW50aW1lLT5yYXRlKSB7CiAJCS8qIHNh bXBsZSByYXRlIG5vdCBzZXQgb3Igd2UgY2FuIHJldXNlCkBAIC0xMDM0LDIzICsxMDQ4LDI1 IEBACiAJCWNzNDZ4eF9kc3Bfc2V0X3NyY19zYW1wbGVfcmF0ZSAoY2hpcCxjcGNtLT5wY21f Y2hhbm5lbC0+c3JjX3NjYixydW50aW1lLT5yYXRlKTsKIAkJY3BjbS0+cGNtX2NoYW5uZWwt PnNhbXBsZV9yYXRlID0gcnVudGltZS0+cmF0ZTsKIAl9IAotCXVwICgmY2hpcC0+ZHNwX3Nw b3NfaW5zdGFuY2UtPnBjbV9tdXRleCk7CiAKIAlpZiAoY3BjbS0+cGNtX2NoYW5uZWwtPnNh bXBsZV9yYXRlICE9IHJ1bnRpbWUtPnJhdGUgJiYKIAkgICAgY3BjbS0+cGNtX2NoYW5uZWwt PnNyY19zY2ItPnJlZl9jb3VudCAhPSAxKSB7CisgICAgICAgIGludCB1bmxpbmtlZCA9IGNw Y20tPnBjbV9jaGFubmVsLT51bmxpbmtlZDsKIAkJY3M0Nnh4X2RzcF9kZXN0cm95X3BjbV9j aGFubmVsIChjaGlwLGNwY20tPnBjbV9jaGFubmVsKTsKIAogCQlpZiAoIChjcGNtLT5wY21f Y2hhbm5lbCA9IGNzNDZ4eF9kc3BfY3JlYXRlX3BjbV9jaGFubmVsIChjaGlwLCBydW50aW1l LT5yYXRlLCBjcGNtLCBjcGNtLT5od19hZGRyKSkgPT0gTlVMTCkgewogCQkJc25kX3ByaW50 ayhLRVJOX0VSUiAiY3M0Nnh4OiBmYWlsZWQgdG8gcmUtY3JlYXRlIHZpcnR1YWwgUENNIGNo YW5uZWxcbiIpOworICAgICAgICAgICAgdXAgKCZjaGlwLT5zcG9zX211dGV4KTsKIAkJCXJl dHVybiAtRU5YSU87CiAJCX0KIAotCQljczQ2eHhfZHNwX3BjbV91bmxpbmsgKGNoaXAsY3Bj bS0+cGNtX2NoYW5uZWwpOworCQlpZiAoIXVubGlua2VkKSBjczQ2eHhfZHNwX3BjbV9saW5r IChjaGlwLGNwY20tPnBjbV9jaGFubmVsKTsKIAkJY3BjbS0+cGNtX2NoYW5uZWwtPnNhbXBs ZV9yYXRlID0gcnVudGltZS0+cmF0ZTsKIAl9CiAKIAlwZmllID0gc25kX2NzNDZ4eF9wZWVr KGNoaXAsIChjcGNtLT5wY21fY2hhbm5lbC0+cGNtX3JlYWRlcl9zY2ItPmFkZHJlc3MgKyAx KSA8PCAyICk7CiAJcGZpZSAmPSB+MHgwMDAwZjAzZjsKKyAgICB1cCAoJmNoaXAtPnNwb3Nf bXV0ZXgpOwogI2Vsc2UKIAkvKiBvbGQgZHNwICovCiAJcGZpZSA9IHNuZF9jczQ2eHhfcGVl ayhjaGlwLCBCQTFfUEZJRSk7CkBAIC0xMTEzLDYgKzExMjksNyBAQAogCXNuZF9wY21fcnVu dGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCWludCBlcnI7CiAKKwog CWlmIChydW50aW1lLT5wZXJpb2RzID09IENTNDZYWF9GUkFHUykgewogCQlpZiAocnVudGlt ZS0+ZG1hX2FyZWEgIT0gY2hpcC0+Y2FwdC5od19hcmVhKQogCQkJc25kX3BjbV9saWJfZnJl ZV9wYWdlcyhzdWJzdHJlYW0pOwpAQCAtMTEzMCw2ICsxMTQ3LDcgQEAKIAkJCXJldHVybiBl cnI7CiAJCXN1YnN0cmVhbS0+b3BzID0gJnNuZF9jczQ2eHhfY2FwdHVyZV9pbmRpcmVjdF9v cHM7CiAJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExNDMsNiArMTE2MSw3IEBACiAJcnVu dGltZS0+ZG1hX2FyZWEgPSBOVUxMOwogCXJ1bnRpbWUtPmRtYV9hZGRyID0gMDsKIAlydW50 aW1lLT5kbWFfYnl0ZXMgPSAwOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExNTgsNiArMTE3 Nyw3IEBACiAJY2hpcC0+Y2FwdC5od19kYXRhID0gY2hpcC0+Y2FwdC5od19pbyA9IGNoaXAt PmNhcHQuaHdfcmVhZHkgPSAwOwogCWNoaXAtPmNhcHQuYXBwbF9wdHIgPSAwOwogCXNuZF9j czQ2eHhfc2V0X2NhcHR1cmVfc2FtcGxlX3JhdGUoY2hpcCwgcnVudGltZS0+cmF0ZSk7CisK IAlyZXR1cm4gMDsKIH0KIApAQCAtMTE4Myw2ICsxMjAzLDcgQEAKIAogI2lmZGVmIENPTkZJ R19TTkRfQ1M0NlhYX05FV19EU1AKIAlzdGF0dXMyID0gc25kX2NzNDZ4eF9wZWVrQkEwKGNo aXAsIEJBMF9IU1IwKTsKKwogCWZvciAoaSA9IDA7IGkgPCBEU1BfTUFYX1BDTV9DSEFOTkVM UzsgKytpKSB7CiAJCWlmIChpIDw9IDE1KSB7CiAJCQlpZiAoIHN0YXR1czEgJiAoMSA8PCBp KSApIHsKQEAgLTEyMTMsNiArMTIzNCw3IEBACiAJX2ludmFsaWRfcG9pbnRlcjoKIAkJcHJp bnRrIChLRVJOX0VSUiAiY3M0Nnh4OiAoaW50ZXJydXB0KSBpbnZhbGlkIHBvaW50ZXIgYXQg cGNtX2NoYW5uZWxbJWRdXG4iLGkpOwogCX0KKwogI2Vsc2UKIAkvKiBvbGQgZHNwICovCiAJ aWYgKChzdGF0dXMxICYgSElTUl9WQzApICYmIGNoaXAtPnBsYXliYWNrX3BjbSkgewpAQCAt MTMyNCwyNCArMTM0NiwyNyBAQAogCiAJY3BjbS0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOwog I2lmZGVmIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AKKyAgICBkb3duICgmY2hpcC0+c3Bv c19tdXRleCk7CiAJY3BjbS0+cGNtX2NoYW5uZWwgPSBjczQ2eHhfZHNwX2NyZWF0ZV9wY21f Y2hhbm5lbCAoY2hpcCwgcnVudGltZS0+cmF0ZSwgY3BjbSwgY3BjbS0+aHdfYWRkcik7CiAK IAlpZiAoY3BjbS0+cGNtX2NoYW5uZWwgPT0gTlVMTCkgewogCQlzbmRfcHJpbnRrKEtFUk5f RVJSICJjczQ2eHg6IGZhaWxlZCB0byBjcmVhdGUgdmlydHVhbCBQQ00gY2hhbm5lbFxuIik7 CiAJCXNuZF9mcmVlX3BjaV9wYWdlcyhjaGlwLT5wY2ksIGNwY20tPmh3X3NpemUsIGNwY20t Pmh3X2FyZWEsIGNwY20tPmh3X2FkZHIpOwogCQlzbmRfbWFnaWNfa2ZyZWUoY3BjbSk7Cisg ICAgICAgIHVwICgmY2hpcC0+c3Bvc19tdXRleCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0K IAotCWNzNDZ4eF9kc3BfcGNtX3VubGluayAoY2hpcCxjcGNtLT5wY21fY2hhbm5lbCk7Cisg ICAgdXAgKCZjaGlwLT5zcG9zX211dGV4KTsKICNlbHNlCiAJY2hpcC0+cGxheWJhY2tfcGNt ID0gY3BjbTsgLyogSEFDSyAqLwogI2VuZGlmCiAKIAlpZiAoY2hpcC0+YWNjZXB0X3ZhbGlk KQotCQlzdWJzdHJlYW0tPnJ1bnRpbWUtPmh3LmluZm8gfD0gU05EUlZfUENNX0lORk9fTU1B UF9WQUxJRDsKKyAgICAgIHN1YnN0cmVhbS0+cnVudGltZS0+aHcuaW5mbyB8PSBTTkRSVl9Q Q01fSU5GT19NTUFQX1ZBTElEOwogCWNoaXAtPmFjdGl2ZV9jdHJsKGNoaXAsIDEpOwogCWNo aXAtPmFtcGxpZmllcl9jdHJsKGNoaXAsIDEpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEz NTMsMTAgKzEzNzgsMTMgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJY2hpcC0+Y2FwdC5zdWJz dHJlYW0gPSBzdWJzdHJlYW07CiAJc3Vic3RyZWFtLT5ydW50aW1lLT5odyA9IHNuZF9jczQ2 eHhfY2FwdHVyZTsKKwogCWlmIChjaGlwLT5hY2NlcHRfdmFsaWQpCi0JCXN1YnN0cmVhbS0+ cnVudGltZS0+aHcuaW5mbyB8PSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEOworICAgICAg c3Vic3RyZWFtLT5ydW50aW1lLT5ody5pbmZvIHw9IFNORFJWX1BDTV9JTkZPX01NQVBfVkFM SUQ7CisKIAljaGlwLT5hY3RpdmVfY3RybChjaGlwLCAxKTsKIAljaGlwLT5hbXBsaWZpZXJf Y3RybChjaGlwLCAxKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xMzY5LDEwICsxMzk3LDEy IEBACiAJY3BjbSA9IHNuZF9tYWdpY19jYXN0KGNzNDZ4eF9wY21fdCwgcnVudGltZS0+cHJp dmF0ZV9kYXRhLCByZXR1cm4gLUVOWElPKTsKIAogI2lmZGVmIENPTkZJR19TTkRfQ1M0NlhY X05FV19EU1AKKyAgICBkb3duICgmY2hpcC0+c3Bvc19tdXRleCk7CiAJaWYgKGNwY20tPnBj bV9jaGFubmVsKSB7CiAJCWNzNDZ4eF9kc3BfZGVzdHJveV9wY21fY2hhbm5lbChjaGlwLGNw Y20tPnBjbV9jaGFubmVsKTsKIAkJY3BjbS0+cGNtX2NoYW5uZWwgPSBOVUxMOwogCX0KKyAg ICB1cCAoJmNoaXAtPnNwb3NfbXV0ZXgpOwogI2Vsc2UKIAljaGlwLT5wbGF5YmFja19wY20g PSBOVUxMOwogI2VuZGlmCkBAIC0xMzgxLDYgKzE0MTEsNyBAQAogCXNuZF9mcmVlX3BjaV9w YWdlcyhjaGlwLT5wY2ksIGNwY20tPmh3X3NpemUsIGNwY20tPmh3X2FyZWEsIGNwY20tPmh3 X2FkZHIpOwogCWNoaXAtPmFjdGl2ZV9jdHJsKGNoaXAsIC0xKTsKIAljaGlwLT5hbXBsaWZp ZXJfY3RybChjaGlwLCAtMSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTM5Miw2ICsxNDIz LDcgQEAKIAlzbmRfZnJlZV9wY2lfcGFnZXMoY2hpcC0+cGNpLCBjaGlwLT5jYXB0Lmh3X3Np emUsIGNoaXAtPmNhcHQuaHdfYXJlYSwgY2hpcC0+Y2FwdC5od19hZGRyKTsKIAljaGlwLT5h Y3RpdmVfY3RybChjaGlwLCAtMSk7CiAJY2hpcC0+YW1wbGlmaWVyX2N0cmwoY2hpcCwgLTEp OworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE1NDksNyArMTU4MSw4IEBACiAJCQljaGlwLT5k c3Bfc3Bvc19pbnN0YW5jZS0+c3BkaWZfaW5wdXRfdm9sdW1lID0gdmFsOwogCQl9CiAjZW5k aWYKLQl9CisgICAgfQorCiAJcmV0dXJuIGNoYW5nZTsKIH0KIApAQCAtMTU3NSw2ICsxNjA4 LDcgQEAKIAkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBjaGlwLT5kc3Bf c3Bvc19pbnN0YW5jZS0+c3BkaWZfc3RhdHVzX291dDsKIAllbHNlCiAJCXVjb250cm9sLT52 YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2UtPnNwZGlm X3N0YXR1c19pbjsKKwogCXJldHVybiAwOwogfQogCkBAIC0xNzE5LDcgKzE3NTMsNiBAQAog CiAjZW5kaWYgLyogQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUCAqLwogCi0KICNpZmRlZiBD T05GSUdfU05EX0NTNDZYWF9ERUJVR19HUElPCiBzdGF0aWMgaW50IHNuZF9jczQ2eHhfZWdw aW9fc2VsZWN0X2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCAKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfY3RsX2VsZW1faW5mb190ICp1aW5m bykKQEAgLTE5NzksNiArMjAxMiw3IEBACiAgICAgCiAJLyogYWRkIGNzNDYzMCBtaXhlciBj b250cm9scyAqLwogIF9lbmQ6CisKIAkvKiBkb3NvdW5kY2FyZCBzcGVjaWZpYyBtaXhlciBz ZXR1cCAqLwogCWlmIChjaGlwLT5taXhlcl9pbml0KSB7CiAJCXNuZF9wcmludGRkICgiY2Fs bGluZyBjaGlwLT5taXhlcl9pbml0KGNoaXApO1xuIik7CkBAIC0yNDQ3LDcgKzI0ODEsNyBA QAogCQljaGlwLT5hY3RpdmVfY3RybChjaGlwLCAtY2hpcC0+YW1wbGlmaWVyKTsKIAogI2lm ZGVmIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AKLQljczQ2eHhfZHNwX3Nwb3NfZGVzdHJv eShjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZSk7CisJY3M0Nnh4X2RzcF9zcG9zX2Rlc3Ryb3ko Y2hpcCk7CiAjZW5kaWYKIAlzbmRfbWFnaWNfa2ZyZWUoY2hpcCk7CiAJcmV0dXJuIDA7CkBA IC0yOTIwLDcgKzI5NTQsNiBAQAogI2VuZGlmCiB9CiAKLQogc3RhdGljIHZvaWQgaGVyY3Vs ZXNfaW5pdChjczQ2eHhfdCAqY2hpcCkgCiB7CiAJLyogZGVmYXVsdDogQU1QIG9mZiwgYW5k IFNQRElGIGlucHV0IG9wdGljYWwgKi8KQEAgLTI5MjgsNiArMjk2MSw3IEBACiAJc25kX2Nz NDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9FR1BJT1BUUiwgRUdQSU9EUl9HUE9FMCk7CiB9CiAK KwogLyoKICAqCUdhbWUgVGhlYXRyZSBYUCBjYXJkIC0gRUdQSU9bMl0gaXMgdXNlZCB0byBl bmFibGUgdGhlIGV4dGVybmFsIGFtcC4KICAqLyAKQEAgLTI5NDAsNiArMjk3NCw3IEBACiAJ Y2hpcC0+YW1wbGlmaWVyICs9IGNoYW5nZTsKIAlpZiAoY2hpcC0+YW1wbGlmaWVyICYmICFv bGQpIHsKIAkJc25kX3ByaW50ZGQgKCJIZXJjdWxlcyBhbXBsaWZpZXIgT05cbiIpOworCiAJ CXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfRUdQSU9EUiwgCiAJCQkJICAgRUdQSU9E Ul9HUE9FMiB8IHZhbDEpOyAgICAgLyogZW5hYmxlIEVHUElPMiBvdXRwdXQgKi8KIAkJc25k X2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9FR1BJT1BUUiwgCkBAIC0yOTgwLDYgKzMwMTUs NyBAQAogI2VuZGlmCiB9CiAKKwogI2lmIDAKIC8qCiAgKglVbnRlc3RlZApAQCAtMzIwOCw2 ICszMjQ0LDcgQEAKIAlpZiAoY2hpcCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAlz cGluX2xvY2tfaW5pdCgmY2hpcC0+cmVnX2xvY2spOworICAgIGluaXRfTVVURVgoJmNoaXAt PnNwb3NfbXV0ZXgpOwogCWNoaXAtPmNhcmQgPSBjYXJkOwogCWNoaXAtPnBjaSA9IHBjaTsK IAljaGlwLT5jYXB0Lmh3X3NpemUgPSBQQUdFX1NJWkU7CmRpZmYgLU5hdXIgLS1leGNsdWRl PW1vZC1kZXBzLmMgLS1leGNsdWRlPUVudHJpZXMgLS1leGNsdWRlPU1ha2VmaWxlIC4uL2N2 c19yZWYvYWxzYS1rZXJuZWwvcGNpL2NzNDZ4eC9jczQ2eHhfbGliLmggYWxzYS1rZXJuZWwv cGNpL2NzNDZ4eC9jczQ2eHhfbGliLmgKLS0tIC4uL2N2c19yZWYvYWxzYS1rZXJuZWwvcGNp L2NzNDZ4eC9jczQ2eHhfbGliLmgJVHVlIEF1ZyAyMCAwODowNTozOSAyMDAyCisrKyBhbHNh LWtlcm5lbC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuaAlUdWUgQXVnIDIwIDIxOjUyOjQ3IDIw MDIKQEAgLTI4LDExICsyOCwxMSBAQAogICogIGNvbnN0YW50cwogICovCiAKLSNkZWZpbmUg Q1M0NlhYX0JBMF9TSVpFCQkweDEwMDAKLSNkZWZpbmUgQ1M0NlhYX0JBMV9EQVRBMF9TSVpF CTB4MzAwMAotI2RlZmluZSBDUzQ2WFhfQkExX0RBVEExX1NJWkUJMHgzODAwCi0jZGVmaW5l IENTNDZYWF9CQTFfUFJHX1NJWkUJMHg3MDAwCi0jZGVmaW5lIENTNDZYWF9CQTFfUkVHX1NJ WkUJMHgwMTAwCisjZGVmaW5lIENTNDZYWF9CQTBfU0laRQkJICAweDEwMDAKKyNkZWZpbmUg Q1M0NlhYX0JBMV9EQVRBMF9TSVpFIDB4MzAwMAorI2RlZmluZSBDUzQ2WFhfQkExX0RBVEEx X1NJWkUgMHgzODAwCisjZGVmaW5lIENTNDZYWF9CQTFfUFJHX1NJWkUJICAweDcwMDAKKyNk ZWZpbmUgQ1M0NlhYX0JBMV9SRUdfU0laRQkgIDB4MDEwMAogCiAKICNkZWZpbmUgQ1M0NlhY X1BFUklPRF9TSVpFIDIwNDgKQEAgLTg0LDcgKzg0LDcgQEAKIH0KIAogZHNwX3Nwb3NfaW5z dGFuY2VfdCAqICBjczQ2eHhfZHNwX3Nwb3NfY3JlYXRlIChjczQ2eHhfdCAqIGNoaXApOwot dm9pZCAgICAgICAgICAgICAgICAgICBjczQ2eHhfZHNwX3Nwb3NfZGVzdHJveSAoZHNwX3Nw b3NfaW5zdGFuY2VfdCAqIGluc3RhbmNlKTsKK3ZvaWQgICAgICAgICAgICAgICAgICAgY3M0 Nnh4X2RzcF9zcG9zX2Rlc3Ryb3kgKGNzNDZ4eF90ICogY2hpcCk7CiBpbnQgICAgICAgICAg ICAgICAgICAgIGNzNDZ4eF9kc3BfbG9hZF9tb2R1bGUgKGNzNDZ4eF90ICogY2hpcCxkc3Bf bW9kdWxlX2Rlc2NfdCAqIG1vZHVsZSk7CiBzeW1ib2xfZW50cnlfdCAqICAgICAgIGNzNDZ4 eF9kc3BfbG9va3VwX3N5bWJvbCAoY3M0Nnh4X3QgKiBjaGlwLGNoYXIgKiBzeW1ib2xfbmFt ZSxpbnQgc3ltYm9sX3R5cGUpOwogc3ltYm9sX2VudHJ5X3QgKiAgICAgICBjczQ2eHhfZHNw X2xvb2t1cF9zeW1ib2xfYWRkciAoY3M0Nnh4X3QgKiBjaGlwLHUzMiBhZGRyZXNzLGludCBz eW1ib2xfdHlwZSk7CmRpZmYgLU5hdXIgLS1leGNsdWRlPW1vZC1kZXBzLmMgLS1leGNsdWRl PUVudHJpZXMgLS1leGNsdWRlPU1ha2VmaWxlIC4uL2N2c19yZWYvYWxzYS1rZXJuZWwvcGNp L2NzNDZ4eC9kc3Bfc3Bvcy5jIGFsc2Eta2VybmVsL3BjaS9jczQ2eHgvZHNwX3Nwb3MuYwot LS0gLi4vY3ZzX3JlZi9hbHNhLWtlcm5lbC9wY2kvY3M0Nnh4L2RzcF9zcG9zLmMJVHVlIEF1 ZyAyMCAwODowNTozOSAyMDAyCisrKyBhbHNhLWtlcm5lbC9wY2kvY3M0Nnh4L2RzcF9zcG9z LmMJVGh1IEF1ZyAyMiAyMTo0NDoyMiAyMDAyCkBAIC0yMjEsMTYgKzIyMSwxMyBAQAogCQly ZXR1cm4gTlVMTDsKIAltZW1zZXQoaW5zLCAwLCBzaXplb2YoKmlucykpOwogCi0JaW5pdF9N VVRFWCgmaW5zLT5zY2JfbXV0ZXgpOwotCWluaXRfTVVURVgoJmlucy0+cGNtX211dGV4KTsK LQogCS8qIGJldHRlciB0byB1c2Ugdm1hbGxvYyBmb3IgdGhpcyBiaWcgdGFibGUgKi8KIAlp bnMtPnN5bWJvbF90YWJsZS5uc3ltYm9scyA9IDA7CiAJaW5zLT5zeW1ib2xfdGFibGUuc3lt Ym9scyA9IHZtYWxsb2Moc2l6ZW9mKHN5bWJvbF9lbnRyeV90KSAqIERTUF9NQVhfU1lNQk9M Uyk7CiAJaW5zLT5zeW1ib2xfdGFibGUuaGlnaGVzdF9mcmFnX2luZGV4ID0gMDsKIAogCWlm IChpbnMtPnN5bWJvbF90YWJsZS5zeW1ib2xzID09IE5VTEwpIHsKLQkJY3M0Nnh4X2RzcF9z cG9zX2Rlc3Ryb3koaW5zKTsKKwkJY3M0Nnh4X2RzcF9zcG9zX2Rlc3Ryb3koY2hpcCk7CiAJ CXJldHVybiBOVUxMOwogCX0KIApAQCAtMjM5LDcgKzIzNiw3IEBACiAJaW5zLT5jb2RlLmRh dGEgPSBrbWFsbG9jKERTUF9DT0RFX0JZVEVfU0laRSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAo aW5zLT5jb2RlLmRhdGEgPT0gTlVMTCkgewotCQljczQ2eHhfZHNwX3Nwb3NfZGVzdHJveShp bnMpOworCQljczQ2eHhfZHNwX3Nwb3NfZGVzdHJveShjaGlwKTsKIAkJcmV0dXJuIE5VTEw7 CiAJfQogCkBAIC0yNTAsNyArMjQ3LDcgQEAKIAlpbnMtPm1vZHVsZXMgPSBrbWFsbG9jKHNp emVvZihkc3BfbW9kdWxlX2Rlc2NfdCkgKiBEU1BfTUFYX01PRFVMRVMsIEdGUF9LRVJORUwp OwogCiAJaWYgKGlucy0+bW9kdWxlcyA9PSBOVUxMKSB7Ci0JCWNzNDZ4eF9kc3Bfc3Bvc19k ZXN0cm95KGlucyk7CisJCWNzNDZ4eF9kc3Bfc3Bvc19kZXN0cm95KGNoaXApOwogCQlyZXR1 cm4gTlVMTDsKIAl9CiAKQEAgLTI2NCwxOSArMjYxLDE5IEBACiAJcmV0dXJuIGluczsKIH0K IAotdm9pZCAgY3M0Nnh4X2RzcF9zcG9zX2Rlc3Ryb3kgKGRzcF9zcG9zX2luc3RhbmNlX3Qg KiBpbnMpCit2b2lkICBjczQ2eHhfZHNwX3Nwb3NfZGVzdHJveSAoY3M0Nnh4X3QgKiBjaGlw KQogewogCWludCBpOworCWRzcF9zcG9zX2luc3RhbmNlX3QgKiBpbnMgPSBjaGlwLT5kc3Bf c3Bvc19pbnN0YW5jZTsKIAogCXNuZF9hc3NlcnQoaW5zICE9IE5VTEwsIHJldHVybik7CiAK LQlkb3duKCZpbnMtPnNjYl9tdXRleCk7CisJZG93bigmY2hpcC0+c3Bvc19tdXRleCk7CiAJ Zm9yIChpID0gMDsgaSA8IGlucy0+bnNjYjsgKytpKSB7CiAJCWlmIChpbnMtPnNjYnNbaV0u ZGVsZXRlZCkgY29udGludWU7CiAKIAkJY3M0Nnh4X2RzcF9wcm9jX2ZyZWVfc2NiX2Rlc2Mg KCAoaW5zLT5zY2JzICsgaSkgKTsKIAl9Ci0JdXAoJmlucy0+c2NiX211dGV4KTsKIAogCWlm IChpbnMtPmNvZGUuZGF0YSkKIAkJa2ZyZWUoaW5zLT5jb2RlLmRhdGEpOwpAQCAtMjg1LDYg KzI4Miw3IEBACiAJaWYgKGlucy0+bW9kdWxlcykKIAkJa2ZyZWUoaW5zLT5tb2R1bGVzKTsK IAlrZnJlZShpbnMpOyAgCisJdXAoJmNoaXAtPnNwb3NfbXV0ZXgpOwogfQogCiBpbnQgY3M0 Nnh4X2RzcF9sb2FkX21vZHVsZSAoY3M0Nnh4X3QgKiBjaGlwLCBkc3BfbW9kdWxlX2Rlc2Nf dCAqIG1vZHVsZSkKQEAgLTQ3OCw2ICs0NzYsNyBAQAogCWRzcF9zcG9zX2luc3RhbmNlX3Qg KiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKIAlpbnQgaSxqOwogCisJZG93bigm Y2hpcC0+c3Bvc19tdXRleCk7CiAJc25kX2lwcmludGYoYnVmZmVyLCAiTU9EVUxFUzpcbiIp OwogCWZvciAoIGkgPSAwOyBpIDwgaW5zLT5ubW9kdWxlczsgKytpICkgewogCQlzbmRfaXBy aW50ZihidWZmZXIsICJcbiVzOlxuIiwgaW5zLT5tb2R1bGVzW2ldLm1vZHVsZV9uYW1lKTsK QEAgLTQ5MCw2ICs0ODksNyBAQAogCQkJCSAgICBkZXNjLT5zZWdtZW50X3R5cGUsZGVzYy0+ b2Zmc2V0LCBkZXNjLT5zaXplKTsKIAkJfQogCX0KKwl1cCgmY2hpcC0+c3Bvc19tdXRleCk7 CiB9CiAKIHN0YXRpYyB2b2lkIGNzNDZ4eF9kc3BfcHJvY190YXNrX3RyZWVfcmVhZCAoc25k X2luZm9fZW50cnlfdCAqZW50cnksIHNuZF9pbmZvX2J1ZmZlcl90ICogYnVmZmVyKQpAQCAt NDk5LDYgKzQ5OSw3IEBACiAJaW50IGksaixjb2w7CiAJdW5zaWduZWQgbG9uZyBkc3QgPSBj aGlwLT5yZWdpb24uaWR4WzFdLnJlbWFwX2FkZHIgKyBEU1BfUEFSQU1FVEVSX0JZVEVfT0ZG U0VUOwogCisJZG93bigmY2hpcC0+c3Bvc19tdXRleCk7CiAJc25kX2lwcmludGYoYnVmZmVy LCAiVEFTSyBUUkVFUzpcbiIpOwogCWZvciAoIGkgPSAwOyBpIDwgaW5zLT5udGFzazsgKytp KSB7CiAJCXNuZF9pcHJpbnRmKGJ1ZmZlciwiXG4lMDR4ICVzOlxuIixpbnMtPnRhc2tzW2ld LmFkZHJlc3MsaW5zLT50YXNrc1tpXS50YXNrX25hbWUpOwpAQCAtNTE1LDYgKzUxNiw3IEBA CiAJfQogCiAJc25kX2lwcmludGYoYnVmZmVyLCJcbiIpOyAgCisJdXAoJmNoaXAtPnNwb3Nf bXV0ZXgpOwogfQogCiBzdGF0aWMgdm9pZCBjczQ2eHhfZHNwX3Byb2Nfc2NiX3JlYWQgKHNu ZF9pbmZvX2VudHJ5X3QgKmVudHJ5LCBzbmRfaW5mb19idWZmZXJfdCAqIGJ1ZmZlcikKQEAg LTUyMyw2ICs1MjUsNyBAQAogCWRzcF9zcG9zX2luc3RhbmNlX3QgKiBpbnMgPSBjaGlwLT5k c3Bfc3Bvc19pbnN0YW5jZTsKIAlpbnQgaTsKIAorCWRvd24oJmNoaXAtPnNwb3NfbXV0ZXgp OwogCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlNDQidzOlxuIik7CiAJZm9yICggaSA9IDA7IGkg PCBpbnMtPm5zY2I7ICsraSkgewogCQlpZiAoaW5zLT5zY2JzW2ldLmRlbGV0ZWQpCkBAIC01 NDUsNiArNTQ4LDcgQEAKIAl9CiAKIAlzbmRfaXByaW50ZihidWZmZXIsIlxuIik7CisJdXAo JmNoaXAtPnNwb3NfbXV0ZXgpOwogfQogCiBzdGF0aWMgdm9pZCBjczQ2eHhfZHNwX3Byb2Nf cGFyYW1ldGVyX2R1bXBfcmVhZCAoc25kX2luZm9fZW50cnlfdCAqZW50cnksIHNuZF9pbmZv X2J1ZmZlcl90ICogYnVmZmVyKQpAQCAtODA4LDEyICs4MTIsMTQgQEAKIAl9CiAJaW5zLT5w cm9jX3NjYl9pbmZvX2VudHJ5ID0gZW50cnk7CiAKKwlkb3duKCZjaGlwLT5zcG9zX211dGV4 KTsKIAkvKiByZWdpc3Rlci91cGRhdGUgU0NCJ3MgZW50cmllcyBvbiBwcm9jICovCiAJZm9y IChpID0gMDsgaSA8IGlucy0+bnNjYjsgKytpKSB7CiAJCWlmIChpbnMtPnNjYnNbaV0uZGVs ZXRlZCkgY29udGludWU7CiAKIAkJY3M0Nnh4X2RzcF9wcm9jX3JlZ2lzdGVyX3NjYl9kZXNj IChjaGlwLCAoaW5zLT5zY2JzICsgaSkpOwogCX0KKwl1cCgmY2hpcC0+c3Bvc19tdXRleCk7 CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTg1MywxMiArODU5LDEyIEBACiAJCWlucy0+cHJvY190 YXNrX2luZm9fZW50cnkgPSBOVUxMOwogCX0KIAotCWRvd24oJmlucy0+c2NiX211dGV4KTsK Kwlkb3duKCZjaGlwLT5zcG9zX211dGV4KTsKIAlmb3IgKGkgPSAwOyBpIDwgaW5zLT5uc2Ni OyArK2kpIHsKIAkJaWYgKGlucy0+c2Nic1tpXS5kZWxldGVkKSBjb250aW51ZTsKIAkJY3M0 Nnh4X2RzcF9wcm9jX2ZyZWVfc2NiX2Rlc2MgKCAoaW5zLT5zY2JzICsgaSkgKTsKIAl9Ci0J dXAoJmlucy0+c2NiX211dGV4KTsKKwl1cCgmY2hpcC0+c3Bvc19tdXRleCk7CiAKIAlpZiAo aW5zLT5wcm9jX2RzcF9kaXIpIHsKIAkJc25kX2luZm9fdW5yZWdpc3RlciAoaW5zLT5wcm9j X2RzcF9kaXIpOwpAQCAtOTI5LDYgKzkzNSw3IEBACiAJaW5zLT5zY2JzW2luZGV4XS5wcm9j X2luZm8gPSBOVUxMOwogCWlucy0+c2Nic1tpbmRleF0ucmVmX2NvdW50ID0gMTsKIAlpbnMt PnNjYnNbaW5kZXhdLmRlbGV0ZWQgPSAwOworCXNwaW5fbG9ja19pbml0KCZpbnMtPnNjYnNb aW5kZXhdLmxvY2spOwogCiAJZGVzYyA9IChpbnMtPnNjYnMgKyBpbmRleCk7CiAJaW5zLT5z Y2JzW2luZGV4XS5zY2Jfc3ltYm9sID0gYWRkX3N5bWJvbCAoY2hpcCwgbmFtZSwgZGVzdCwg U1lNQk9MX1BBUkFNRVRFUik7CkBAIC0xMzEyLDkgKzEzMTksMTEgQEAKIAkJCQkJCQkgICAg IGNvZGVjX291dF9zY2IsCiAJCQkJCQkJICAgICBzZWNfY29kZWNfb3V0X3NjYiwKIAkJCQkJ CQkgICAgIFNDQl9PTl9QQVJFTlRfU1VCTElTVF9TQ0IpOworCiAJaWYgKCFtYWdpY19zbm9v cF9zY2IpIGdvdG8gX2ZhaWxfZW5kOwogCWlucy0+cmVmX3Nub29wX3NjYiA9IG1hZ2ljX3Nu b29wX3NjYjsKIAorCiAJLyogVGhlIGFzeW5jaC4gdHJhbnNmZXIgdGFzayAqLwogCWFzeW5j aF90eF9zY2IgPSBjczQ2eHhfZHNwX2NyZWF0ZV9hc3luY2hfZmdfdHhfc2NiKGNoaXAsIkFz eW5jaEZHVHhTQ0IiLEFTWU5DVFhfU0NCX0FERFIsCiAJCQkJCQkJICAgU1BESUZPX1NDQl9J TlNULApAQCAtMTMzNiw3ICsxMzQ1LDcgQEAKIAlpZiAoIWNzNDZ4eF9kc3BfY3JlYXRlX3Nw aW9fd3JpdGVfc2NiKGNoaXAsIlNQSU9Xcml0ZVNDQiIsU1BJT1dSSVRFX1NDQl9BRERSLAog CQkJCQkgICAgICBhc3luY2hfdHhfc2NiLAogCQkJCQkgICAgICBTQ0JfT05fUEFSRU5UX05F WFRfU0NCKSkKLQkJZ290byBfZmFpbF9lbmQ7CisgICAgICBnb3RvIF9mYWlsX2VuZDsKIAog CiAJLyogU1BESUYgaW5wdXQgc2FtcGVsIHJhdGUgY29udmVydGVyICovCkBAIC0xNTY5LDEy ICsxNTc4LDE0IEBACiAJZHNwX3Nwb3NfaW5zdGFuY2VfdCAqIGlucyA9IGNoaXAtPmRzcF9z cG9zX2luc3RhbmNlOwogCXVuc2lnbmVkIGludCBmbGFnczsKIAotCS8qIHR1cm4gb24gYW1w bGlmaWVyICovCisgICAgLyogdHVybiBvbiBhbXBsaWZpZXIgKi8KIAljaGlwLT5hY3RpdmVf Y3RybChjaGlwLCAxKTsKIAljaGlwLT5hbXBsaWZpZXJfY3RybChjaGlwLCAxKTsKIAogCXNu ZF9hc3NlcnQgKGlucy0+YXN5bmNoX3J4X3NjYiA9PSBOVUxMLHJldHVybiAtRUlOVkFMKTsK IAlzbmRfYXNzZXJ0IChpbnMtPnNwZGlmX2luX3NyYyAhPSBOVUxMLHJldHVybiAtRUlOVkFM KTsKKworCWRvd24oJmNoaXAtPnNwb3NfbXV0ZXgpOwogCS8qIGNyZWF0ZSBhbmQgc3RhcnQg dGhlIGFzeW5jaHJvbm91cyByZWNlaXZlciBTQ0IgKi8KIAlpbnMtPmFzeW5jaF9yeF9zY2Ig PSBjczQ2eHhfZHNwX2NyZWF0ZV9hc3luY2hfZmdfcnhfc2NiKGNoaXAsIkFzeW5jaEZHUnhT Q0IiLAogCQkJCQkJCQlBU1lOQ1JYX1NDQl9BRERSLApAQCAtMTU4NSw2ICsxNTk2LDcgQEAK IAogCXNhdmVfZmxhZ3MoZmxhZ3MpOwogCWNsaSgpOworCiAJLyogcmVzZXQgU1BESUYgaW5w dXQgc2FtcGxlIGJ1ZmZlciBwb2ludGVyICovCiAJc25kX2NzNDZ4eF9wb2tlIChjaGlwLCAo U1BESUZJX1NDQl9JTlNUICsgMHgwYykgPDwgMiwKIAkJCSAoU1BESUZJX0lQX09VVFBVVF9C VUZGRVIxIDw8IDB4MTApIHwgMHhGRkZDKTsKQEAgLTE2MDQsNiArMTYxNiw3IEBACiAKIAkv KiBtb25pdG9yIHN0YXRlICovCiAJaW5zLT5zcGRpZl9zdGF0dXNfaW4gPSAxOworCXVwKCZj aGlwLT5zcG9zX211dGV4KTsKIAogCXJldHVybiAwOwogfQpAQCAtMTYxMiwxNyArMTYyNSwx OSBAQAogewogCWRzcF9zcG9zX2luc3RhbmNlX3QgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19p bnN0YW5jZTsKIAotCXNuZF9hc3NlcnQgKGlucy0+YXN5bmNoX3J4X3NjYiAhPSBOVUxMLCBy ZXR1cm4gLUVJTlZBTCk7Ci0Jc25kX2Fzc2VydCAoaW5zLT5zcGRpZl9pbl9zcmMgIT0gTlVM TCxyZXR1cm4gLUVJTlZBTCk7CisgICAgc25kX2Fzc2VydCAoaW5zLT5hc3luY2hfcnhfc2Ni ICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKyAgICBzbmRfYXNzZXJ0IChpbnMtPnNwZGlm X2luX3NyYyAhPSBOVUxMLHJldHVybiAtRUlOVkFMKTsKIAotCS8qIFJlbW92ZSB0aGUgYXN5 bmNocm9ub3VzIHJlY2VpdmVyIFNDQiAqLwotCWNzNDZ4eF9kc3BfcmVtb3ZlX3NjYiAoY2hp cCxpbnMtPmFzeW5jaF9yeF9zY2IpOwotCWlucy0+YXN5bmNoX3J4X3NjYiA9IE5VTEw7CisJ ZG93bigmY2hpcC0+c3Bvc19tdXRleCk7CisgICAgLyogUmVtb3ZlIHRoZSBhc3luY2hyb25v dXMgcmVjZWl2ZXIgU0NCICovCisgICAgY3M0Nnh4X2RzcF9yZW1vdmVfc2NiIChjaGlwLGlu cy0+YXN5bmNoX3J4X3NjYik7CisgICAgaW5zLT5hc3luY2hfcnhfc2NiID0gTlVMTDsKIAog CWNzNDZ4eF9zcmNfdW5saW5rKGNoaXAsaW5zLT5zcGRpZl9pbl9zcmMpOwogCiAJLyogbW9u aXRvciBzdGF0ZSAqLwogCWlucy0+c3BkaWZfc3RhdHVzX2luID0gMDsKKwl1cCgmY2hpcC0+ c3Bvc19tdXRleCk7CiAKIAkvKiByZXN0b3JlIGFtcGxpZmllciAqLwogCWNoaXAtPmFjdGl2 ZV9jdHJsKGNoaXAsIC0xKTsKQEAgLTE2MzgsOSArMTY1MywxMSBAQAogCXNuZF9hc3NlcnQg KGlucy0+cGNtX2lucHV0ID09IE5VTEwscmV0dXJuIC1FSU5WQUwpOwogCXNuZF9hc3NlcnQg KGlucy0+cmVmX3Nub29wX3NjYiAhPSBOVUxMLHJldHVybiAtRUlOVkFMKTsKIAorICAgIGRv d24oJmNoaXAtPnNwb3NfbXV0ZXgpOwogCWlucy0+cGNtX2lucHV0ID0gY3M0Nnh4X2FkZF9y ZWNvcmRfc291cmNlKGNoaXAsaW5zLT5yZWZfc25vb3Bfc2NiLFBDTVNFUklBTElOX1BDTV9T Q0JfQUREUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIlBDTVNlcmlhbElucHV0X1dhdmUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgdXAoJmNoaXAtPnNwb3NfbXV0ZXgp OworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2NTAsOCArMTY2NywxMCBAQAogCiAJc25kX2Fz c2VydCAoaW5zLT5wY21faW5wdXQgIT0gTlVMTCxyZXR1cm4gLUVJTlZBTCk7CiAKKyAgICBk b3duKCZjaGlwLT5zcG9zX211dGV4KTsKIAljczQ2eHhfZHNwX3JlbW92ZV9zY2IgKGNoaXAs aW5zLT5wY21faW5wdXQpOwogCWlucy0+cGNtX2lucHV0ID0gTlVMTDsKKyAgICB1cCgmY2hp cC0+c3Bvc19tdXRleCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE2NjMsOSArMTY4MiwxMSBA QAogCXNuZF9hc3NlcnQgKGlucy0+YWRjX2lucHV0ID09IE5VTEwscmV0dXJuIC1FSU5WQUwp OwogCXNuZF9hc3NlcnQgKGlucy0+Y29kZWNfaW5fc2NiICE9IE5VTEwscmV0dXJuIC1FSU5W QUwpOwogCisgICAgZG93bigmY2hpcC0+c3Bvc19tdXRleCk7CiAJaW5zLT5hZGNfaW5wdXQg PSBjczQ2eHhfYWRkX3JlY29yZF9zb3VyY2UoY2hpcCxpbnMtPmNvZGVjX2luX3NjYixQQ01T RVJJQUxJTl9TQ0JfQUREUiwKIAkJCQkJCSAgIlBDTVNlcmlhbElucHV0X0FEQyIpOwotICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB1 cCgmY2hpcC0+c3Bvc19tdXRleCk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTY3NSw4ICsx Njk2LDEwIEBACiAKIAlzbmRfYXNzZXJ0IChpbnMtPmFkY19pbnB1dCAhPSBOVUxMLHJldHVy biAtRUlOVkFMKTsKIAorICAgIGRvd24oJmNoaXAtPnNwb3NfbXV0ZXgpOwogCWNzNDZ4eF9k c3BfcmVtb3ZlX3NjYiAoY2hpcCxpbnMtPmFkY19pbnB1dCk7CiAJaW5zLT5hZGNfaW5wdXQg PSBOVUxMOworICAgIHVwKCZjaGlwLT5zcG9zX211dGV4KTsKIAogCXJldHVybiAwOwogfQpA QCAtMTY5Niw3ICsxNzE5LDcgQEAKIAogCXNuZF9jczQ2eHhfcG9rZShjaGlwLCggU1BJT1dS SVRFX1NDQl9BRERSICAgICAgPDwgMiksIHRlbXApOwogCXNuZF9jczQ2eHhfcG9rZShjaGlw LCgoU1BJT1dSSVRFX1NDQl9BRERSICsgMSkgPDwgMiksIGRhdGEpOyAvKiBvZmZzZXQgMSA8 LS0gZGF0YTEgKi8KLQlzbmRfY3M0Nnh4X3Bva2UoY2hpcCwoKFNQSU9XUklURV9TQ0JfQURE UiArIDIpIDw8IDIpLCBkYXRhKTsgLyogb2Zmc2V0IDEgPC0tIGRhdGEyKi8KKwlzbmRfY3M0 Nnh4X3Bva2UoY2hpcCwoKFNQSU9XUklURV9TQ0JfQUREUiArIDIpIDw8IDIpLCBkYXRhKTsg Lyogb2Zmc2V0IDEgPC0tIGRhdGEyICovCiAgICAgCiAJLyogUG9rZSB0aGlzIGxvY2F0aW9u IHRvIHRlbGwgdGhlIHRhc2sgdG8gc3RhcnQgKi8KIAlzbmRfY3M0Nnh4X3Bva2UoY2hpcCwo KFNQSU9XUklURV9TQ0JfQUREUiArIDYpIDw8IDIpLCBTUElPV1JJVEVfU0NCX0FERFIgPDwg MHgxMCk7CmRpZmYgLU5hdXIgLS1leGNsdWRlPW1vZC1kZXBzLmMgLS1leGNsdWRlPUVudHJp ZXMgLS1leGNsdWRlPU1ha2VmaWxlIC4uL2N2c19yZWYvYWxzYS1rZXJuZWwvcGNpL2NzNDZ4 eC9kc3Bfc3Bvc19zY2JfbGliLmMgYWxzYS1rZXJuZWwvcGNpL2NzNDZ4eC9kc3Bfc3Bvc19z Y2JfbGliLmMKLS0tIC4uL2N2c19yZWYvYWxzYS1rZXJuZWwvcGNpL2NzNDZ4eC9kc3Bfc3Bv c19zY2JfbGliLmMJVHVlIEF1ZyAyMCAwODowNTozOSAyMDAyCisrKyBhbHNhLWtlcm5lbC9w Y2kvY3M0Nnh4L2RzcF9zcG9zX3NjYl9saWIuYwlUaHUgQXVnIDIyIDIyOjQ3OjI5IDIwMDIK QEAgLTc1LDcgKzc1LDcgQEAKIAogCWlucyA9IGNoaXAtPmRzcF9zcG9zX2luc3RhbmNlOwog Ci0JZG93bigmaW5zLT5zY2JfbXV0ZXgpOworCWRvd24oJmNoaXAtPnNwb3NfbXV0ZXgpOwog CXNuZF9pcHJpbnRmKGJ1ZmZlciwiJTA0eCAlczpcbiIsc2NiLT5hZGRyZXNzLHNjYi0+c2Ni X25hbWUpOwogCiAJZm9yIChjb2wgPSAwLGogPSAwO2ogPCAweDEwOyBqKyssY29sKyspIHsK QEAgLTEwMyw3ICsxMDMsNyBAQAogCQkgICAgc2NiLT50YXNrX2VudHJ5LT5hZGRyZXNzKTsK IAogCXNuZF9pcHJpbnRmKGJ1ZmZlciwiaW5kZXggWyVkXSByZWZfY291bnQgWyVkXVxuIixz Y2ItPmluZGV4LHNjYi0+cmVmX2NvdW50KTsgIAotCXVwKCZpbnMtPnNjYl9tdXRleCk7CisJ dXAoJmNoaXAtPnNwb3NfbXV0ZXgpOwogfQogCiBzdGF0aWMgdm9pZCBfZHNwX3VubGlua19z Y2IgKGNzNDZ4eF90ICpjaGlwLGRzcF9zY2JfZGVzY3JpcHRvcl90ICogc2NiKQpAQCAtMTgw LDExICsxODAsMTAgQEAKIHsKIAlkc3Bfc3Bvc19pbnN0YW5jZV90ICogaW5zID0gY2hpcC0+ ZHNwX3Nwb3NfaW5zdGFuY2U7CiAKLQlkb3duKCZpbnMtPnNjYl9tdXRleCk7CiAJLyogY2hl Y2sgaW50ZWdyZXR5ICovCiAJc25kX2Fzc2VydCAoIChzY2ItPmluZGV4ID49IDAgJiYgCiAJ CSAgICAgIHNjYi0+aW5kZXggPCBpbnMtPm5zY2IgJiYgCi0JCSAgICAgIChpbnMtPnNjYnMg KyBzY2ItPmluZGV4KSA9PSBzY2IpLCBnb3RvIF9lbmQgKTsKKwkJICAgICAgKGlucy0+c2Ni cyArIHNjYi0+aW5kZXgpID09IHNjYiksIHJldHVybiApOwogCiAjaWYgMAogCS8qIGNhbnQg cmVtb3ZlIGEgU0NCIHdpdGggY2hpbGRzIGJlZm9yZSAKQEAgLTE5NCwxMCArMTkzLDEyIEBA CiAJCSAgICAgZ290byBfZW5kKTsKICNlbmRpZgogCisgICAgc3Bpbl9sb2NrKCZzY2ItPmxv Y2spOwogCV9kc3BfdW5saW5rX3NjYiAoY2hpcCxzY2IpOwotICAKKyAgICBzcGluX3VubG9j aygmc2NiLT5sb2NrKTsKKwogCWNzNDZ4eF9kc3BfcHJvY19mcmVlX3NjYl9kZXNjKHNjYik7 Ci0Jc25kX2Fzc2VydCAoc2NiLT5zY2Jfc3ltYm9sICE9IE5VTEwsIGdvdG8gX2VuZCk7CisJ c25kX2Fzc2VydCAoc2NiLT5zY2Jfc3ltYm9sICE9IE5VTEwsIHJldHVybiApOwogCXJlbW92 ZV9zeW1ib2wgKGNoaXAsc2NiLT5zY2Jfc3ltYm9sKTsKIAogCWlucy0+c2Nic1tzY2ItPmlu ZGV4XS5kZWxldGVkID0gMTsKQEAgLTIxOSwxMSArMjIwLDYgQEAKIAkJaW5zLT5zY2JzW2kg LSAxXS5pbmRleCA9IGkgLSAxOwogCX0KICNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1NORF9E RUJVRwotIF9lbmQ6Ci0jZW5kaWYKLQl1cCgmaW5zLT5zY2JfbXV0ZXgpOwogfQogCiAKQEAg LTI0OCw3ICsyNDQsNiBAQAogCXNuZF9pbmZvX2VudHJ5X3QgKiBlbnRyeTsKIAlwcm9jX3Nj Yl9pbmZvX3QgKiBzY2JfaW5mbzsKIAotCWRvd24oJmlucy0+c2NiX211dGV4KTsKIAkvKiBy ZWdpc3RlciB0byBwcm9jICovCiAJaWYgKGlucy0+c25kX2NhcmQgIT0gTlVMTCAmJiBpbnMt PnByb2NfZHNwX2RpciAhPSBOVUxMICYmCiAJICAgIHNjYi0+cHJvY19pbmZvID09IE5VTEwp IHsKQEAgLTI3NSw3ICsyNzAsNiBAQAogCiAJCXNjYi0+cHJvY19pbmZvID0gZW50cnk7CiAJ fQotCXVwKCZpbnMtPnNjYl9tdXRleCk7CiB9CiAKIHN0YXRpYyBkc3Bfc2NiX2Rlc2NyaXB0 b3JfdCAqIApAQCAtMjg5LDggKzI4Myw3IEBACiAgIAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7 CiAKLQlkb3duKCZpbnMtPnNjYl9tdXRleCk7Ci0Jc25kX2Fzc2VydCAoaW5zLT50aGVfbnVs bF9zY2IgIT0gTlVMTCxnb3RvIF9mYWlsX2VuZCk7CisJc25kX2Fzc2VydCAoaW5zLT50aGVf bnVsbF9zY2IgIT0gTlVMTCxyZXR1cm4gTlVMTCk7CiAKIAkvKiBmaWxsIHRoZSBkYXRhIHRo YXQgd2lsbCBiZSB3cm90ZW4gdG8gRFNQICovCiAJc2NiX2RhdGFbU0NCc3ViTGlzdFB0cl0g PSAKQEAgLTMyMSwxNyArMzE0LDE3IEBACiAJCS8qIGxpbmsgdG8gIHBhcmVudCBTQ0IgKi8K IAkJaWYgKHNjYl9jaGlsZF90eXBlID09IFNDQl9PTl9QQVJFTlRfTkVYVF9TQ0IpIHsKIAkJ CXNuZF9hc3NlcnQgKCAoc2NiLT5wYXJlbnRfc2NiX3B0ci0+bmV4dF9zY2JfcHRyID09IGlu cy0+dGhlX251bGxfc2NiKSwKLQkJCQkgICAgIGdvdG8gX2ZhaWxfZW5kKTsKKwkJCQkgICAg IHJldHVybiBOVUxMKTsKIAogCQkJc2NiLT5wYXJlbnRfc2NiX3B0ci0+bmV4dF9zY2JfcHRy ID0gc2NiOwogCiAJCX0gZWxzZSBpZiAoc2NiX2NoaWxkX3R5cGUgPT0gU0NCX09OX1BBUkVO VF9TVUJMSVNUX1NDQikgewogCQkJc25kX2Fzc2VydCAoIChzY2ItPnBhcmVudF9zY2JfcHRy LT5zdWJfbGlzdF9wdHIgPT0gaW5zLT50aGVfbnVsbF9zY2IpLAotCQkJCSAgICAgZ290byBf ZmFpbF9lbmQpOworCQkJCSAgICAgcmV0dXJuIE5VTEwpOwogCiAJCQlzY2ItPnBhcmVudF9z Y2JfcHRyLT5zdWJfbGlzdF9wdHIgPSBzY2I7CiAJCX0gZWxzZSB7Ci0JCQlzbmRfYXNzZXJ0 ICgwLGdvdG8gX2ZhaWxfZW5kKTsKKwkJCXNuZF9hc3NlcnQgKDAscmV0dXJuIE5VTEwpOwog CQl9CiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CkBA IC0zNDUsMTcgKzMzOCw5IEBACiAJfQogCiAKLQl1cCgmaW5zLT5zY2JfbXV0ZXgpOwotCiAJ Y3M0Nnh4X2RzcF9wcm9jX3JlZ2lzdGVyX3NjYl9kZXNjIChjaGlwLHNjYik7CiAKIAlyZXR1 cm4gc2NiOwotI2lmZGVmIENPTkZJR19TTkRfREVCVUcKLSBfZmFpbF9lbmQ6Ci0KLQl1cCgm aW5zLT5zY2JfbXV0ZXgpOwotCXJldHVybiBOVUxMOwotI2VuZGlmCiB9CiAKIGRzcF9zY2Jf ZGVzY3JpcHRvcl90ICogCkBAIC05MTQsNiArODk5LDcgQEAKIAkJLyogVGhlcmUgaXMgbm8g Y29ycmVjdCBpbml0aWFsIHZhbHVlLCBpdCB3aWxsIGRlcGVuZCB1cG9uIHRoZSBkZXRlY3Rl ZAogCQkgICByYXRlIGV0YyAgKi8KIAkJMHgxODAwMDAwMCwgICAgICAgICAKKwogCQkvKiBN dXRlIHN0cmVhbSAqLwogCQkweDgwMDAsMHg4MDAwLCAgICAgICAKIAkJMHhmZmZmLDB4ZmZm ZgpAQCAtMTExMSwxMyArMTA5NywxMSBAQAogewogCWRzcF9zcG9zX2luc3RhbmNlX3QgKiBp bnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKIAlkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAq IHNyY19zY2IgPSBOVUxMLCogcGNtX3NjYjsKLQlkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHBj bV9wYXJlbnRfc2NiOworCS8qZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBwY21fcGFyZW50X3Nj YjsqLwogCWNoYXIgc2NiX25hbWVbRFNQX01BWF9TQ0JfTkFNRV07CiAJaW50IGkscGNtX2lu ZGV4ID0gLTEsIGluc2VydF9wb2ludCwgc3JjX2luZGV4ID0gLTE7CiAJdW5zaWduZWQgbG9u ZyBmbGFnczsKIAotCWRvd24oJmlucy0+cGNtX211dGV4KTsgCi0KIAkvKiBkZWZhdWx0IHNh bXBsZSByYXRlIGlzIDQ0MTAwICovCiAJaWYgKCFzYW1wbGVfcmF0ZSkgc2FtcGxlX3JhdGUg PSA0NDEwMDsKIApAQCAtMTE0Miw3ICsxMTI2LDcgQEAKIAogCWlmIChwY21faW5kZXggPT0g LTEpIHsKIAkJc25kX3ByaW50ayAoS0VSTl9FUlIgImRzcF9zcG9zOiBubyBmcmVlIFBDTSBj aGFubmVsXG4iKTsKLQkJZ290byBfZW5kOworCQlyZXR1cm4gTlVMTDsKIAl9CiAKIAlpZiAo c3JjX3NjYiA9PSBOVUxMKSB7CkBAIC0xMTUwLDcgKzExMzQsNyBAQAogCiAJCWlmIChpbnMt Pm5zcmNfc2NiID49IERTUF9NQVhfU1JDX05SKSB7CiAJCQlzbmRfcHJpbnRrKEtFUk5fRVJS ICJkc3Bfc3BvczogdG8gbWFueSBTUkMgaW5zdGFuY2VzXG4hIik7Ci0JCQlnb3RvIF9lbmQ7 CisJCQlyZXR1cm4gTlVMTDsKIAkJfQogCiAJCS8qIGZpbmQgYSBmcmVlIHNsb3QgKi8KQEAg LTExNjEsNyArMTE0NSw3IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KLQkJc25kX2Fzc2Vy dCAoc3JjX2luZGV4ICE9IC0xLGdvdG8gX2VuZCk7CisJCXNuZF9hc3NlcnQgKHNyY19pbmRl eCAhPSAtMSxyZXR1cm4gTlVMTCk7CiAKIAkJLyogd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcg U1JDIFNDQiAqLwogCQlpZiAoaW5zLT5tYXN0ZXJfbWl4X3NjYi0+c3ViX2xpc3RfcHRyID09 IGlucy0+dGhlX251bGxfc2NiKSB7CkBAIC0xMTg1LDMyICsxMTY5LDEzIEBACiAKIAkJaWYg KCFzcmNfc2NiKSB7CiAJCQlzbmRfcHJpbnRrIChLRVJOX0VSUiAiZHNwX3Nwb3M6IGZhaWxl ZCB0byBjcmVhdGUgU1JDdGFza1NDQlxuIik7Ci0JCQlnb3RvIF9lbmQ7CisJCQlyZXR1cm4g TlVMTDsKIAkJfQogCiAJCWNzNDZ4eF9kc3Bfc2V0X3NyY19zYW1wbGVfcmF0ZShjaGlwLHNy Y19zY2Isc2FtcGxlX3JhdGUpOwogCiAJCWlucy0+bnNyY19zY2IgKys7Ci0KLQkJLyogaW5z ZXJ0IHBvaW50IGZvciB0aGUgUENNcmVhZGVyIHRhc2sgKi8KLQkJcGNtX3BhcmVudF9zY2Ig PSBzcmNfc2NiOwotCQlpbnNlcnRfcG9pbnQgPSBTQ0JfT05fUEFSRU5UX1NVQkxJU1RfU0NC OwotCX0gZWxzZSB7Ci0gICAgICAKLSAgICAgIC8qIGlmIGNoYW5uZWwgaXMgdW5saW5rZWQg dGhlbiBzcmNfc2NiLT5zdWJfbGlzdF9wdHIgPT0gbnVsbF9zY2IsIGFuZAotICAgICAgICAg dGhhdCdzIGEgY29ycmVjdCBzdGF0ZS4KLSAgICAgICAgc25kX2Fzc2VydCAoc3JjX3NjYi0+ c3ViX2xpc3RfcHRyICE9IGlucy0+dGhlX251bGxfc2NiLCBnb3RvIF9lbmQpOyAKLSAgICAg ICovCi0gICAgICBpZiAoc3JjX3NjYi0+c3ViX2xpc3RfcHRyICE9IGlucy0+dGhlX251bGxf c2NiKSB7Ci0JCXBjbV9wYXJlbnRfc2NiID0gZmluZF9uZXh0X2ZyZWVfc2NiKGNoaXAsc3Jj X3NjYi0+c3ViX2xpc3RfcHRyKTsKLSAgICAgICAgCi0JCWluc2VydF9wb2ludCA9IFNDQl9P Tl9QQVJFTlRfTkVYVF9TQ0I7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwY21fcGFyZW50 X3NjYiA9IHNyY19zY2I7Ci0JCWluc2VydF9wb2ludCA9IFNDQl9PTl9QQVJFTlRfU1VCTElT VF9TQ0I7Ci0gICAgICB9Ci0JfQotICAKKwl9IAogICAKICAgCiAJc25wcmludGYgKHNjYl9u YW1lLERTUF9NQVhfU0NCX05BTUUsIlBDTVJlYWRlcl9TQ0IlZCIscGNtX2luZGV4KTsKQEAg LTEyMjEsMjEgKzExODYsMjIgQEAKIAkJCQkJCSAgIHBjbV9yZWFkZXJfYnVmZmVyX2FkZHJb cGNtX2luZGV4XSwKIAkJCQkJCSAgIC8qIDB4MjAwIC0gNDAwIFBDTXJlYWRlciBTQ0JzICov CiAJCQkJCQkgICAocGNtX2luZGV4ICogMHgxMCkgKyAweDIwMCwKLQkJCQkJCSAgIHBjbV9p bmRleCwgLyogdmlydHVhbCBjaGFubmVsIDAtMzEgKi8KLQkJCQkJCSAgIGh3X2RtYV9hZGRy LCAvKiBwY20gaHcgYWRkciAqLwotCQkJCQkJICAgcGNtX3BhcmVudF9zY2IsCi0JCQkJCQkg ICBpbnNlcnRfcG9pbnQpOworCQkJCQkJICAgcGNtX2luZGV4LCAgICAvKiB2aXJ0dWFsIGNo YW5uZWwgMC0zMSAqLworCQkJCQkJICAgaHdfZG1hX2FkZHIsICAvKiBwY20gaHcgYWRkciAq LworICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAvKiBwYXJlbnQg U0NCIHB0ciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAv KiBpbnNlcnQgcG9pbnQgKi8gCisgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogCiAJ aWYgKCFwY21fc2NiKSB7CiAJCXNuZF9wcmludGsgKEtFUk5fRVJSICJkc3Bfc3BvczogZmFp bGVkIHRvIGNyZWF0ZSBQQ01yZWFkZXJTQ0JcbiIpOwotCQlnb3RvIF9lbmQ7CisJCXJldHVy biBOVUxMOwogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxh Z3MpOwogCWlucy0+cGNtX2NoYW5uZWxzW3BjbV9pbmRleF0uc2FtcGxlX3JhdGUgPSBzYW1w bGVfcmF0ZTsKIAlpbnMtPnBjbV9jaGFubmVsc1twY21faW5kZXhdLnBjbV9yZWFkZXJfc2Ni ID0gcGNtX3NjYjsKIAlpbnMtPnBjbV9jaGFubmVsc1twY21faW5kZXhdLnNyY19zY2IgPSBz cmNfc2NiOwotCWlucy0+cGNtX2NoYW5uZWxzW3BjbV9pbmRleF0udW5saW5rZWQgPSAwOyAg CisJaW5zLT5wY21fY2hhbm5lbHNbcGNtX2luZGV4XS51bmxpbmtlZCA9IDE7CiAJaW5zLT5w Y21fY2hhbm5lbHNbcGNtX2luZGV4XS5wcml2YXRlX2RhdGEgPSBwcml2YXRlX2RhdGE7CiAJ aW5zLT5wY21fY2hhbm5lbHNbcGNtX2luZGV4XS5zcmNfc2xvdCA9IHNyY19pbmRleDsKIAlp bnMtPnBjbV9jaGFubmVsc1twY21faW5kZXhdLmFjdGl2ZSA9IDE7CkBAIC0xMjQzLDEyICsx MjA5LDcgQEAKIAlpbnMtPm5wY21fY2hhbm5lbHMgKys7CiAJc3Bpbl91bmxvY2tfaXJxcmVz dG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKIAotCXVwKCZpbnMtPnBjbV9tdXRleCk7 ICAKIAlyZXR1cm4gKGlucy0+cGNtX2NoYW5uZWxzICsgcGNtX2luZGV4KTsKLSBfZW5kOgot Ci0JdXAoJmlucy0+cGNtX211dGV4KTsKLQlyZXR1cm4gTlVMTDsKIH0KIAogdm9pZCBjczQ2 eHhfZHNwX2Rlc3Ryb3lfcGNtX2NoYW5uZWwgKGNzNDZ4eF90ICogY2hpcCxwY21fY2hhbm5l bF9kZXNjcmlwdG9yX3QgKiBwY21fY2hhbm5lbCkKQEAgLTEyNTYsMTEgKzEyMTcsOSBAQAog CWRzcF9zcG9zX2luc3RhbmNlX3QgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsK IAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZG93bigmaW5zLT5wY21fbXV0ZXgpOwotICAK LQlzbmRfYXNzZXJ0KHBjbV9jaGFubmVsLT5hY3RpdmUsZ290byBfZW5kKTsKLQlzbmRfYXNz ZXJ0KGlucy0+bnBjbV9jaGFubmVscyA+IDAsZ290byBfZW5kKTsKLQlzbmRfYXNzZXJ0KHBj bV9jaGFubmVsLT5zcmNfc2NiLT5yZWZfY291bnQgPiAwLGdvdG8gX2VuZCk7CisJc25kX2Fz c2VydChwY21fY2hhbm5lbC0+YWN0aXZlLCByZXR1cm4gKTsKKwlzbmRfYXNzZXJ0KGlucy0+ bnBjbV9jaGFubmVscyA+IDAsIHJldHVybiApOworCXNuZF9hc3NlcnQocGNtX2NoYW5uZWwt PnNyY19zY2ItPnJlZl9jb3VudCA+IDAsIHJldHVybiApOwogCiAJc3Bpbl9sb2NrX2lycXNh dmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CiAJcGNtX2NoYW5uZWwtPnVubGlua2VkID0g MTsKQEAgLTEyNzYsMTggKzEyMzUsMTEgQEAKIAkJY3M0Nnh4X2RzcF9yZW1vdmVfc2NiKGNo aXAscGNtX2NoYW5uZWwtPnNyY19zY2IpOwogCiAJCXNuZF9hc3NlcnQgKHBjbV9jaGFubmVs LT5zcmNfc2xvdCA+PSAwICYmIHBjbV9jaGFubmVsLT5zcmNfc2xvdCA8PSBEU1BfTUFYX1NS Q19OUiwKLQkJCSAgICBnb3RvIF9lbmQpOworCQkJICAgIHJldHVybiApOwogCiAJCWlucy0+ c3JjX3NjYl9zbG90c1twY21fY2hhbm5lbC0+c3JjX3Nsb3RdID0gMDsKIAkJaW5zLT5uc3Jj X3NjYiAtLTsKIAl9Ci0KLQotI2lmZGVmIENPTkZJR19TTkRfREVCVUcKLSBfZW5kOgotI2Vu ZGlmCi0KLQl1cCgmaW5zLT5wY21fbXV0ZXgpOwogfQogCiBpbnQgY3M0Nnh4X2RzcF9wY21f dW5saW5rIChjczQ2eHhfdCAqIGNoaXAscGNtX2NoYW5uZWxfZGVzY3JpcHRvcl90ICogcGNt X2NoYW5uZWwpCkBAIC0xMjk1LDE0ICsxMjQ3LDE1IEBACiAJZHNwX3Nwb3NfaW5zdGFuY2Vf dCAqIGlucyA9IGNoaXAtPmRzcF9zcG9zX2luc3RhbmNlOwogCXVuc2lnbmVkIGxvbmcgZmxh Z3M7CiAKLQlkb3duKCZpbnMtPnBjbV9tdXRleCk7Ci0JZG93bigmaW5zLT5zY2JfbXV0ZXgp OworCXNuZF9hc3NlcnQocGNtX2NoYW5uZWwtPmFjdGl2ZSxyZXR1cm4gLUVJTyk7CisJc25k X2Fzc2VydChpbnMtPm5wY21fY2hhbm5lbHMgPiAwLHJldHVybiAtRUlPKTsKIAotCXNuZF9h c3NlcnQocGNtX2NoYW5uZWwtPmFjdGl2ZSxnb3RvIF9lbmQpOwotCXNuZF9hc3NlcnQoaW5z LT5ucGNtX2NoYW5uZWxzID4gMCxnb3RvIF9lbmQpOworICAgIHNwaW5fbG9jaygmcGNtX2No YW5uZWwtPnNyY19zY2ItPmxvY2spOwogCi0JaWYgKHBjbV9jaGFubmVsLT51bmxpbmtlZCkK LQkJZ290byBfZW5kOworCWlmIChwY21fY2hhbm5lbC0+dW5saW5rZWQpIHsKKyAgICAgICAg c3Bpbl91bmxvY2soJnBjbV9jaGFubmVsLT5zcmNfc2NiLT5sb2NrKTsKKwkJcmV0dXJuIC1F SU87CisgICAgfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFn cyk7CiAJcGNtX2NoYW5uZWwtPnVubGlua2VkID0gMTsKQEAgLTEzMTAsMTAgKzEyNjMsNyBA QAogCiAJX2RzcF91bmxpbmtfc2NiIChjaGlwLHBjbV9jaGFubmVsLT5wY21fcmVhZGVyX3Nj Yik7CiAKLSBfZW5kOgotCXVwKCZpbnMtPnNjYl9tdXRleCk7Ci0JdXAoJmlucy0+cGNtX211 dGV4KTsKLQorICAgIHNwaW5fdW5sb2NrKCZwY21fY2hhbm5lbC0+c3JjX3NjYi0+bG9jayk7 CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzMjQsMjUgKzEyNzQsMzIgQEAKIAlkc3Bfc2NiX2Rl c2NyaXB0b3JfdCAqIHNyY19zY2IgPSBwY21fY2hhbm5lbC0+c3JjX3NjYjsKIAl1bnNpZ25l ZCBsb25nIGZsYWdzOwogCi0JZG93bigmaW5zLT5wY21fbXV0ZXgpOwotCWRvd24oJmlucy0+ c2NiX211dGV4KTsKKyAgICBzcGluX2xvY2soJnBjbV9jaGFubmVsLT5zcmNfc2NiLT5sb2Nr KTsKIAotCWlmIChwY21fY2hhbm5lbC0+dW5saW5rZWQgPT0gMCkKLQkJZ290byBfZW5kOwor CWlmIChwY21fY2hhbm5lbC0+dW5saW5rZWQgPT0gMCkgeworICAgICAgICBzcGluX3VubG9j aygmcGNtX2NoYW5uZWwtPnNyY19zY2ItPmxvY2spOworCQlyZXR1cm4gLUVJTzsKKyAgICB9 CisKKyAgICBwYXJlbnRfc2NiID0gc3JjX3NjYjsKKworICAgIGlmIChzcmNfc2NiLT5zdWJf bGlzdF9wdHIgIT0gaW5zLT50aGVfbnVsbF9zY2IpIHsKKyAgICAgIHNyY19zY2ItPnN1Yl9s aXN0X3B0ci0+cGFyZW50X3NjYl9wdHIgPSBwY21fY2hhbm5lbC0+cGNtX3JlYWRlcl9zY2I7 CisgICAgICBwY21fY2hhbm5lbC0+cGNtX3JlYWRlcl9zY2ItPm5leHRfc2NiX3B0ciA9IHNy Y19zY2ItPnN1Yl9saXN0X3B0cjsKKyAgICB9CisKKyAgICBzcmNfc2NiLT5zdWJfbGlzdF9w dHIgPSBwY21fY2hhbm5lbC0+cGNtX3JlYWRlcl9zY2I7CiAKLQlpZiAoc3JjX3NjYi0+c3Vi X2xpc3RfcHRyID09IGlucy0+dGhlX251bGxfc2NiKSB7Ci0JCXBhcmVudF9zY2IgPSBzcmNf c2NiOwotCQlwYXJlbnRfc2NiLT5zdWJfbGlzdF9wdHIgPSBwY21fY2hhbm5lbC0+cGNtX3Jl YWRlcl9zY2I7Ci0JfSBlbHNlIHsKLQkJcGFyZW50X3NjYiA9IGZpbmRfbmV4dF9mcmVlX3Nj YihjaGlwLHNyY19zY2ItPnN1Yl9saXN0X3B0cik7Ci0JCXBhcmVudF9zY2ItPm5leHRfc2Ni X3B0ciA9IHBjbV9jaGFubmVsLT5wY21fcmVhZGVyX3NjYjsKLQl9Ci0gIAogCXNuZF9hc3Nl cnQgKHBjbV9jaGFubmVsLT5wY21fcmVhZGVyX3NjYi0+cGFyZW50X3NjYl9wdHIgPT0gTlVM TCwgOyApOwogCXBjbV9jaGFubmVsLT5wY21fcmVhZGVyX3NjYi0+cGFyZW50X3NjYl9wdHIg PSBwYXJlbnRfc2NiOwogCiAJLyogdXBkYXRlIGVudHJ5IGluIERTUCBSQU0gKi8KIAlzcGlu X2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKyAgICBzbmRfY3M0Nnh4 X3Bva2UoY2hpcCwKKyAgICAgICAgICAgICAgICAgICAgKHBjbV9jaGFubmVsLT5wY21fcmVh ZGVyX3NjYi0+YWRkcmVzcyArIFNDQnN1Ykxpc3RQdHIpIDw8IDIsCisgICAgICAgICAgICAg ICAgICAgIChwY21fY2hhbm5lbC0+cGNtX3JlYWRlcl9zY2ItPnN1Yl9saXN0X3B0ci0+YWRk cmVzcyA8PCAweDEwKSB8CisgICAgICAgICAgICAgICAgICAgIChwY21fY2hhbm5lbC0+cGNt X3JlYWRlcl9zY2ItPm5leHRfc2NiX3B0ci0+YWRkcmVzcykpOworICAgIAogCXNuZF9jczQ2 eHhfcG9rZShjaGlwLAogCQkJKHBhcmVudF9zY2ItPmFkZHJlc3MgKyBTQ0JzdWJMaXN0UHRy KSA8PCAyLAogCQkJKHBhcmVudF9zY2ItPnN1Yl9saXN0X3B0ci0+YWRkcmVzcyA8PCAweDEw KSB8CkBAIC0xMzUxLDEzICsxMzA4LDExIEBACiAJcGNtX2NoYW5uZWwtPnVubGlua2VkID0g MDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwog Ci0gX2VuZDoKLQl1cCgmaW5zLT5zY2JfbXV0ZXgpOwotCXVwKCZpbnMtPnBjbV9tdXRleCk7 Ci0KKyAgICBzcGluX3VubG9jaygmcGNtX2NoYW5uZWwtPnNyY19zY2ItPmxvY2spOwogCXJl dHVybiAwOwogfQogCisKICNkZWZpbmUgR09GX1BFUl9TRUMgMjAwCiAgIAogdm9pZCBjczQ2 eHhfZHNwX3NldF9zcmNfc2FtcGxlX3JhdGUoY3M0Nnh4X3QgKmNoaXAsZHNwX3NjYl9kZXNj cmlwdG9yX3QgKiBzcmMsIHUzMiByYXRlKQpAQCAtMTQxNCw5NyArMTM2OSw3MCBAQAogCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CiB9CiAKLWRz cF9zY2JfZGVzY3JpcHRvcl90ICoKLWNzNDZ4eF9hZGRfcmVjb3JkX3NvdXJjZSAoY3M0Nnh4 X3QgKmNoaXAsZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBzb3VyY2UsCi0JCQkgIHUxNiBhZGRy LGNoYXIgKiBzY2JfbmFtZSkKLXsKK2RzcF9zY2JfZGVzY3JpcHRvcl90ICogY3M0Nnh4X2Fk ZF9yZWNvcmRfc291cmNlIChjczQ2eHhfdCAqY2hpcCxkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAq IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB1MTYgYWRkcixjaGFyICogc2NiX25hbWUpIHsKICAgCWRzcF9zcG9zX2luc3RhbmNl X3QgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKLQlkc3Bfc2NiX2Rlc2NyaXB0 b3JfdCAqIHBhcmVudDsKLQlkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHBjbV9pbnB1dDsKLQlp bnQgaW5zZXJ0X3BvaW50OwotCi0Jc25kX2Fzc2VydCAoaW5zLT5yZWNvcmRfbWl4ZXJfc2Ni ICE9IE5VTEwscmV0dXJuIE5VTEwpOwotCi0JaWYgKGlucy0+cmVjb3JkX21peGVyX3NjYi0+ c3ViX2xpc3RfcHRyICE9IGlucy0+dGhlX251bGxfc2NiKSB7Ci0JCXBhcmVudCA9IGZpbmRf bmV4dF9mcmVlX3NjYiAoY2hpcCxpbnMtPnJlY29yZF9taXhlcl9zY2ItPnN1Yl9saXN0X3B0 cik7Ci0JCWluc2VydF9wb2ludCA9IFNDQl9PTl9QQVJFTlRfTkVYVF9TQ0I7Ci0JfSBlbHNl IHsKLQkJcGFyZW50ID0gaW5zLT5yZWNvcmRfbWl4ZXJfc2NiOwotCQlpbnNlcnRfcG9pbnQg PSBTQ0JfT05fUEFSRU5UX1NVQkxJU1RfU0NCOwotCX0KKyAgICBkc3Bfc2NiX2Rlc2NyaXB0 b3JfdCAqIHBhcmVudDsKKyAgICBkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAqIHBjbV9pbnB1dDsK KyAgICBpbnQgaW5zZXJ0X3BvaW50OworCisgICAgc25kX2Fzc2VydCAoaW5zLT5yZWNvcmRf bWl4ZXJfc2NiICE9IE5VTEwscmV0dXJuIE5VTEwpOworCisgICAgaWYgKGlucy0+cmVjb3Jk X21peGVyX3NjYi0+c3ViX2xpc3RfcHRyICE9IGlucy0+dGhlX251bGxfc2NiKSB7CisgICAg ICBwYXJlbnQgPSBmaW5kX25leHRfZnJlZV9zY2IgKGNoaXAsaW5zLT5yZWNvcmRfbWl4ZXJf c2NiLT5zdWJfbGlzdF9wdHIpOworICAgICAgaW5zZXJ0X3BvaW50ID0gU0NCX09OX1BBUkVO VF9ORVhUX1NDQjsKKyAgICB9IGVsc2UgeworICAgICAgcGFyZW50ID0gaW5zLT5yZWNvcmRf bWl4ZXJfc2NiOworICAgICAgaW5zZXJ0X3BvaW50ID0gU0NCX09OX1BBUkVOVF9TVUJMSVNU X1NDQjsKKyAgICB9CiAKIAlwY21faW5wdXQgPSBjczQ2eHhfZHNwX2NyZWF0ZV9wY21fc2Vy aWFsX2lucHV0X3NjYihjaGlwLHNjYl9uYW1lLGFkZHIsCi0JCQkJCQkJICAgc291cmNlLCBw YXJlbnQsCi0JCQkJCQkJICAgaW5zZXJ0X3BvaW50KTsKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsIHBhcmVudCwKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBp bnNlcnRfcG9pbnQpOwogCi0JcmV0dXJuIHBjbV9pbnB1dDsKKyAgICByZXR1cm4gcGNtX2lu cHV0OwogfQogCiBpbnQgY3M0Nnh4X3NyY191bmxpbmsoY3M0Nnh4X3QgKmNoaXAsZHNwX3Nj Yl9kZXNjcmlwdG9yX3QgKiBzcmMpCiB7Ci0JZHNwX3Nwb3NfaW5zdGFuY2VfdCAqIGlucyA9 IGNoaXAtPmRzcF9zcG9zX2luc3RhbmNlOwotCWRvd24oJmlucy0+cGNtX211dGV4KTsKLQlk b3duKCZpbnMtPnNjYl9tdXRleCk7Ci0KLQlzbmRfYXNzZXJ0IChzcmMtPnBhcmVudF9zY2Jf cHRyICE9IE5VTEwsZ290byBfZmFpbF9lbmQpOworICBzbmRfYXNzZXJ0IChzcmMtPnBhcmVu dF9zY2JfcHRyICE9IE5VTEwsICByZXR1cm4gLUVJTlZBTCApOwogCi0JLyogbXV0ZSBTQ0Ig Ki8KLQlzbmRfY3M0Nnh4X3Bva2UoY2hpcCwgKHNyYy0+YWRkcmVzcyArIDB4RSkgPDwgMiwg MHhmZmZmZmZmZik7CisgIC8qIG11dGUgU0NCICovCisgIHNuZF9jczQ2eHhfcG9rZShjaGlw LCAoc3JjLT5hZGRyZXNzICsgMHhFKSA8PCAyLCAweGZmZmZmZmZmKTsKIAotCV9kc3BfdW5s aW5rX3NjYiAoY2hpcCxzcmMpOworICBfZHNwX3VubGlua19zY2IgKGNoaXAsc3JjKTsKIAot CXVwKCZpbnMtPnNjYl9tdXRleCk7Ci0JdXAoJmlucy0+cGNtX211dGV4KTsKLQotCXJldHVy biAwOwotCi0gX2ZhaWxfZW5kOgotCXVwKCZpbnMtPnNjYl9tdXRleCk7Ci0JdXAoJmlucy0+ cGNtX211dGV4KTsKLQotCXJldHVybiAtRUlOVkFMOworICByZXR1cm4gMDsKIH0KIAogaW50 IGNzNDZ4eF9zcmNfbGluayhjczQ2eHhfdCAqY2hpcCxkc3Bfc2NiX2Rlc2NyaXB0b3JfdCAq IHNyYykKIHsKLQlkc3Bfc3Bvc19pbnN0YW5jZV90ICogaW5zID0gY2hpcC0+ZHNwX3Nwb3Nf aW5zdGFuY2U7Ci0JZHNwX3NjYl9kZXNjcmlwdG9yX3QgKiBwYXJlbnRfc2NiOwotCXVuc2ln bmVkIGludCBmbGFnczsKLQotCWRvd24oJmlucy0+cGNtX211dGV4KTsKLQlkb3duKCZpbnMt PnNjYl9tdXRleCk7Ci0KLQlzbmRfYXNzZXJ0IChzcmMtPnBhcmVudF9zY2JfcHRyID09IE5V TEwsZ290byBfZmFpbF9lbmQpOwotCXNuZF9hc3NlcnQoaW5zLT5tYXN0ZXJfbWl4X3NjYiAh PU5VTEwsZ290byBfZmFpbF9lbmQpOwotCi0JaWYgKGlucy0+bWFzdGVyX21peF9zY2ItPnN1 Yl9saXN0X3B0ciAhPSBpbnMtPnRoZV9udWxsX3NjYikgewotCQlwYXJlbnRfc2NiID0gZmlu ZF9uZXh0X2ZyZWVfc2NiIChjaGlwLGlucy0+bWFzdGVyX21peF9zY2ItPnN1Yl9saXN0X3B0 cik7Ci0JCXBhcmVudF9zY2ItPm5leHRfc2NiX3B0ciA9IHNyYzsKLQl9IGVsc2UgewotCQlw YXJlbnRfc2NiID0gaW5zLT5tYXN0ZXJfbWl4X3NjYjsKLQkJcGFyZW50X3NjYi0+c3ViX2xp c3RfcHRyID0gc3JjOwotCX0KLQotCXNyYy0+cGFyZW50X3NjYl9wdHIgPSBwYXJlbnRfc2Ni OwotCi0JLyogdXBkYXRlIGVudHJ5IGluIERTUCBSQU0gKi8KLQlzcGluX2xvY2tfaXJxc2F2 ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlzbmRfY3M0Nnh4X3Bva2UoY2hpcCwKLQkJ CShwYXJlbnRfc2NiLT5hZGRyZXNzICsgU0NCc3ViTGlzdFB0cikgPDwgMiwKLQkJCShwYXJl bnRfc2NiLT5zdWJfbGlzdF9wdHItPmFkZHJlc3MgPDwgMHgxMCkgfAotCQkJKHBhcmVudF9z Y2ItPm5leHRfc2NiX3B0ci0+YWRkcmVzcykpOworICBkc3Bfc3Bvc19pbnN0YW5jZV90ICog aW5zID0gY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2U7CisgIGRzcF9zY2JfZGVzY3JpcHRvcl90 ICogcGFyZW50X3NjYjsKKyAgdW5zaWduZWQgaW50IGZsYWdzOworCisgIHNuZF9hc3NlcnQg KHNyYy0+cGFyZW50X3NjYl9wdHIgPT0gTlVMTCwgICByZXR1cm4gLUVJTlZBTCApOworICBz bmRfYXNzZXJ0KGlucy0+bWFzdGVyX21peF9zY2IgIT1OVUxMLCAgIHJldHVybiAtRUlOVkFM ICk7CisKKyAgaWYgKGlucy0+bWFzdGVyX21peF9zY2ItPnN1Yl9saXN0X3B0ciAhPSBpbnMt PnRoZV9udWxsX3NjYikgeworICAgIHBhcmVudF9zY2IgPSBmaW5kX25leHRfZnJlZV9zY2Ig KGNoaXAsaW5zLT5tYXN0ZXJfbWl4X3NjYi0+c3ViX2xpc3RfcHRyKTsKKyAgICBwYXJlbnRf c2NiLT5uZXh0X3NjYl9wdHIgPSBzcmM7CisgIH0gZWxzZSB7CisgICAgcGFyZW50X3NjYiA9 IGlucy0+bWFzdGVyX21peF9zY2I7CisgICAgcGFyZW50X3NjYi0+c3ViX2xpc3RfcHRyID0g c3JjOworICB9CisKKyAgc3JjLT5wYXJlbnRfc2NiX3B0ciA9IHBhcmVudF9zY2I7CisKKyAg LyogdXBkYXRlIGVudHJ5IGluIERTUCBSQU0gKi8KKyAgc3Bpbl9sb2NrX2lycXNhdmUoJmNo aXAtPnJlZ19sb2NrLCBmbGFncyk7CisgIHNuZF9jczQ2eHhfcG9rZShjaGlwLAorICAgICAg ICAgICAgICAgICAgKHBhcmVudF9zY2ItPmFkZHJlc3MgKyBTQ0JzdWJMaXN0UHRyKSA8PCAy LAorICAgICAgICAgICAgICAgICAgKHBhcmVudF9zY2ItPnN1Yl9saXN0X3B0ci0+YWRkcmVz cyA8PCAweDEwKSB8CisgICAgICAgICAgICAgICAgICAocGFyZW50X3NjYi0+bmV4dF9zY2Jf cHRyLT5hZGRyZXNzKSk7CiAgIAogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+ cmVnX2xvY2ssIGZsYWdzKTsKKyAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVn X2xvY2ssIGZsYWdzKTsKICAgCi0JdXAoJmlucy0+c2NiX211dGV4KTsKLQl1cCgmaW5zLT5w Y21fbXV0ZXgpOwotCi0JcmV0dXJuIDA7Ci0KLSBfZmFpbF9lbmQ6Ci0JdXAoJmlucy0+c2Ni X211dGV4KTsKLQl1cCgmaW5zLT5wY21fbXV0ZXgpOwotIAotCXJldHVybiAtRUlOVkFMOwor ICByZXR1cm4gMDsKIH0K --------------050801060305010503040403-- ------------------------------------------------------- This sf.net email is sponsored by: OSDN - Tired of that same old cell phone? Get a new here for FREE! https://www.inphonic.com/r.asp?r=sourceforge1&refcode1=vs3390