From mboxrd@z Thu Jan 1 00:00:00 1970 Message-ID: <3EC0BEE3.50403@eigner.com> From: Klaus Strebel MIME-Version: 1.0 Subject: Re: [linux-lvm] dm and 2.4.21-rc2-xfs References: <3EBF8F56.5050801@eigner.com> In-Reply-To: <3EBF8F56.5050801@eigner.com> Content-Type: multipart/mixed; boundary="------------080801000505030502020407" Sender: linux-lvm-admin@sistina.com Errors-To: linux-lvm-admin@sistina.com Reply-To: linux-lvm@sistina.com List-Help: List-Post: List-Subscribe: , List-Unsubscribe: , List-Archive: Date: Thu May 15 07:33:02 2003 List-Id: To: linux-lvm@sistina.com Cc: thornber@sistina.com This is a multi-part message in MIME format. --------------080801000505030502020407 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Klaus Strebel wrote: > Any suggestions about patches for the jbd code (there where some changes > in it from 2.4.20 to 2.4.21.x and i confess, i'm to lazy finding it out > on my own, but, when nobody else did it, beharps i'll have to, booting > to ext2 doesn't make me sleep too well :-) ). Hi all, got no answer :-( so i investigated myself ... and got it going :-). Some chages (all stuff around BH_Inode in the buffer_head struct) is allready in the 2.4.21-rc? stuff ( cheer, cheer !) but all with different names (humble humble). The only thing that's needed from the 2.4.20-dm-10/00001.patch is the logic twiggling the usage of b_private out of the journal code. So ... remove the patches against : fs/buffer.c fs/jbd/journal.c include/linux/fs.h include/linux/jbd.h and use this instead : --- diff/fs/jbd/journal.c 2002-11-29 09:36:46.000000000 +0000 +++ source/fs/jbd/journal.c 2002-11-29 09:44:59.000000000 +0000 @@ -1802,9 +1802,9 @@ if (buffer_jbd(bh)) { /* Someone did it for us! */ - J_ASSERT_BH(bh, bh->b_private != NULL); + J_ASSERT_BH(bh, bh->b_journal_head != NULL); journal_free_journal_head(jh); - jh = bh->b_private; + jh = bh->b_journal_head; } else { /* * We actually don't need jh_splice_lock when @@ -1812,7 +1812,7 @@ */ spin_lock(&jh_splice_lock); set_bit(BH_JBD, &bh->b_state); - bh->b_private = jh; + bh->b_journal_head = jh; jh->b_bh = bh; atomic_inc(&bh->b_count); spin_unlock(&jh_splice_lock); @@ -1821,7 +1821,7 @@ } jh->b_jcount++; spin_unlock(&journal_datalist_lock); - return bh->b_private; + return bh->b_journal_head; } /* @@ -1854,7 +1854,7 @@ J_ASSERT_BH(bh, jh2bh(jh) == bh); BUFFER_TRACE(bh, "remove journal_head"); spin_lock(&jh_splice_lock); - bh->b_private = NULL; + bh->b_journal_head = NULL; jh->b_bh = NULL; /* debug, really */ clear_bit(BH_JBD, &bh->b_state); __brelse(bh); --- diff/include/linux/fs.h 2002-11-29 09:36:47.000000000 +0000 +++ source/include/linux/fs.h 2002-11-29 09:44:59.000000000 +0000 @@ -267,4 +267,4 @@ void (*b_end_io)(struct buffer_head *bh, int uptodate); /* I/O completion */ void *b_private; /* reserved for b_end_io */ - + void *b_journal_head; /* ext3 journal_heads */ unsigned long b_rsector; /* Real buffer location on disk */ --- diff/include/linux/jbd.h 2002-11-29 09:36:47.000000000 +0000 +++ source/include/linux/jbd.h 2002-11-29 09:44:59.000000000 +0000 @@ -254,7 +254,7 @@ static inline struct journal_head *bh2jh(struct buffer_head *bh) { - return bh->b_private; + return bh->b_journal_head; } #define HAVE_JOURNAL_CALLBACK_STATUS I added my 00001.patch for 2.4.21-rc?-xfs. Cheers Klaus -- Klaus Strebel UNIX-Engineer klaus.strebel@eigner.com EIGNER - Precision Lifecycle Management - --------------080801000505030502020407 Content-Type: text/plain; name="00001.patch" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="00001.patch" LS0tIGRpZmYvRG9jdW1lbnRhdGlvbi9Db25maWd1cmUuaGVscAkyMDAyLTExLTI5IDA5OjM2 OjQzLjAwMDAwMDAwMCArMDAwMAorKysgc291cmNlL0RvY3VtZW50YXRpb24vQ29uZmlndXJl LmhlbHAJMjAwMi0xMS0yOSAwOTo0NDo1OS4wMDAwMDAwMDAgKzAwMDAKQEAgLTE4MjIsNiAr MTgyMiwyMCBAQAogICB3YW50KSwgc2F5IE0gaGVyZSBhbmQgcmVhZCA8ZmlsZTpEb2N1bWVu dGF0aW9uL21vZHVsZXMudHh0Pi4gIFRoZQogICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbHZt LW1vZC5vLgogCitEZXZpY2UtbWFwcGVyIHN1cHBvcnQKK0NPTkZJR19CTEtfREVWX0RNCisg IERldmljZS1tYXBwZXIgaXMgYSBsb3cgbGV2ZWwgdm9sdW1lIG1hbmFnZXIuICBJdCB3b3Jr cyBieSBhbGxvd2luZworICBwZW9wbGUgdG8gc3BlY2lmeSBtYXBwaW5ncyBmb3IgcmFuZ2Vz IG9mIGxvZ2ljYWwgc2VjdG9ycy4gIFZhcmlvdXMKKyAgbWFwcGluZyB0eXBlcyBhcmUgYXZh aWxhYmxlLCBpbiBhZGRpdGlvbiBwZW9wbGUgbWF5IHdyaXRlIHRoZWlyIG93bgorICBtb2R1 bGVzIGNvbnRhaW5pbmcgY3VzdG9tIG1hcHBpbmdzIGlmIHRoZXkgd2lzaC4KKworICBIaWdo ZXIgbGV2ZWwgdm9sdW1lIG1hbmFnZXJzIHN1Y2ggYXMgTFZNMiB1c2UgdGhpcyBkcml2ZXIu CisKKyAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSB0aGlzIGFzIGEgbW9kdWxlLCBzYXkgTSBo ZXJlIGFuZCByZWFkIAorICA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4gIFRo ZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZG0tbW9kLm8uCisKKyAgSWYgdW5zdXJlLCBzYXkg Ti4KKwogTXVsdGlwbGUgZGV2aWNlcyBkcml2ZXIgc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQog Q09ORklHX01ECiAgIFN1cHBvcnQgbXVsdGlwbGUgcGh5c2ljYWwgc3BpbmRsZXMgdGhyb3Vn aCBhIHNpbmdsZSBsb2dpY2FsIGRldmljZS4KLS0tIGRpZmYvTUFJTlRBSU5FUlMJMjAwMi0x MS0yOSAwOTozNjo0My4wMDAwMDAwMDAgKzAwMDAKKysrIHNvdXJjZS9NQUlOVEFJTkVSUwky MDAyLTExLTI5IDA5OjQ0OjU5LjAwMDAwMDAwMCArMDAwMApAQCAtNDM5LDYgKzQzOSwxMyBA QAogVzoJaHR0cDovL3d3dy5kZWJpYW4ub3JnL35kei9pOGsvCiBTOglNYWludGFpbmVkCiAK K0RFVklDRSBNQVBQRVIKK1A6CUpvZSBUaG9ybmJlcgorTToJZG1AdWsuc2lzdGluYS5jb20K K0w6CWxpbnV4LUxWTUBzaXN0aW5hLmNvbQorVzoJaHR0cDovL3d3dy5zaXN0aW5hLmNvbS9s dm0KK1M6CU1haW50YWluZWQKKwogREVWSUNFIE5VTUJFUiBSRUdJU1RSWQogUDoJSC4gUGV0 ZXIgQW52aW4KIE06CWhwYUB6eXRvci5jb20KLS0tIGRpZmYvZHJpdmVycy9tZC9Db25maWcu aW4JMjAwMS0wOS0yNiAxNjoxNTowNS4wMDAwMDAwMDAgKzAxMDAKKysrIHNvdXJjZS9kcml2 ZXJzL21kL0NvbmZpZy5pbgkyMDAyLTExLTI5IDA5OjQ0OjU5LjAwMDAwMDAwMCArMDAwMApA QCAtMTQsNSArMTQsOCBAQAogZGVwX3RyaXN0YXRlICcgIE11bHRpcGF0aCBJL08gc3VwcG9y dCcgQ09ORklHX01EX01VTFRJUEFUSCAkQ09ORklHX0JMS19ERVZfTUQKIAogZGVwX3RyaXN0 YXRlICcgTG9naWNhbCB2b2x1bWUgbWFuYWdlciAoTFZNKSBzdXBwb3J0JyBDT05GSUdfQkxL X0RFVl9MVk0gJENPTkZJR19NRAoraWYgWyAiJENPTkZJR19FWFBFUklNRU5UQUwiID0gInki IF07IHRoZW4KKyAgIGRlcF90cmlzdGF0ZSAnIERldmljZS1tYXBwZXIgc3VwcG9ydCAoRVhQ RVJJTUVOVEFMKScgQ09ORklHX0JMS19ERVZfRE0gJENPTkZJR19NRAorZmkKIAogZW5kbWVu dQotLS0gZGlmZi9kcml2ZXJzL21kL01ha2VmaWxlCTIwMDItMDEtMTcgMTA6MDc6NTIuMDAw MDAwMDAwICswMDAwCisrKyBzb3VyY2UvZHJpdmVycy9tZC9NYWtlZmlsZQkyMDAyLTExLTI5 IDA5OjQ0OjU5LjAwMDAwMDAwMCArMDAwMApAQCAtNCw5ICs0LDEyIEBACiAKIE9fVEFSR0VU CTo9IG1kZGV2Lm8KIAotZXhwb3J0LW9ianMJOj0gbWQubyB4b3IubworZXhwb3J0LW9ianMJ Oj0gbWQubyB4b3IubyBkbS10YWJsZS5vIGRtLXRhcmdldC5vIGtjb3B5ZC5vCiBsaXN0LW11 bHRpCTo9IGx2bS1tb2QubwogbHZtLW1vZC1vYmpzCTo9IGx2bS5vIGx2bS1zbmFwLm8gbHZt LWZzLm8KK2RtLW1vZC1vYmpzCTo9IGRtLm8gZG0tdGFibGUubyBkbS10YXJnZXQubyBkbS1p b2N0bC5vIFwKKwkJICAgZG0tbGluZWFyLm8gZG0tc3RyaXBlLm8gZG0tc25hcHNob3QubyBk bS1leGNlcHRpb24tc3RvcmUubyBcCisJCSAgIGtjb3B5ZC5vCiAKICMgTm90ZTogbGluayBv cmRlciBpcyBpbXBvcnRhbnQuICBBbGwgcmFpZCBwZXJzb25hbGl0aWVzCiAjIGFuZCB4b3Iu byBtdXN0IGNvbWUgYmVmb3JlIG1kLm8sIGFzIHRoZXkgZWFjaCBpbml0aWFsaXNlIApAQCAt MjAsOCArMjMsMTIgQEAKIG9iai0kKENPTkZJR19NRF9NVUxUSVBBVEgpCSs9IG11bHRpcGF0 aC5vCiBvYmotJChDT05GSUdfQkxLX0RFVl9NRCkJKz0gbWQubwogb2JqLSQoQ09ORklHX0JM S19ERVZfTFZNKQkrPSBsdm0tbW9kLm8KK29iai0kKENPTkZJR19CTEtfREVWX0RNKQkrPSBk bS1tb2QubwogCiBpbmNsdWRlICQoVE9QRElSKS9SdWxlcy5tYWtlCiAKIGx2bS1tb2Qubzog JChsdm0tbW9kLW9ianMpCiAJJChMRCkgLXIgLW8gJEAgJChsdm0tbW9kLW9ianMpCisKK2Rt LW1vZC5vOiAkKGRtLW1vZC1vYmpzKQorCSQoTEQpIC1yIC1vICRAICQoZG0tbW9kLW9ianMp Ci0tLSBkaWZmL2ZzL2piZC9qb3VybmFsLmMJMjAwMi0xMS0yOSAwOTozNjo0Ni4wMDAwMDAw MDAgKzAwMDAKKysrIHNvdXJjZS9mcy9qYmQvam91cm5hbC5jCTIwMDItMTEtMjkgMDk6NDQ6 NTkuMDAwMDAwMDAwICswMDAwCkBAIC0xODAyLDkgKzE4MDIsOSBAQAogCiAJCWlmIChidWZm ZXJfamJkKGJoKSkgewogCQkJLyogU29tZW9uZSBkaWQgaXQgZm9yIHVzISAqLwotCQkJSl9B U1NFUlRfQkgoYmgsIGJoLT5iX3ByaXZhdGUgIT0gTlVMTCk7CisJCQlKX0FTU0VSVF9CSChi aCwgYmgtPmJfam91cm5hbF9oZWFkICE9IE5VTEwpOwogCQkJam91cm5hbF9mcmVlX2pvdXJu YWxfaGVhZChqaCk7Ci0JCQlqaCA9IGJoLT5iX3ByaXZhdGU7CisJCQlqaCA9IGJoLT5iX2pv dXJuYWxfaGVhZDsKIAkJfSBlbHNlIHsKIAkJCS8qCiAJCQkgKiBXZSBhY3R1YWxseSBkb24n dCBuZWVkIGpoX3NwbGljZV9sb2NrIHdoZW4KQEAgLTE4MTIsNyArMTgxMiw3IEBACiAJCQkg Ki8KIAkJCXNwaW5fbG9jaygmamhfc3BsaWNlX2xvY2spOwogCQkJc2V0X2JpdChCSF9KQkQs ICZiaC0+Yl9zdGF0ZSk7Ci0JCQliaC0+Yl9wcml2YXRlID0gamg7CisJCQliaC0+Yl9qb3Vy bmFsX2hlYWQgPSBqaDsKIAkJCWpoLT5iX2JoID0gYmg7CiAJCQlhdG9taWNfaW5jKCZiaC0+ Yl9jb3VudCk7CiAJCQlzcGluX3VubG9jaygmamhfc3BsaWNlX2xvY2spOwpAQCAtMTgyMSw3 ICsxODIxLDcgQEAKIAl9CiAJamgtPmJfamNvdW50Kys7CiAJc3Bpbl91bmxvY2soJmpvdXJu YWxfZGF0YWxpc3RfbG9jayk7Ci0JcmV0dXJuIGJoLT5iX3ByaXZhdGU7CisJcmV0dXJuIGJo LT5iX2pvdXJuYWxfaGVhZDsKIH0KIAogLyoKQEAgLTE4NTQsNyArMTg1NCw3IEBACiAJCQlK X0FTU0VSVF9CSChiaCwgamgyYmgoamgpID09IGJoKTsKIAkJCUJVRkZFUl9UUkFDRShiaCwg InJlbW92ZSBqb3VybmFsX2hlYWQiKTsKIAkJCXNwaW5fbG9jaygmamhfc3BsaWNlX2xvY2sp OwotCQkJYmgtPmJfcHJpdmF0ZSA9IE5VTEw7CisJCQliaC0+Yl9qb3VybmFsX2hlYWQgPSBO VUxMOwogCQkJamgtPmJfYmggPSBOVUxMOwkvKiBkZWJ1ZywgcmVhbGx5ICovCiAJCQljbGVh cl9iaXQoQkhfSkJELCAmYmgtPmJfc3RhdGUpOwogCQkJX19icmVsc2UoYmgpOwotLS0gZGlm Zi9pbmNsdWRlL2xpbnV4L2ZzLmgJMjAwMi0xMS0yOSAwOTozNjo0Ny4wMDAwMDAwMDAgKzAw MDAKKysrIHNvdXJjZS9pbmNsdWRlL2xpbnV4L2ZzLmgJMjAwMi0xMS0yOSAwOTo0NDo1OS4w MDAwMDAwMDAgKzAwMDAKQEAgLTI2Nyw0ICsyNjcsNCBAQAogCXZvaWQgKCpiX2VuZF9pbyko c3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHVwdG9kYXRlKTsgLyogSS9PIGNvbXBsZXRp b24gKi8KCXZvaWQgKmJfcHJpdmF0ZTsJCS8qIHJlc2VydmVkIGZvciBiX2VuZF9pbyAqLwot CisgCXZvaWQgKmJfam91cm5hbF9oZWFkOwkJLyogZXh0MyBqb3VybmFsX2hlYWRzICovCgl1 bnNpZ25lZCBsb25nIGJfcnNlY3RvcjsJLyogUmVhbCBidWZmZXIgbG9jYXRpb24gb24gZGlz ayAqLwotLS0gZGlmZi9pbmNsdWRlL2xpbnV4L2piZC5oCTIwMDItMTEtMjkgMDk6MzY6NDcu MDAwMDAwMDAwICswMDAwCisrKyBzb3VyY2UvaW5jbHVkZS9saW51eC9qYmQuaAkyMDAyLTEx LTI5IDA5OjQ0OjU5LjAwMDAwMDAwMCArMDAwMApAQCAtMjU0LDcgKzI1NCw3IEBACiAKIHN0 YXRpYyBpbmxpbmUgc3RydWN0IGpvdXJuYWxfaGVhZCAqYmgyamgoc3RydWN0IGJ1ZmZlcl9o ZWFkICpiaCkKIHsKLQlyZXR1cm4gYmgtPmJfcHJpdmF0ZTsKKwlyZXR1cm4gYmgtPmJfam91 cm5hbF9oZWFkOwogfQogCiAjZGVmaW5lIEhBVkVfSk9VUk5BTF9DQUxMQkFDS19TVEFUVVMK LS0tIGRpZmYvaW5jbHVkZS9saW51eC92bWFsbG9jLmgJMjAwMi0xMS0yOSAwOTozNjo0Ny4w MDAwMDAwMDAgKzAwMDAKKysrIHNvdXJjZS9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaAkyMDAy LTExLTI5IDA5OjQ0OjU5LjAwMDAwMDAwMCArMDAwMApAQCAtMjYsNiArMjYsNyBAQAogZXh0 ZXJuIHZvaWQgdm1mcmVlX2FyZWFfcGFnZXModW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNp Z25lZCBsb25nIHNpemUpOwogZXh0ZXJuIGludCB2bWFsbG9jX2FyZWFfcGFnZXModW5zaWdu ZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHNpemUsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBpbnQgZ2ZwX21hc2ssIHBncHJvdF90IHByb3QpOworZXh0ZXJuIHZv aWQgKnZjYWxsb2ModW5zaWduZWQgbG9uZyBubWVtYiwgdW5zaWduZWQgbG9uZyBlbGVtX3Np emUpOwogCiAvKgogICoJQWxsb2NhdGUgYW55IHBhZ2VzCi0tLSBkaWZmL2tlcm5lbC9rc3lt cy5jCTIwMDItMTEtMjkgMDk6MzY6NDcuMDAwMDAwMDAwICswMDAwCisrKyBzb3VyY2Uva2Vy bmVsL2tzeW1zLmMJMjAwMi0xMS0yOSAwOTo0NDo1OS4wMDAwMDAwMDAgKzAwMDAKQEAgLTEx MSw2ICsxMTEsNyBAQAogRVhQT1JUX1NZTUJPTCh2ZnJlZSk7CiBFWFBPUlRfU1lNQk9MKF9f dm1hbGxvYyk7CiBFWFBPUlRfU1lNQk9MKHZtYWxsb2NfdG9fcGFnZSk7CitFWFBPUlRfU1lN Qk9MKHZjYWxsb2MpOwogRVhQT1JUX1NZTUJPTChtZW1fbWFwKTsKIEVYUE9SVF9TWU1CT0wo cmVtYXBfcGFnZV9yYW5nZSk7CiBFWFBPUlRfU1lNQk9MKG1heF9tYXBucik7Ci0tLSBkaWZm L21tL01ha2VmaWxlCTIwMDItMDgtMDUgMTQ6NTc6NDQuMDAwMDAwMDAwICswMTAwCisrKyBz b3VyY2UvbW0vTWFrZWZpbGUJMjAwMi0xMS0yOSAwOTo0NDo1OS4wMDAwMDAwMDAgKzAwMDAK QEAgLTksMTIgKzksMTIgQEAKIAogT19UQVJHRVQgOj0gbW0ubwogCi1leHBvcnQtb2JqcyA6 PSBzaG1lbS5vIGZpbGVtYXAubyBtZW1vcnkubyBwYWdlX2FsbG9jLm8KK2V4cG9ydC1vYmpz IDo9IHNobWVtLm8gZmlsZW1hcC5vIG1lbW9yeS5vIHBhZ2VfYWxsb2MubyBtZW1wb29sLm8K IAogb2JqLXkJIDo9IG1lbW9yeS5vIG1tYXAubyBmaWxlbWFwLm8gbXByb3RlY3QubyBtbG9j ay5vIG1yZW1hcC5vIFwKIAkgICAgdm1hbGxvYy5vIHNsYWIubyBib290bWVtLm8gc3dhcC5v IHZtc2Nhbi5vIHBhZ2VfaW8ubyBcCiAJICAgIHBhZ2VfYWxsb2MubyBzd2FwX3N0YXRlLm8g c3dhcGZpbGUubyBudW1hLm8gb29tX2tpbGwubyBcCi0JICAgIHNobWVtLm8KKwkgICAgc2ht ZW0ubyBtZW1wb29sLm8KIAogb2JqLSQoQ09ORklHX0hJR0hNRU0pICs9IGhpZ2htZW0ubwog Ci0tLSBkaWZmL21tL3ZtYWxsb2MuYwkyMDAyLTExLTI5IDA5OjM2OjQ3LjAwMDAwMDAwMCAr MDAwMAorKysgc291cmNlL21tL3ZtYWxsb2MuYwkyMDAyLTExLTI5IDA5OjQ0OjU5LjAwMDAw MDAwMCArMDAwMApAQCAtMzI3LDMgKzMyNywyMiBAQAogCXJlYWRfdW5sb2NrKCZ2bWxpc3Rf bG9jayk7CiAJcmV0dXJuIGJ1ZiAtIGJ1Zl9zdGFydDsKIH0KKwordm9pZCAqdmNhbGxvYyh1 bnNpZ25lZCBsb25nIG5tZW1iLCB1bnNpZ25lZCBsb25nIGVsZW1fc2l6ZSkKK3sKKwl1bnNp Z25lZCBsb25nIHNpemU7CisJdm9pZCAqYWRkcjsKKworCS8qCisJICogQ2hlY2sgdGhhdCB3 ZSdyZSBub3QgZ29pbmcgdG8gb3ZlcmZsb3cuCisJICovCisJaWYgKG5tZW1iID4gKFVMT05H X01BWCAvIGVsZW1fc2l6ZSkpCisJCXJldHVybiBOVUxMOworCisJc2l6ZSA9IG5tZW1iICog ZWxlbV9zaXplOworCWFkZHIgPSB2bWFsbG9jKHNpemUpOworCWlmIChhZGRyKQorCQltZW1z ZXQoYWRkciwgMCwgc2l6ZSk7CisKKwlyZXR1cm4gYWRkcjsKK30KLS0tIGRpZmYvZHJpdmVy cy9tZC9kbS1leGNlcHRpb24tc3RvcmUuYwkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAw MCArMDEwMAorKysgc291cmNlL2RyaXZlcnMvbWQvZG0tZXhjZXB0aW9uLXN0b3JlLmMJMjAw Mi0xMS0yOSAwOTo0NDo1OS4wMDAwMDAwMDAgKzAwMDAKQEAgLTAsMCArMSw3MDEgQEAKKy8q CisgKiBkbS1zbmFwc2hvdC5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgU2lz dGluYSBTb2Z0d2FyZSAoVUspIExpbWl0ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVh c2VkIHVuZGVyIHRoZSBHUEwuCisgKi8KKworI2luY2x1ZGUgImRtLXNuYXBzaG90LmgiCisj aW5jbHVkZSAia2NvcHlkLmgiCisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUg PGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVk ZSA8bGludXgvc2xhYi5oPgorCisjZGVmaW5lIFNFQ1RPUl9TSVpFIDUxMgorI2RlZmluZSBT RUNUT1JfU0hJRlQgOQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQZXJzaXN0ZW50IHNuYXBzaG90 cywgYnkgcGVyc2lzdGVudCB3ZSBtZWFuIHRoYXQgdGhlIHNuYXBzaG90CisgKiB3aWxsIHN1 cnZpdmUgYSByZWJvb3QuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBXZSBuZWVkIHRvIHN0 b3JlIGEgcmVjb3JkIG9mIHdoaWNoIHBhcnRzIG9mIHRoZSBvcmlnaW4gaGF2ZQorICogYmVl biBjb3BpZWQgdG8gdGhlIHNuYXBzaG90IGRldmljZS4gIFRoZSBzbmFwc2hvdCBjb2RlCisg KiByZXF1aXJlcyB0aGF0IHdlIGNvcHkgZXhjZXB0aW9uIGNodW5rcyB0byBjaHVuayBhbGln bmVkIGFyZWFzCisgKiBvZiB0aGUgQ09XIHN0b3JlLiAgSXQgbWFrZXMgc2Vuc2UgdGhlcmVm b3JlLCB0byBzdG9yZSB0aGUKKyAqIG1ldGFkYXRhIGluIGNodW5rIHNpemUgYmxvY2tzLgor ICoKKyAqIFRoZXJlIGlzIG5vIGJhY2t3YXJkIG9yIGZvcndhcmQgY29tcGF0aWJpbGl0eSBp bXBsZW1lbnRlZCwKKyAqIHNuYXBzaG90cyB3aXRoIGRpZmZlcmVudCBkaXNrIHZlcnNpb25z IHRoYW4gdGhlIGtlcm5lbCB3aWxsCisgKiBub3QgYmUgdXNhYmxlLiAgSXQgaXMgZXhwZWN0 ZWQgdGhhdCAibHZjcmVhdGUiIHdpbGwgYmxhbmsgb3V0CisgKiB0aGUgc3RhcnQgb2YgYSBm cmVzaCBDT1cgZGV2aWNlIGJlZm9yZSBjYWxsaW5nIHRoZSBzbmFwc2hvdAorICogY29uc3Ry dWN0b3IuCisgKgorICogVGhlIGZpcnN0IGNodW5rIG9mIHRoZSBDT1cgZGV2aWNlIGp1c3Qg Y29udGFpbnMgdGhlIGhlYWRlci4KKyAqIEFmdGVyIHRoaXMgdGhlcmUgaXMgYSBjaHVuayBm aWxsZWQgd2l0aCBleGNlcHRpb24gbWV0YWRhdGEsCisgKiBmb2xsb3dlZCBieSBhcyBtYW55 IGV4Y2VwdGlvbiBjaHVua3MgYXMgY2FuIGZpdCBpbiB0aGUKKyAqIG1ldGFkYXRhIGFyZWFz LgorICoKKyAqIEFsbCBvbiBkaXNrIHN0cnVjdHVyZXMgYXJlIGluIGxpdHRsZS1lbmRpYW4g Zm9ybWF0LiAgVGhlIGVuZAorICogb2YgdGhlIGV4Y2VwdGlvbnMgaW5mbyBpcyBpbmRpY2F0 ZWQgYnkgYW4gZXhjZXB0aW9uIHdpdGggYQorICogbmV3X2NodW5rIG9mIDAsIHdoaWNoIGlz IGludmFsaWQgc2luY2UgaXQgd291bGQgcG9pbnQgdG8gdGhlCisgKiBoZWFkZXIgY2h1bmsu CisgKi8KKworLyoKKyAqIE1hZ2ljIGZvciBwZXJzaXN0ZW50IHNuYXBzaG90czogIlNuQXAi IC0gRmVlYmxlIGlzbid0IGl0LgorICovCisjZGVmaW5lIFNOQVBfTUFHSUMgMHg3MDQxNmU1 MworCisvKgorICogVGhlIG9uLWRpc2sgdmVyc2lvbiBvZiB0aGUgbWV0YWRhdGEuCisgKi8K KyNkZWZpbmUgU05BUFNIT1RfRElTS19WRVJTSU9OIDEKKworc3RydWN0IGRpc2tfaGVhZGVy IHsKKwl1aW50MzJfdCBtYWdpYzsKKworCS8qCisJICogSXMgdGhpcyBzbmFwc2hvdCB2YWxp ZC4gIFRoZXJlIGlzIG5vIHdheSBvZiByZWNvdmVyaW5nCisJICogYW4gaW52YWxpZCBzbmFw c2hvdC4KKwkgKi8KKwlpbnQgdmFsaWQ7CisKKwkvKgorCSAqIFNpbXBsZSwgaW5jcmVtZW50 aW5nIHZlcnNpb24uIG5vIGJhY2t3YXJkCisJICogY29tcGF0aWJpbGl0eS4KKwkgKi8KKwl1 aW50MzJfdCB2ZXJzaW9uOworCisJLyogSW4gc2VjdG9ycyAqLworCXVpbnQzMl90IGNodW5r X3NpemU7Cit9OworCitzdHJ1Y3QgZGlza19leGNlcHRpb24geworCXVpbnQ2NF90IG9sZF9j aHVuazsKKwl1aW50NjRfdCBuZXdfY2h1bms7Cit9OworCitzdHJ1Y3QgY29tbWl0X2NhbGxi YWNrIHsKKwl2b2lkICgqY2FsbGJhY2spKHZvaWQgKiwgaW50IHN1Y2Nlc3MpOworCXZvaWQg KmNvbnRleHQ7Cit9OworCisvKgorICogVGhlIHRvcCBsZXZlbCBzdHJ1Y3R1cmUgZm9yIGEg cGVyc2lzdGVudCBleGNlcHRpb24gc3RvcmUuCisgKi8KK3N0cnVjdCBwc3RvcmUgeworCXN0 cnVjdCBkbV9zbmFwc2hvdCAqc25hcDsJLyogdXAgcG9pbnRlciB0byBteSBzbmFwc2hvdCAq LworCWludCB2ZXJzaW9uOworCWludCB2YWxpZDsKKwl1aW50MzJfdCBjaHVua19zaXplOwor CXVpbnQzMl90IGV4Y2VwdGlvbnNfcGVyX2FyZWE7CisKKwkvKgorCSAqIE5vdyB0aGF0IHdl IGhhdmUgYW4gYXN5bmNocm9ub3VzIGtjb3B5ZCB0aGVyZSBpcyBubworCSAqIG5lZWQgZm9y IGxhcmdlIGNodW5rIHNpemVzLCBzbyBpdCB3b250IGh1cnQgdG8gaGF2ZSBhCisJICogd2hv bGUgY2h1bmtzIHdvcnRoIG9mIG1ldGFkYXRhIGluIG1lbW9yeSBhdCBvbmNlLgorCSAqLwor CXZvaWQgKmFyZWE7CisJc3RydWN0IGtpb2J1ZiAqaW9idWY7CisKKwkvKgorCSAqIFVzZWQg dG8ga2VlcCB0cmFjayBvZiB3aGljaCBtZXRhZGF0YSBhcmVhIHRoZSBkYXRhIGluCisJICog J2NodW5rJyByZWZlcnMgdG8uCisJICovCisJdWludDMyX3QgY3VycmVudF9hcmVhOworCisJ LyoKKwkgKiBUaGUgbmV4dCBmcmVlIGNodW5rIGZvciBhbiBleGNlcHRpb24uCisJICovCisJ dWludDMyX3QgbmV4dF9mcmVlOworCisJLyoKKwkgKiBUaGUgaW5kZXggb2YgbmV4dCBmcmVl IGV4Y2VwdGlvbiBpbiB0aGUgY3VycmVudAorCSAqIG1ldGFkYXRhIGFyZWEuCisJICovCisJ dWludDMyX3QgY3VycmVudF9jb21taXR0ZWQ7CisKKwlhdG9taWNfdCBwZW5kaW5nX2NvdW50 OworCXVpbnQzMl90IGNhbGxiYWNrX2NvdW50OworCXN0cnVjdCBjb21taXRfY2FsbGJhY2sg KmNhbGxiYWNrczsKK307CisKKy8qCisgKiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucyB3ZSB3 YW50IHRvIGRlZmVyIHdyaXRpbmcgYSBjb21taXR0ZWQKKyAqIGV4Y2VwdGlvbnMgbWV0YWRh dGEgdG8gZGlzayBzbyB0aGF0IHdlIGNhbiBhbW9ydGlzZSBhd2F5IHRoaXMKKyAqIGV4ZW5z aXZlIG9wZXJhdGlvbi4KKyAqCisgKiBGb3IgdGhlIGluaXRpYWwgdmVyc2lvbiBvZiB0aGlz IGNvZGUgd2Ugd2lsbCByZW1haW4gd2l0aAorICogc3luY2hyb25vdXMgaW8uICBUaGVyZSBh cmUgc29tZSBkZWFkbG9jayBpc3N1ZXMgd2l0aCBhc3luYworICogdGhhdCBJIGhhdmVuJ3Qg eWV0IHdvcmtlZCBvdXQuCisgKi8KK3N0YXRpYyBpbnQgZG9faW8oaW50IHJ3LCBzdHJ1Y3Qg a2NvcHlkX3JlZ2lvbiAqd2hlcmUsIHN0cnVjdCBraW9idWYgKmlvYnVmKQoreworCWludCBp LCBzZWN0b3JzX3Blcl9ibG9jaywgbnJfYmxvY2tzLCBzdGFydDsKKwlpbnQgYmxvY2tzaXpl ID0gZ2V0X2hhcmRzZWN0X3NpemUod2hlcmUtPmRldik7CisJaW50IHN0YXR1czsKKworCXNl Y3RvcnNfcGVyX2Jsb2NrID0gYmxvY2tzaXplIC8gU0VDVE9SX1NJWkU7CisKKwlucl9ibG9j a3MgPSB3aGVyZS0+Y291bnQgLyBzZWN0b3JzX3Blcl9ibG9jazsKKwlzdGFydCA9IHdoZXJl LT5zZWN0b3IgLyBzZWN0b3JzX3Blcl9ibG9jazsKKworCWZvciAoaSA9IDA7IGkgPCBucl9i bG9ja3M7IGkrKykKKwkJaW9idWYtPmJsb2Nrc1tpXSA9IHN0YXJ0Kys7CisKKwlpb2J1Zi0+ bGVuZ3RoID0gd2hlcmUtPmNvdW50IDw8IDk7CisJaW9idWYtPmxvY2tlZCA9IDE7CisKKwlz dGF0dXMgPSBicndfa2lvdmVjKHJ3LCAxLCAmaW9idWYsIHdoZXJlLT5kZXYsIGlvYnVmLT5i bG9ja3MsCisJCQkgICAgYmxvY2tzaXplKTsKKwlpZiAoc3RhdHVzICE9ICh3aGVyZS0+Y291 bnQgPDwgOSkpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBp bnQgYWxsb2NhdGVfaW9idWYoc3RydWN0IHBzdG9yZSAqcHMpCit7CisJc2l6ZV90IGksIHIg PSAtRU5PTUVNLCBsZW4sIG5yX3BhZ2VzOworCXN0cnVjdCBwYWdlICpwYWdlOworCisJbGVu ID0gcHMtPmNodW5rX3NpemUgPDwgU0VDVE9SX1NISUZUOworCisJLyoKKwkgKiBBbGxvY2F0 ZSB0aGUgY2h1bmtfc2l6ZSBibG9jayBvZiBtZW1vcnkgdGhhdCB3aWxsIGhvbGQKKwkgKiBh IHNpbmdsZSBtZXRhZGF0YSBhcmVhLgorCSAqLworCXBzLT5hcmVhID0gdm1hbGxvYyhsZW4p OworCWlmICghcHMtPmFyZWEpCisJCXJldHVybiByOworCisJaWYgKGFsbG9jX2tpb3ZlYygx LCAmcHMtPmlvYnVmKSkKKwkJZ290byBiYWQ7CisKKwlucl9wYWdlcyA9IHBzLT5jaHVua19z aXplIC8gKFBBR0VfU0laRSAvIFNFQ1RPUl9TSVpFKTsKKwlyID0gZXhwYW5kX2tpb2J1Zihw cy0+aW9idWYsIG5yX3BhZ2VzKTsKKwlpZiAocikKKwkJZ290byBiYWQ7CisKKwkvKgorCSAq IFdlIGxvY2sgdGhlIHBhZ2VzIGZvciBwcy0+YXJlYSBpbnRvIG1lbW9yeSBzaW5jZSB0aGV5 J2xsIGJlCisJICogZG9pbmcgYSBsb3Qgb2YgaW8uCisJICovCisJZm9yIChpID0gMDsgaSA8 IG5yX3BhZ2VzOyBpKyspIHsKKwkJcGFnZSA9IHZtYWxsb2NfdG9fcGFnZShwcy0+YXJlYSAr IChpICogUEFHRV9TSVpFKSk7CisJCUxvY2tQYWdlKHBhZ2UpOworCQlwcy0+aW9idWYtPm1h cGxpc3RbaV0gPSBwYWdlOworCQlwcy0+aW9idWYtPm5yX3BhZ2VzKys7CisJfQorCisJcHMt PmlvYnVmLT5ucl9wYWdlcyA9IG5yX3BhZ2VzOworCXBzLT5pb2J1Zi0+b2Zmc2V0ID0gMDsK KworCXJldHVybiAwOworCisgICAgICBiYWQ6CisJaWYgKHBzLT5pb2J1ZikKKwkJZnJlZV9r aW92ZWMoMSwgJnBzLT5pb2J1Zik7CisKKwlpZiAocHMtPmFyZWEpCisJCXZmcmVlKHBzLT5h cmVhKTsKKwlwcy0+aW9idWYgPSBOVUxMOworCXJldHVybiByOworfQorCitzdGF0aWMgdm9p ZCBmcmVlX2lvYnVmKHN0cnVjdCBwc3RvcmUgKnBzKQoreworCWludCBpOworCisJZm9yIChp ID0gMDsgaSA8IHBzLT5pb2J1Zi0+bnJfcGFnZXM7IGkrKykKKwkJVW5sb2NrUGFnZShwcy0+ aW9idWYtPm1hcGxpc3RbaV0pOworCXBzLT5pb2J1Zi0+bG9ja2VkID0gMDsKKworCWZyZWVf a2lvdmVjKDEsICZwcy0+aW9idWYpOworCXZmcmVlKHBzLT5hcmVhKTsKK30KKworLyoKKyAq IFJlYWQgb3Igd3JpdGUgYSBjaHVuayBhbGlnbmVkIGFuZCBzaXplZCBibG9jayBvZiBkYXRh IGZyb20gYSBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgY2h1bmtfaW8oc3RydWN0IHBzdG9y ZSAqcHMsIHVpbnQzMl90IGNodW5rLCBpbnQgcncpCit7CisJaW50IHI7CisJc3RydWN0IGtj b3B5ZF9yZWdpb24gd2hlcmU7CisKKwl3aGVyZS5kZXYgPSBwcy0+c25hcC0+Y293LT5kZXY7 CisJd2hlcmUuc2VjdG9yID0gcHMtPmNodW5rX3NpemUgKiBjaHVuazsKKwl3aGVyZS5jb3Vu dCA9IHBzLT5jaHVua19zaXplOworCisJciA9IGRvX2lvKHJ3LCAmd2hlcmUsIHBzLT5pb2J1 Zik7CisJaWYgKHIpCisJCXJldHVybiByOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBS ZWFkIG9yIHdyaXRlIGEgbWV0YWRhdGEgYXJlYS4gIFJlbWVtYmVyaW5nIHRvIHNraXAgdGhl IGZpcnN0CisgKiBjaHVuayB3aGljaCBob2xkcyB0aGUgaGVhZGVyLgorICovCitzdGF0aWMg aW50IGFyZWFfaW8oc3RydWN0IHBzdG9yZSAqcHMsIHVpbnQzMl90IGFyZWEsIGludCBydykK K3sKKwlpbnQgcjsKKwl1aW50MzJfdCBjaHVuazsKKworCS8qIGNvbnZlcnQgYSBtZXRhZGF0 YSBhcmVhIGluZGV4IHRvIGEgY2h1bmsgaW5kZXggKi8KKwljaHVuayA9IDEgKyAoKHBzLT5l eGNlcHRpb25zX3Blcl9hcmVhICsgMSkgKiBhcmVhKTsKKworCXIgPSBjaHVua19pbyhwcywg Y2h1bmssIHJ3KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlwcy0+Y3VycmVudF9hcmVh ID0gYXJlYTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB6ZXJvX2FyZWEoc3RydWN0 IHBzdG9yZSAqcHMsIHVpbnQzMl90IGFyZWEpCit7CisJbWVtc2V0KHBzLT5hcmVhLCAwLCBw cy0+Y2h1bmtfc2l6ZSA8PCBTRUNUT1JfU0hJRlQpOworCXJldHVybiBhcmVhX2lvKHBzLCBh cmVhLCBXUklURSk7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9oZWFkZXIoc3RydWN0IHBzdG9y ZSAqcHMsIGludCAqbmV3X3NuYXBzaG90KQoreworCWludCByOworCXN0cnVjdCBkaXNrX2hl YWRlciAqZGg7CisKKwlyID0gY2h1bmtfaW8ocHMsIDAsIFJFQUQpOworCWlmIChyKQorCQly ZXR1cm4gcjsKKworCWRoID0gKHN0cnVjdCBkaXNrX2hlYWRlciAqKSBwcy0+YXJlYTsKKwor CWlmIChkaC0+bWFnaWMgPT0gMCkgeworCQkqbmV3X3NuYXBzaG90ID0gMTsKKworCX0gZWxz ZSBpZiAoZGgtPm1hZ2ljID09IFNOQVBfTUFHSUMpIHsKKwkJKm5ld19zbmFwc2hvdCA9IDA7 CisJCXBzLT52YWxpZCA9IGRoLT52YWxpZDsKKwkJcHMtPnZlcnNpb24gPSBkaC0+dmVyc2lv bjsKKwkJcHMtPmNodW5rX3NpemUgPSBkaC0+Y2h1bmtfc2l6ZTsKKworCX0gZWxzZSB7CisJ CURNV0FSTigiSW52YWxpZC9jb3JydXB0IHNuYXBzaG90Iik7CisJCXIgPSAtRU5YSU87CisJ fQorCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfaGVhZGVyKHN0cnVjdCBw c3RvcmUgKnBzKQoreworCXN0cnVjdCBkaXNrX2hlYWRlciAqZGg7CisKKwltZW1zZXQocHMt PmFyZWEsIDAsIHBzLT5jaHVua19zaXplIDw8IFNFQ1RPUl9TSElGVCk7CisKKwlkaCA9IChz dHJ1Y3QgZGlza19oZWFkZXIgKikgcHMtPmFyZWE7CisJZGgtPm1hZ2ljID0gU05BUF9NQUdJ QzsKKwlkaC0+dmFsaWQgPSBwcy0+dmFsaWQ7CisJZGgtPnZlcnNpb24gPSBwcy0+dmVyc2lv bjsKKwlkaC0+Y2h1bmtfc2l6ZSA9IHBzLT5jaHVua19zaXplOworCisJcmV0dXJuIGNodW5r X2lvKHBzLCAwLCBXUklURSk7Cit9CisKKy8qCisgKiBBY2Nlc3MgZnVuY3Rpb25zIGZvciB0 aGUgZGlzayBleGNlcHRpb25zLCB0aGVzZSBkbyB0aGUgZW5kaWFuIGNvbnZlcnNpb25zLgor ICovCitzdGF0aWMgc3RydWN0IGRpc2tfZXhjZXB0aW9uICpnZXRfZXhjZXB0aW9uKHN0cnVj dCBwc3RvcmUgKnBzLCB1aW50MzJfdCBpbmRleCkKK3sKKwlpZiAoaW5kZXggPj0gcHMtPmV4 Y2VwdGlvbnNfcGVyX2FyZWEpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuICgoc3RydWN0 IGRpc2tfZXhjZXB0aW9uICopIHBzLT5hcmVhKSArIGluZGV4OworfQorCitzdGF0aWMgaW50 IHJlYWRfZXhjZXB0aW9uKHN0cnVjdCBwc3RvcmUgKnBzLAorCQkJICB1aW50MzJfdCBpbmRl eCwgc3RydWN0IGRpc2tfZXhjZXB0aW9uICpyZXN1bHQpCit7CisJc3RydWN0IGRpc2tfZXhj ZXB0aW9uICplOworCisJZSA9IGdldF9leGNlcHRpb24ocHMsIGluZGV4KTsKKwlpZiAoIWUp CisJCXJldHVybiAtRUlOVkFMOworCisJLyogY29weSBpdCAqLworCXJlc3VsdC0+b2xkX2No dW5rID0gbGU2NF90b19jcHUoZS0+b2xkX2NodW5rKTsKKwlyZXN1bHQtPm5ld19jaHVuayA9 IGxlNjRfdG9fY3B1KGUtPm5ld19jaHVuayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGlj IGludCB3cml0ZV9leGNlcHRpb24oc3RydWN0IHBzdG9yZSAqcHMsCisJCQkgICB1aW50MzJf dCBpbmRleCwgc3RydWN0IGRpc2tfZXhjZXB0aW9uICpkZSkKK3sKKwlzdHJ1Y3QgZGlza19l eGNlcHRpb24gKmU7CisKKwllID0gZ2V0X2V4Y2VwdGlvbihwcywgaW5kZXgpOworCWlmICgh ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBjb3B5IGl0ICovCisJZS0+b2xkX2NodW5r ID0gY3B1X3RvX2xlNjQoZGUtPm9sZF9jaHVuayk7CisJZS0+bmV3X2NodW5rID0gY3B1X3Rv X2xlNjQoZGUtPm5ld19jaHVuayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlZ2lz dGVycyB0aGUgZXhjZXB0aW9ucyB0aGF0IGFyZSBwcmVzZW50IGluIHRoZSBjdXJyZW50IGFy ZWEuCisgKiAnZnVsbCcgaXMgZmlsbGVkIGluIHRvIGluZGljYXRlIGlmIHRoZSBhcmVhIGhh cyBiZWVuCisgKiBmaWxsZWQuCisgKi8KK3N0YXRpYyBpbnQgaW5zZXJ0X2V4Y2VwdGlvbnMo c3RydWN0IHBzdG9yZSAqcHMsIGludCAqZnVsbCkKK3sKKwlpbnQgaSwgcjsKKwlzdHJ1Y3Qg ZGlza19leGNlcHRpb24gZGU7CisKKwkvKiBwcmVzdW1lIHRoZSBhcmVhIGlzIGZ1bGwgKi8K KwkqZnVsbCA9IDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgcHMtPmV4Y2VwdGlvbnNfcGVyX2Fy ZWE7IGkrKykgeworCQlyID0gcmVhZF9leGNlcHRpb24ocHMsIGksICZkZSk7CisKKwkJaWYg KHIpCisJCQlyZXR1cm4gcjsKKworCQkvKgorCQkgKiBJZiB0aGUgbmV3X2NodW5rIGlzIHBv aW50aW5nIGF0IHRoZSBzdGFydCBvZgorCQkgKiB0aGUgQ09XIGRldmljZSwgd2hlcmUgdGhl IGZpcnN0IG1ldGFkYXRhIGFyZWEKKwkJICogaXMgd2Uga25vdyB0aGF0IHdlJ3ZlIGhpdCB0 aGUgZW5kIG9mIHRoZQorCQkgKiBleGNlcHRpb25zLiAgVGhlcmVmb3JlIHRoZSBhcmVhIGlz IG5vdCBmdWxsLgorCQkgKi8KKwkJaWYgKGRlLm5ld19jaHVuayA9PSAwTEwpIHsKKwkJCXBz LT5jdXJyZW50X2NvbW1pdHRlZCA9IGk7CisJCQkqZnVsbCA9IDA7CisJCQlicmVhazsKKwkJ fQorCisJCS8qCisJCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHN0YXJ0IG9mIHRoZSBmcmVlIGNo dW5rcy4KKwkJICovCisJCWlmIChwcy0+bmV4dF9mcmVlIDw9IGRlLm5ld19jaHVuaykKKwkJ CXBzLT5uZXh0X2ZyZWUgPSBkZS5uZXdfY2h1bmsgKyAxOworCisJCS8qCisJCSAqIE90aGVy d2lzZSB3ZSBhZGQgdGhlIGV4Y2VwdGlvbiB0byB0aGUgc25hcHNob3QuCisJCSAqLworCQly ID0gZG1fYWRkX2V4Y2VwdGlvbihwcy0+c25hcCwgZGUub2xkX2NodW5rLCBkZS5uZXdfY2h1 bmspOworCQlpZiAocikKKwkJCXJldHVybiByOworCX0KKworCXJldHVybiAwOworfQorCitz dGF0aWMgaW50IHJlYWRfZXhjZXB0aW9ucyhzdHJ1Y3QgcHN0b3JlICpwcykKK3sKKwl1aW50 MzJfdCBhcmVhOworCWludCByLCBmdWxsID0gMTsKKworCS8qCisJICogS2VlcGluZyByZWFk aW5nIGNodW5rcyBhbmQgaW5zZXJ0aW5nIGV4Y2VwdGlvbnMgdW50aWwKKwkgKiB3ZSBmaW5k IGEgcGFydGlhbGx5IGZ1bGwgYXJlYS4KKwkgKi8KKwlmb3IgKGFyZWEgPSAwOyBmdWxsOyBh cmVhKyspIHsKKwkJciA9IGFyZWFfaW8ocHMsIGFyZWEsIFJFQUQpOworCQlpZiAocikKKwkJ CXJldHVybiByOworCisJCXIgPSBpbnNlcnRfZXhjZXB0aW9ucyhwcywgJmZ1bGwpOworCQlp ZiAocikKKwkJCXJldHVybiByOworCisJCWFyZWErKzsKKwl9CisKKwlyZXR1cm4gMDsKK30K Kworc3RhdGljIGlubGluZSBzdHJ1Y3QgcHN0b3JlICpnZXRfaW5mbyhzdHJ1Y3QgZXhjZXB0 aW9uX3N0b3JlICpzdG9yZSkKK3sKKwlyZXR1cm4gKHN0cnVjdCBwc3RvcmUgKikgc3RvcmUt PmNvbnRleHQ7Cit9CisKK3N0YXRpYyBpbnQgcGVyc2lzdGVudF9wZXJjZW50ZnVsbChzdHJ1 Y3QgZXhjZXB0aW9uX3N0b3JlICpzdG9yZSkKK3sKKwlzdHJ1Y3QgcHN0b3JlICpwcyA9IGdl dF9pbmZvKHN0b3JlKTsKKwlyZXR1cm4gKHBzLT5uZXh0X2ZyZWUgKiBzdG9yZS0+c25hcC0+ Y2h1bmtfc2l6ZSAqIDEwMCkgLworCSAgICBnZXRfZGV2X3NpemUoc3RvcmUtPnNuYXAtPmNv dy0+ZGV2KTsKK30KKworc3RhdGljIHZvaWQgcGVyc2lzdGVudF9kZXN0cm95KHN0cnVjdCBl eGNlcHRpb25fc3RvcmUgKnN0b3JlKQoreworCXN0cnVjdCBwc3RvcmUgKnBzID0gZ2V0X2lu Zm8oc3RvcmUpOworCisJdmZyZWUocHMtPmNhbGxiYWNrcyk7CisJZnJlZV9pb2J1Zihwcyk7 CisJa2ZyZWUocHMpOworfQorCitzdGF0aWMgaW50IHBlcnNpc3RlbnRfcHJlcGFyZShzdHJ1 Y3QgZXhjZXB0aW9uX3N0b3JlICpzdG9yZSwKKwkJCSAgICAgIHN0cnVjdCBleGNlcHRpb24g KmUpCit7CisJc3RydWN0IHBzdG9yZSAqcHMgPSBnZXRfaW5mbyhzdG9yZSk7CisJdWludDMy X3Qgc3RyaWRlOworCXNlY3Rvcl90IHNpemUgPSBnZXRfZGV2X3NpemUoc3RvcmUtPnNuYXAt PmNvdy0+ZGV2KTsKKworCS8qIElzIHRoZXJlIGVub3VnaCByb29tID8gKi8KKwlpZiAoc2l6 ZSA8PSAocHMtPm5leHRfZnJlZSAqIHN0b3JlLT5zbmFwLT5jaHVua19zaXplKSkKKwkJcmV0 dXJuIC1FTk9TUEM7CisKKwllLT5uZXdfY2h1bmsgPSBwcy0+bmV4dF9mcmVlOworCisJLyoK KwkgKiBNb3ZlIG9udG8gdGhlIG5leHQgZnJlZSBwZW5kaW5nLCBtYWtpbmcgc3VyZSB0byB0 YWtlCisJICogaW50byBhY2NvdW50IHRoZSBsb2NhdGlvbiBvZiB0aGUgbWV0YWRhdGEgY2h1 bmtzLgorCSAqLworCXN0cmlkZSA9IChwcy0+ZXhjZXB0aW9uc19wZXJfYXJlYSArIDEpOwor CWlmICghKCsrcHMtPm5leHRfZnJlZSAlIHN0cmlkZSkpCisJCXBzLT5uZXh0X2ZyZWUrKzsK KworCWF0b21pY19pbmMoJnBzLT5wZW5kaW5nX2NvdW50KTsKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIHZvaWQgcGVyc2lzdGVudF9jb21taXQoc3RydWN0IGV4Y2VwdGlvbl9zdG9yZSAq c3RvcmUsCisJCQkgICAgICBzdHJ1Y3QgZXhjZXB0aW9uICplLAorCQkJICAgICAgdm9pZCAo KmNhbGxiYWNrKSAodm9pZCAqLCBpbnQgc3VjY2VzcyksCisJCQkgICAgICB2b2lkICpjYWxs YmFja19jb250ZXh0KQoreworCWludCByLCBpOworCXN0cnVjdCBwc3RvcmUgKnBzID0gZ2V0 X2luZm8oc3RvcmUpOworCXN0cnVjdCBkaXNrX2V4Y2VwdGlvbiBkZTsKKwlzdHJ1Y3QgY29t bWl0X2NhbGxiYWNrICpjYjsKKworCWRlLm9sZF9jaHVuayA9IGUtPm9sZF9jaHVuazsKKwlk ZS5uZXdfY2h1bmsgPSBlLT5uZXdfY2h1bms7CisJd3JpdGVfZXhjZXB0aW9uKHBzLCBwcy0+ Y3VycmVudF9jb21taXR0ZWQrKywgJmRlKTsKKworCS8qCisJICogQWRkIHRoZSBjYWxsYmFj ayB0byB0aGUgYmFjayBvZiB0aGUgYXJyYXkuICBUaGlzIGNvZGUKKwkgKiBpcyB0aGUgb25s eSBwbGFjZSB3aGVyZSB0aGUgY2FsbGJhY2sgYXJyYXkgaXMKKwkgKiBtYW5pcHVsYXRlZCwg YW5kIHdlIGtub3cgdGhhdCBpdCB3aWxsIG5ldmVyIGJlIGNhbGxlZAorCSAqIG11bHRpcGxl IHRpbWVzIGNvbmN1cnJlbnRseS4KKwkgKi8KKwljYiA9IHBzLT5jYWxsYmFja3MgKyBwcy0+ Y2FsbGJhY2tfY291bnQrKzsKKwljYi0+Y2FsbGJhY2sgPSBjYWxsYmFjazsKKwljYi0+Y29u dGV4dCA9IGNhbGxiYWNrX2NvbnRleHQ7CisKKwkvKgorCSAqIElmIHRoZXJlIGFyZSBubyBt b3JlIGV4Y2VwdGlvbnMgaW4gZmxpZ2h0LCBvciB3ZSBoYXZlCisJICogZmlsbGVkIHRoaXMg bWV0YWRhdGEgYXJlYSB3ZSBjb21taXQgdGhlIGV4Y2VwdGlvbnMgdG8KKwkgKiBkaXNrLgor CSAqLworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZwcy0+cGVuZGluZ19jb3VudCkgfHwK KwkgICAgKHBzLT5jdXJyZW50X2NvbW1pdHRlZCA9PSBwcy0+ZXhjZXB0aW9uc19wZXJfYXJl YSkpIHsKKwkJciA9IGFyZWFfaW8ocHMsIHBzLT5jdXJyZW50X2FyZWEsIFdSSVRFKTsKKwkJ aWYgKHIpCisJCQlwcy0+dmFsaWQgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBwcy0+Y2Fs bGJhY2tfY291bnQ7IGkrKykgeworCQkJY2IgPSBwcy0+Y2FsbGJhY2tzICsgaTsKKwkJCWNi LT5jYWxsYmFjayhjYi0+Y29udGV4dCwgciA9PSAwID8gMSA6IDApOworCQl9CisKKwkJcHMt PmNhbGxiYWNrX2NvdW50ID0gMDsKKwl9CisKKwkvKgorCSAqIEhhdmUgd2UgY29tcGxldGVs eSBmaWxsZWQgdGhlIGN1cnJlbnQgYXJlYSA/CisJICovCisJaWYgKHBzLT5jdXJyZW50X2Nv bW1pdHRlZCA9PSBwcy0+ZXhjZXB0aW9uc19wZXJfYXJlYSkgeworCQlwcy0+Y3VycmVudF9j b21taXR0ZWQgPSAwOworCQlyID0gemVyb19hcmVhKHBzLCBwcy0+Y3VycmVudF9hcmVhICsg MSk7CisJCWlmIChyKQorCQkJcHMtPnZhbGlkID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lk IHBlcnNpc3RlbnRfZHJvcChzdHJ1Y3QgZXhjZXB0aW9uX3N0b3JlICpzdG9yZSkKK3sKKwlz dHJ1Y3QgcHN0b3JlICpwcyA9IGdldF9pbmZvKHN0b3JlKTsKKworCXBzLT52YWxpZCA9IDA7 CisJaWYgKHdyaXRlX2hlYWRlcihwcykpCisJCURNV0FSTigid3JpdGUgaGVhZGVyIGZhaWxl ZCIpOworfQorCitpbnQgZG1fY3JlYXRlX3BlcnNpc3RlbnQoc3RydWN0IGV4Y2VwdGlvbl9z dG9yZSAqc3RvcmUsIHVpbnQzMl90IGNodW5rX3NpemUpCit7CisJaW50IHIsIG5ld19zbmFw c2hvdDsKKwlzdHJ1Y3QgcHN0b3JlICpwczsKKworCS8qIGFsbG9jYXRlIHRoZSBwc3RvcmUg Ki8KKwlwcyA9IGttYWxsb2Moc2l6ZW9mKCpwcyksIEdGUF9LRVJORUwpOworCWlmICghcHMp CisJCXJldHVybiAtRU5PTUVNOworCisJcHMtPnNuYXAgPSBzdG9yZS0+c25hcDsKKwlwcy0+ dmFsaWQgPSAxOworCXBzLT52ZXJzaW9uID0gU05BUFNIT1RfRElTS19WRVJTSU9OOworCXBz LT5jaHVua19zaXplID0gY2h1bmtfc2l6ZTsKKwlwcy0+ZXhjZXB0aW9uc19wZXJfYXJlYSA9 IChjaHVua19zaXplIDw8IFNFQ1RPUl9TSElGVCkgLworCSAgICBzaXplb2Yoc3RydWN0IGRp c2tfZXhjZXB0aW9uKTsKKwlwcy0+bmV4dF9mcmVlID0gMjsJLyogc2tpcHBpbmcgdGhlIGhl YWRlciBhbmQgZmlyc3QgYXJlYSAqLworCXBzLT5jdXJyZW50X2NvbW1pdHRlZCA9IDA7CisK KwlyID0gYWxsb2NhdGVfaW9idWYocHMpOworCWlmIChyKQorCQlnb3RvIGJhZDsKKworCS8q CisJICogQWxsb2NhdGUgc3BhY2UgZm9yIGFsbCB0aGUgY2FsbGJhY2tzLgorCSAqLworCXBz LT5jYWxsYmFja19jb3VudCA9IDA7CisJYXRvbWljX3NldCgmcHMtPnBlbmRpbmdfY291bnQs IDApOworCXBzLT5jYWxsYmFja3MgPSB2Y2FsbG9jKHBzLT5leGNlcHRpb25zX3Blcl9hcmVh LAorCQkJCXNpemVvZigqcHMtPmNhbGxiYWNrcykpOworCisJaWYgKCFwcy0+Y2FsbGJhY2tz KQorCQlnb3RvIGJhZDsKKworCS8qCisJICogUmVhZCB0aGUgc25hcHNob3QgaGVhZGVyLgor CSAqLworCXIgPSByZWFkX2hlYWRlcihwcywgJm5ld19zbmFwc2hvdCk7CisJaWYgKHIpCisJ CWdvdG8gYmFkOworCisJLyoKKwkgKiBEbyB3ZSBuZWVkIHRvIHNldHVwIGEgbmV3IHNuYXBz aG90ID8KKwkgKi8KKwlpZiAobmV3X3NuYXBzaG90KSB7CisJCXIgPSB3cml0ZV9oZWFkZXIo cHMpOworCQlpZiAocikgeworCQkJRE1XQVJOKCJ3cml0ZV9oZWFkZXIgZmFpbGVkIik7CisJ CQlnb3RvIGJhZDsKKwkJfQorCisJCXIgPSB6ZXJvX2FyZWEocHMsIDApOworCQlpZiAocikg eworCQkJRE1XQVJOKCJ6ZXJvX2FyZWEoMCkgZmFpbGVkIik7CisJCQlnb3RvIGJhZDsKKwkJ fQorCisJfSBlbHNlIHsKKwkJLyoKKwkJICogU2FuaXR5IGNoZWNrcy4KKwkJICovCisJCWlm IChwcy0+Y2h1bmtfc2l6ZSAhPSBjaHVua19zaXplKSB7CisJCQlETVdBUk4oImNodW5rIHNp emUgZm9yIGV4aXN0aW5nIHNuYXBzaG90IGRpZmZlcmVudCAiCisJCQkgICAgICAgImZyb20g dGhhdCByZXF1ZXN0ZWQiKTsKKwkJCXIgPSAtRUlOVkFMOworCQkJZ290byBiYWQ7CisJCX0K KworCQlpZiAocHMtPnZlcnNpb24gIT0gU05BUFNIT1RfRElTS19WRVJTSU9OKSB7CisJCQlE TVdBUk4oInVuYWJsZSB0byBoYW5kbGUgc25hcHNob3QgZGlzayB2ZXJzaW9uICVkIiwKKwkJ CSAgICAgICBwcy0+dmVyc2lvbik7CisJCQlyID0gLUVJTlZBTDsKKwkJCWdvdG8gYmFkOwor CQl9CisKKwkJLyoKKwkJICogUmVhZCB0aGUgbWV0YWRhdGEuCisJCSAqLworCQlyID0gcmVh ZF9leGNlcHRpb25zKHBzKTsKKwkJaWYgKHIpCisJCQlnb3RvIGJhZDsKKwl9CisKKwlzdG9y ZS0+ZGVzdHJveSA9IHBlcnNpc3RlbnRfZGVzdHJveTsKKwlzdG9yZS0+cHJlcGFyZV9leGNl cHRpb24gPSBwZXJzaXN0ZW50X3ByZXBhcmU7CisJc3RvcmUtPmNvbW1pdF9leGNlcHRpb24g PSBwZXJzaXN0ZW50X2NvbW1pdDsKKwlzdG9yZS0+ZHJvcF9zbmFwc2hvdCA9IHBlcnNpc3Rl bnRfZHJvcDsKKwlzdG9yZS0+cGVyY2VudF9mdWxsID0gcGVyc2lzdGVudF9wZXJjZW50ZnVs bDsKKwlzdG9yZS0+Y29udGV4dCA9IHBzOworCisJcmV0dXJuIHI7CisKKyAgICAgIGJhZDoK KwlpZiAocHMpIHsKKwkJaWYgKHBzLT5jYWxsYmFja3MpCisJCQl2ZnJlZShwcy0+Y2FsbGJh Y2tzKTsKKworCQlpZiAocHMtPmlvYnVmKQorCQkJZnJlZV9pb2J1Zihwcyk7CisKKwkJa2Zy ZWUocHMpOworCX0KKwlyZXR1cm4gcjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW1wbGVt ZW50YXRpb24gb2YgdGhlIHN0b3JlIGZvciBub24tcGVyc2lzdGVudCBzbmFwc2hvdHMuCisg Ki0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLSovCitzdHJ1Y3QgdHJhbnNpZW50X2MgeworCXNlY3Rvcl90IG5leHRfZnJl ZTsKK307CisKK3ZvaWQgdHJhbnNpZW50X2Rlc3Ryb3koc3RydWN0IGV4Y2VwdGlvbl9zdG9y ZSAqc3RvcmUpCit7CisJa2ZyZWUoc3RvcmUtPmNvbnRleHQpOworfQorCitpbnQgdHJhbnNp ZW50X3ByZXBhcmUoc3RydWN0IGV4Y2VwdGlvbl9zdG9yZSAqc3RvcmUsIHN0cnVjdCBleGNl cHRpb24gKmUpCit7CisJc3RydWN0IHRyYW5zaWVudF9jICp0YyA9IChzdHJ1Y3QgdHJhbnNp ZW50X2MgKikgc3RvcmUtPmNvbnRleHQ7CisJc2VjdG9yX3Qgc2l6ZSA9IGdldF9kZXZfc2l6 ZShzdG9yZS0+c25hcC0+Y293LT5kZXYpOworCisJaWYgKHNpemUgPCAodGMtPm5leHRfZnJl ZSArIHN0b3JlLT5zbmFwLT5jaHVua19zaXplKSkKKwkJcmV0dXJuIC0xOworCisJZS0+bmV3 X2NodW5rID0gc2VjdG9yX3RvX2NodW5rKHN0b3JlLT5zbmFwLCB0Yy0+bmV4dF9mcmVlKTsK Kwl0Yy0+bmV4dF9mcmVlICs9IHN0b3JlLT5zbmFwLT5jaHVua19zaXplOworCisJcmV0dXJu IDA7Cit9CisKK3ZvaWQgdHJhbnNpZW50X2NvbW1pdChzdHJ1Y3QgZXhjZXB0aW9uX3N0b3Jl ICpzdG9yZSwKKwkJICAgICAgc3RydWN0IGV4Y2VwdGlvbiAqZSwKKwkJICAgICAgdm9pZCAo KmNhbGxiYWNrKSAodm9pZCAqLCBpbnQgc3VjY2VzcyksCisJCSAgICAgIHZvaWQgKmNhbGxi YWNrX2NvbnRleHQpCit7CisJLyogSnVzdCBzdWNjZWVkICovCisJY2FsbGJhY2soY2FsbGJh Y2tfY29udGV4dCwgMSk7Cit9CisKK3N0YXRpYyBpbnQgdHJhbnNpZW50X3BlcmNlbnRmdWxs KHN0cnVjdCBleGNlcHRpb25fc3RvcmUgKnN0b3JlKQoreworCXN0cnVjdCB0cmFuc2llbnRf YyAqdGMgPSAoc3RydWN0IHRyYW5zaWVudF9jICopIHN0b3JlLT5jb250ZXh0OworCXJldHVy biAodGMtPm5leHRfZnJlZSAqIDEwMCkgLyBnZXRfZGV2X3NpemUoc3RvcmUtPnNuYXAtPmNv dy0+ZGV2KTsKK30KKworaW50IGRtX2NyZWF0ZV90cmFuc2llbnQoc3RydWN0IGV4Y2VwdGlv bl9zdG9yZSAqc3RvcmUsCisJCQlzdHJ1Y3QgZG1fc25hcHNob3QgKnMsIGludCBibG9ja3Np emUpCit7CisJc3RydWN0IHRyYW5zaWVudF9jICp0YzsKKworCW1lbXNldChzdG9yZSwgMCwg c2l6ZW9mKCpzdG9yZSkpOworCXN0b3JlLT5kZXN0cm95ID0gdHJhbnNpZW50X2Rlc3Ryb3k7 CisJc3RvcmUtPnByZXBhcmVfZXhjZXB0aW9uID0gdHJhbnNpZW50X3ByZXBhcmU7CisJc3Rv cmUtPmNvbW1pdF9leGNlcHRpb24gPSB0cmFuc2llbnRfY29tbWl0OworCXN0b3JlLT5wZXJj ZW50X2Z1bGwgPSB0cmFuc2llbnRfcGVyY2VudGZ1bGw7CisJc3RvcmUtPnNuYXAgPSBzOwor CisJdGMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHJhbnNpZW50X2MpLCBHRlBfS0VSTkVM KTsKKwlpZiAoIXRjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRjLT5uZXh0X2ZyZWUgPSAw OworCXN0b3JlLT5jb250ZXh0ID0gdGM7CisKKwlyZXR1cm4gMDsKK30KLS0tIGRpZmYvZHJp dmVycy9tZC9kbS1pb2N0bC5jCTE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAw CisrKyBzb3VyY2UvZHJpdmVycy9tZC9kbS1pb2N0bC5jCTIwMDItMTEtMjkgMDk6NDQ6NTku MDAwMDAwMDAwICswMDAwCkBAIC0wLDAgKzEsMTEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAo QykgMjAwMSwgMjAwMiBTaXN0aW5hIFNvZnR3YXJlIChVSykgTGltaXRlZC4KKyAqCisgKiBU aGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworCisjaW5jbHVkZSAi ZG0uaCIKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Zt YWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXRtYWMuaD4KKyNpbmNsdWRlIDxsaW51 eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG0taW9jdGwuaD4KKyNpbmNsdWRl IDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxp bnV4L2Jsay5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2RlZmluZSBETV9EUklW RVJfRU1BSUwgImRtQHVrLnNpc3RpbmEuY29tIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGUg aW9jdGwgaW50ZXJmYWNlIG5lZWRzIHRvIGJlIGFibGUgdG8gbG9vayB1cCBkZXZpY2VzIGJ5 CisgKiBuYW1lIG9yIHV1aWQuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdHJ1Y3QgaGFzaF9jZWxsIHsK KwlzdHJ1Y3QgbGlzdF9oZWFkIG5hbWVfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHV1aWRf bGlzdDsKKworCWNoYXIgKm5hbWU7CisJY2hhciAqdXVpZDsKKwlzdHJ1Y3QgbWFwcGVkX2Rl dmljZSAqbWQ7CisKKwkvKiBJIGhhdGUgZGV2ZnMgKi8KKwlkZXZmc19oYW5kbGVfdCBkZXZm c19lbnRyeTsKK307CisKKyNkZWZpbmUgTlVNX0JVQ0tFVFMgNjQKKyNkZWZpbmUgTUFTS19C VUNLRVRTIChOVU1fQlVDS0VUUyAtIDEpCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBfbmFt ZV9idWNrZXRzW05VTV9CVUNLRVRTXTsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIF91dWlk X2J1Y2tldHNbTlVNX0JVQ0tFVFNdOworCitzdGF0aWMgZGV2ZnNfaGFuZGxlX3QgX2Rldl9k aXI7Cit2b2lkIGRtX2hhc2hfcmVtb3ZlX2FsbCh2b2lkKTsKKworLyoKKyAqIEd1YXJkcyBh Y2Nlc3MgdG8gYWxsIHRocmVlIHRhYmxlcy4KKyAqLworc3RhdGljIERFQ0xBUkVfUldTRU0o X2hhc2hfbG9jayk7CisKK3N0YXRpYyB2b2lkIGluaXRfYnVja2V0cyhzdHJ1Y3QgbGlzdF9o ZWFkICpidWNrZXRzKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8 IE5VTV9CVUNLRVRTOyBpKyspCisJCUlOSVRfTElTVF9IRUFEKGJ1Y2tldHMgKyBpKTsKK30K KworaW50IGRtX2hhc2hfaW5pdCh2b2lkKQoreworCWluaXRfYnVja2V0cyhfbmFtZV9idWNr ZXRzKTsKKwlpbml0X2J1Y2tldHMoX3V1aWRfYnVja2V0cyk7CisJX2Rldl9kaXIgPSBkZXZm c19ta19kaXIoMCwgRE1fRElSLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBkbV9o YXNoX2V4aXQodm9pZCkKK3sKKwlkbV9oYXNoX3JlbW92ZV9hbGwoKTsKKwlkZXZmc191bnJl Z2lzdGVyKF9kZXZfZGlyKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSGFzaCBmdW5jdGlv bjoKKyAqIFdlJ3JlIG5vdCByZWFsbHkgY29uY2VybmVkIHdpdGggdGhlIHN0ciBoYXNoIGZ1 bmN0aW9uIGJlaW5nCisgKiBmYXN0IHNpbmNlIGl0J3Mgb25seSB1c2VkIGJ5IHRoZSBpb2N0 bCBpbnRlcmZhY2UuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdW5zaWduZWQgaW50IGhhc2hf c3RyKGNvbnN0IGNoYXIgKnN0cikKK3sKKwljb25zdCB1bnNpZ25lZCBpbnQgaGFzaF9tdWx0 ID0gMjY1NDQzNTM4N1U7CisJdW5zaWduZWQgaW50IGggPSAwOworCisJd2hpbGUgKCpzdHIp CisJCWggPSAoaCArICh1bnNpZ25lZCBpbnQpICpzdHIrKykgKiBoYXNoX211bHQ7CisKKwly ZXR1cm4gaCAmIE1BU0tfQlVDS0VUUzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29kZSBm b3IgbG9va2luZyB1cCBhIGRldmljZSBieSBuYW1lCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMg c3RydWN0IGhhc2hfY2VsbCAqX19nZXRfbmFtZV9jZWxsKGNvbnN0IGNoYXIgKnN0cikKK3sK KwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJc3RydWN0IGhhc2hfY2VsbCAqaGM7CisJdW5z aWduZWQgaW50IGggPSBoYXNoX3N0cihzdHIpOworCisJbGlzdF9mb3JfZWFjaCAodG1wLCBf bmFtZV9idWNrZXRzICsgaCkgeworCQloYyA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgaGFz aF9jZWxsLCBuYW1lX2xpc3QpOworCQlpZiAoIXN0cmNtcChoYy0+bmFtZSwgc3RyKSkKKwkJ CXJldHVybiBoYzsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBo YXNoX2NlbGwgKl9fZ2V0X3V1aWRfY2VsbChjb25zdCBjaGFyICpzdHIpCit7CisJc3RydWN0 IGxpc3RfaGVhZCAqdG1wOworCXN0cnVjdCBoYXNoX2NlbGwgKmhjOworCXVuc2lnbmVkIGlu dCBoID0gaGFzaF9zdHIoc3RyKTsKKworCWxpc3RfZm9yX2VhY2ggKHRtcCwgX3V1aWRfYnVj a2V0cyArIGgpIHsKKwkJaGMgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGhhc2hfY2VsbCwg dXVpZF9saXN0KTsKKwkJaWYgKCFzdHJjbXAoaGMtPnV1aWQsIHN0cikpCisJCQlyZXR1cm4g aGM7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluc2Vy dGluZywgcmVtb3ZpbmcgYW5kIHJlbmFtaW5nIGEgZGV2aWNlLgorICotLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwor c3RhdGljIGlubGluZSBjaGFyICprc3RyZHVwKGNvbnN0IGNoYXIgKnN0cikKK3sKKwljaGFy ICpyID0ga21hbGxvYyhzdHJsZW4oc3RyKSArIDEsIEdGUF9LRVJORUwpOworCWlmIChyKQor CQlzdHJjcHkociwgc3RyKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHN0cnVjdCBoYXNo X2NlbGwgKmFsbG9jX2NlbGwoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdXVpZCwK KwkJCQkgICAgc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKQoreworCXN0cnVjdCBoYXNoX2Nl bGwgKmhjOworCisJaGMgPSBrbWFsbG9jKHNpemVvZigqaGMpLCBHRlBfS0VSTkVMKTsKKwlp ZiAoIWhjKQorCQlyZXR1cm4gTlVMTDsKKworCWhjLT5uYW1lID0ga3N0cmR1cChuYW1lKTsK KwlpZiAoIWhjLT5uYW1lKSB7CisJCWtmcmVlKGhjKTsKKwkJcmV0dXJuIE5VTEw7CisJfQor CisJaWYgKCF1dWlkKQorCQloYy0+dXVpZCA9IE5VTEw7CisKKwllbHNlIHsKKwkJaGMtPnV1 aWQgPSBrc3RyZHVwKHV1aWQpOworCQlpZiAoIWhjLT51dWlkKSB7CisJCQlrZnJlZShoYy0+ bmFtZSk7CisJCQlrZnJlZShoYyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCUlO SVRfTElTVF9IRUFEKCZoYy0+bmFtZV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaGMtPnV1 aWRfbGlzdCk7CisJaGMtPm1kID0gbWQ7CisJcmV0dXJuIGhjOworfQorCitzdGF0aWMgdm9p ZCBmcmVlX2NlbGwoc3RydWN0IGhhc2hfY2VsbCAqaGMpCit7CisJaWYgKGhjKSB7CisJCWtm cmVlKGhjLT5uYW1lKTsKKwkJa2ZyZWUoaGMtPnV1aWQpOworCQlrZnJlZShoYyk7CisJfQor fQorCisvKgorICogZGV2ZnMgc3R1ZmYuCisgKi8KK3N0YXRpYyBpbnQgcmVnaXN0ZXJfd2l0 aF9kZXZmcyhzdHJ1Y3QgaGFzaF9jZWxsICpoYykKK3sKKwlrZGV2X3QgZGV2ID0gZG1fa2Rl dihoYy0+bWQpOworCisJaGMtPmRldmZzX2VudHJ5ID0KKwkgICAgZGV2ZnNfcmVnaXN0ZXIo X2Rldl9kaXIsIGhjLT5uYW1lLCBERVZGU19GTF9DVVJSRU5UX09XTkVSLAorCQkJICAgbWFq b3IoZGV2KSwgbWlub3IoZGV2KSwKKwkJCSAgIFNfSUZCTEsgfCBTX0lSVVNSIHwgU19JV1VT UiB8IFNfSVJHUlAsCisJCQkgICAmZG1fYmxrX2RvcHMsIE5VTEwpOworCisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyBpbnQgdW5yZWdpc3Rlcl93aXRoX2RldmZzKHN0cnVjdCBoYXNoX2Nl bGwgKmhjKQoreworCWRldmZzX3VucmVnaXN0ZXIoaGMtPmRldmZzX2VudHJ5KTsKKwlyZXR1 cm4gMDsKK30KKworLyoKKyAqIFRoZSBrZGV2X3QgYW5kIHV1aWQgb2YgYSBkZXZpY2UgY2Fu IG5ldmVyIGNoYW5nZSBvbmNlIGl0IGlzCisgKiBpbml0aWFsbHkgaW5zZXJ0ZWQuCisgKi8K K2ludCBkbV9oYXNoX2luc2VydChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp1dWlk LCBzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpCit7CisJc3RydWN0IGhhc2hfY2VsbCAqY2Vs bDsKKworCS8qCisJICogQWxsb2NhdGUgdGhlIG5ldyBjZWxscy4KKwkgKi8KKwljZWxsID0g YWxsb2NfY2VsbChuYW1lLCB1dWlkLCBtZCk7CisJaWYgKCFjZWxsKQorCQlyZXR1cm4gLUVO T01FTTsKKworCS8qCisJICogSW5zZXJ0IHRoZSBjZWxsIGludG8gYWxsIHRocmVlIGhhc2gg dGFibGVzLgorCSAqLworCWRvd25fd3JpdGUoJl9oYXNoX2xvY2spOworCWlmIChfX2dldF9u YW1lX2NlbGwobmFtZSkpCisJCWdvdG8gYmFkOworCisJbGlzdF9hZGQoJmNlbGwtPm5hbWVf bGlzdCwgX25hbWVfYnVja2V0cyArIGhhc2hfc3RyKG5hbWUpKTsKKworCWlmICh1dWlkKSB7 CisJCWlmIChfX2dldF91dWlkX2NlbGwodXVpZCkpIHsKKwkJCWxpc3RfZGVsKCZjZWxsLT5u YW1lX2xpc3QpOworCQkJZ290byBiYWQ7CisJCX0KKwkJbGlzdF9hZGQoJmNlbGwtPnV1aWRf bGlzdCwgX3V1aWRfYnVja2V0cyArIGhhc2hfc3RyKHV1aWQpKTsKKwl9CisJcmVnaXN0ZXJf d2l0aF9kZXZmcyhjZWxsKTsKKwlkbV9nZXQobWQpOworCXVwX3dyaXRlKCZfaGFzaF9sb2Nr KTsKKworCXJldHVybiAwOworCisgYmFkOgorCXVwX3dyaXRlKCZfaGFzaF9sb2NrKTsKKwlm cmVlX2NlbGwoY2VsbCk7CisJcmV0dXJuIC1FQlVTWTsKK30KKwordm9pZCBfX2hhc2hfcmVt b3ZlKHN0cnVjdCBoYXNoX2NlbGwgKmhjKQoreworCS8qIHJlbW92ZSBmcm9tIHRoZSBkZXYg aGFzaCAqLworCWxpc3RfZGVsKCZoYy0+dXVpZF9saXN0KTsKKwlsaXN0X2RlbCgmaGMtPm5h bWVfbGlzdCk7CisJdW5yZWdpc3Rlcl93aXRoX2RldmZzKGhjKTsKKwlkbV9wdXQoaGMtPm1k KTsKK30KKwordm9pZCBkbV9oYXNoX3JlbW92ZV9hbGwodm9pZCkKK3sKKwlpbnQgaTsKKwlz dHJ1Y3QgaGFzaF9jZWxsICpoYzsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXAsICpuOworCisJ ZG93bl93cml0ZSgmX2hhc2hfbG9jayk7CisJZm9yIChpID0gMDsgaSA8IE5VTV9CVUNLRVRT OyBpKyspIHsKKwkJbGlzdF9mb3JfZWFjaF9zYWZlICh0bXAsIG4sIF9uYW1lX2J1Y2tldHMg KyBpKSB7CisJCQloYyA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgaGFzaF9jZWxsLCBuYW1l X2xpc3QpOworCQkJX19oYXNoX3JlbW92ZShoYyk7CisJCX0KKwl9CisJdXBfd3JpdGUoJl9o YXNoX2xvY2spOworfQorCitpbnQgZG1faGFzaF9yZW5hbWUoY29uc3QgY2hhciAqb2xkLCBj b25zdCBjaGFyICpuZXcpCit7CisJY2hhciAqbmV3X25hbWUsICpvbGRfbmFtZTsKKwlzdHJ1 Y3QgaGFzaF9jZWxsICpoYzsKKworCS8qCisJICogZHVwbGljYXRlIG5ldy4KKwkgKi8KKwlu ZXdfbmFtZSA9IGtzdHJkdXAobmV3KTsKKwlpZiAoIW5ld19uYW1lKQorCQlyZXR1cm4gLUVO T01FTTsKKworCWRvd25fd3JpdGUoJl9oYXNoX2xvY2spOworCisJLyoKKwkgKiBJcyBuZXcg ZnJlZSA/CisJICovCisJaGMgPSBfX2dldF9uYW1lX2NlbGwobmV3KTsKKwlpZiAoaGMpIHsK KwkJRE1XQVJOKCJhc2tlZCB0byByZW5hbWUgdG8gYW4gYWxyZWFkeSBleGlzdGluZyBuYW1l ICVzIC0+ICVzIiwKKwkJICAgICAgIG9sZCwgbmV3KTsKKwkJdXBfd3JpdGUoJl9oYXNoX2xv Y2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8qCisJICogSXMgdGhlcmUgc3VjaCBh IGRldmljZSBhcyAnb2xkJyA/CisJICovCisJaGMgPSBfX2dldF9uYW1lX2NlbGwob2xkKTsK KwlpZiAoIWhjKSB7CisJCURNV0FSTigiYXNrZWQgdG8gcmVuYW1lIGEgbm9uIGV4aXN0ZW50 IGRldmljZSAlcyAtPiAlcyIsCisJCSAgICAgICBvbGQsIG5ldyk7CisJCXVwX3dyaXRlKCZf aGFzaF9sb2NrKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwkvKgorCSAqIHJlbmFtZSBh bmQgbW92ZSB0aGUgbmFtZSBjZWxsLgorCSAqLworCWxpc3RfZGVsKCZoYy0+bmFtZV9saXN0 KTsKKwlvbGRfbmFtZSA9IGhjLT5uYW1lOworCWhjLT5uYW1lID0gbmV3X25hbWU7CisJbGlz dF9hZGQoJmhjLT5uYW1lX2xpc3QsIF9uYW1lX2J1Y2tldHMgKyBoYXNoX3N0cihuZXdfbmFt ZSkpOworCisJLyogcmVuYW1lIHRoZSBkZXZpY2Ugbm9kZSBpbiBkZXZmcyAqLworCXVucmVn aXN0ZXJfd2l0aF9kZXZmcyhoYyk7CisJcmVnaXN0ZXJfd2l0aF9kZXZmcyhoYyk7CisKKwl1 cF93cml0ZSgmX2hhc2hfbG9jayk7CisJa2ZyZWUob2xkX25hbWUpOworCXJldHVybiAwOwor fQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBpb2N0bCBj b21tYW5kcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogQWxsIHRoZSBpb2N0bCBjb21tYW5k cyBnZXQgZGlzcGF0Y2hlZCB0byBmdW5jdGlvbnMgd2l0aCB0aGlzCisgKiBwcm90b3R5cGUu CisgKi8KK3R5cGVkZWYgaW50ICgqaW9jdGxfZm4pKHN0cnVjdCBkbV9pb2N0bCAqcGFyYW0s IHN0cnVjdCBkbV9pb2N0bCAqdXNlcik7CisKKy8qCisgKiBDaGVjayBhIHN0cmluZyBkb2Vz bid0IG92ZXJydW4gdGhlIGNodW5rIG9mCisgKiBtZW1vcnkgd2UgY29waWVkIGZyb20gdXNl cmxhbmQuCisgKi8KK3N0YXRpYyBpbnQgdmFsaWRfc3RyKGNoYXIgKnN0ciwgdm9pZCAqYmVn aW4sIHZvaWQgKmVuZCkKK3sKKwl3aGlsZSAoKCh2b2lkICopIHN0ciA+PSBiZWdpbikgJiYg KCh2b2lkICopIHN0ciA8IGVuZCkpCisJCWlmICghKnN0cisrKQorCQkJcmV0dXJuIDA7CisK KwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBuZXh0X3RhcmdldChzdHJ1Y3Qg ZG1fdGFyZ2V0X3NwZWMgKmxhc3QsIHVpbnQzMl90IG5leHQsCisJCSAgICAgICB2b2lkICpi ZWdpbiwgdm9pZCAqZW5kLAorCQkgICAgICAgc3RydWN0IGRtX3RhcmdldF9zcGVjICoqc3Bl YywgY2hhciAqKnBhcmFtcykKK3sKKwkqc3BlYyA9IChzdHJ1Y3QgZG1fdGFyZ2V0X3NwZWMg KikKKwkgICAgKCh1bnNpZ25lZCBjaGFyICopIGxhc3QgKyBuZXh0KTsKKwkqcGFyYW1zID0g KGNoYXIgKikgKCpzcGVjICsgMSk7CisKKwlpZiAoKnNwZWMgPCAobGFzdCArIDEpIHx8ICgo dm9pZCAqKSAqc3BlYyA+IGVuZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHZh bGlkX3N0cigqcGFyYW1zLCBiZWdpbiwgZW5kKTsKK30KKworc3RhdGljIGludCBwb3B1bGF0 ZV90YWJsZShzdHJ1Y3QgZG1fdGFibGUgKnRhYmxlLCBzdHJ1Y3QgZG1faW9jdGwgKmFyZ3Mp Cit7CisJaW50IGkgPSAwLCByLCBmaXJzdCA9IDE7CisJc3RydWN0IGRtX3RhcmdldF9zcGVj ICpzcGVjOworCWNoYXIgKnBhcmFtczsKKwl2b2lkICpiZWdpbiwgKmVuZDsKKworCWlmICgh YXJncy0+dGFyZ2V0X2NvdW50KSB7CisJCURNV0FSTigicG9wdWxhdGVfdGFibGU6IG5vIHRh cmdldHMgc3BlY2lmaWVkIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJlZ2luID0g KHZvaWQgKikgYXJnczsKKwllbmQgPSBiZWdpbiArIGFyZ3MtPmRhdGFfc2l6ZTsKKworCWZv ciAoaSA9IDA7IGkgPCBhcmdzLT50YXJnZXRfY291bnQ7IGkrKykgeworCisJCWlmIChmaXJz dCkKKwkJCXIgPSBuZXh0X3RhcmdldCgoc3RydWN0IGRtX3RhcmdldF9zcGVjICopIGFyZ3Ms CisJCQkJCWFyZ3MtPmRhdGFfc3RhcnQsCisJCQkJCWJlZ2luLCBlbmQsICZzcGVjLCAmcGFy YW1zKTsKKwkJZWxzZQorCQkJciA9IG5leHRfdGFyZ2V0KHNwZWMsIHNwZWMtPm5leHQsIGJl Z2luLCBlbmQsCisJCQkJCSZzcGVjLCAmcGFyYW1zKTsKKworCQlpZiAocikgeworCQkJRE1X QVJOKCJ1bmFibGUgdG8gZmluZCB0YXJnZXQiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9 CisKKwkJciA9IGRtX3RhYmxlX2FkZF90YXJnZXQodGFibGUsIHNwZWMtPnRhcmdldF90eXBl LAorCQkJCQlzcGVjLT5zZWN0b3Jfc3RhcnQsIHNwZWMtPmxlbmd0aCwKKwkJCQkJcGFyYW1z KTsKKwkJaWYgKHIpIHsKKwkJCURNV0FSTigiaW50ZXJuYWwgZXJyb3IgYWRkaW5nIHRhcmdl dCB0byB0YWJsZSIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlmaXJzdCA9IDA7 CisJfQorCisJcmV0dXJuIGRtX3RhYmxlX2NvbXBsZXRlKHRhYmxlKTsKK30KKworLyoKKyAq IFJvdW5kIHVwIHRoZSBwdHIgdG8gdGhlIG5leHQgJ2FsaWduJyBib3VuZGFyeS4gIE9idmlv dXNseQorICogJ2FsaWduJyBtdXN0IGJlIGEgcG93ZXIgb2YgMi4KKyAqLworc3RhdGljIGlu bGluZSB2b2lkICphbGlnbl9wdHIodm9pZCAqcHRyLCB1bnNpZ25lZCBpbnQgYWxpZ24pCit7 CisJYWxpZ24tLTsKKwlyZXR1cm4gKHZvaWQgKikgKCgodW5zaWduZWQgbG9uZykgKHB0ciAr IGFsaWduKSkgJiB+YWxpZ24pOworfQorCisvKgorICogQ29waWVzIGEgZG1faW9jdGwgYW5k IGFuIG9wdGlvbmFsIGFkZGl0aW9uYWwgcGF5bG9hZCB0bworICogdXNlcmxhbmQuCisgKi8K K3N0YXRpYyBpbnQgcmVzdWx0c190b191c2VyKHN0cnVjdCBkbV9pb2N0bCAqdXNlciwgc3Ry dWN0IGRtX2lvY3RsICpwYXJhbSwKKwkJCSAgIHZvaWQgKmRhdGEsIHVpbnQzMl90IGxlbikK K3sKKwlpbnQgcjsKKwl2b2lkICpwdHIgPSBOVUxMOworCisJaWYgKGRhdGEpIHsKKwkJcHRy ID0gYWxpZ25fcHRyKHVzZXIgKyAxLCBzaXplb2YodW5zaWduZWQgbG9uZykpOworCQlwYXJh bS0+ZGF0YV9zdGFydCA9IHB0ciAtICh2b2lkICopIHVzZXI7CisJfQorCisJLyoKKwkgKiBU aGUgdmVyc2lvbiBudW1iZXIgaGFzIGFscmVhZHkgYmVlbiBmaWxsZWQgaW4sIHNvIHdlCisJ ICoganVzdCBjb3B5IGxhdGVyIGZpZWxkcy4KKwkgKi8KKwlyID0gY29weV90b191c2VyKCZ1 c2VyLT5kYXRhX3NpemUsICZwYXJhbS0+ZGF0YV9zaXplLAorCQkJIHNpemVvZigqcGFyYW0p IC0gc2l6ZW9mKHBhcmFtLT52ZXJzaW9uKSk7CisJaWYgKHIpCisJCXJldHVybiAtRUZBVUxU OworCisJaWYgKGRhdGEpIHsKKwkJaWYgKHBhcmFtLT5kYXRhX3N0YXJ0ICsgbGVuID4gcGFy YW0tPmRhdGFfc2l6ZSkKKwkJCXJldHVybiAtRU5PU1BDOworCisJCWlmIChjb3B5X3RvX3Vz ZXIocHRyLCBkYXRhLCBsZW4pKQorCQkJciA9IC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIHI7 Cit9CisKKy8qCisgKiBGaWxscyBpbiBhIGRtX2lvY3RsIHN0cnVjdHVyZSwgcmVhZHkgZm9y IHNlbmRpbmcgYmFjayB0bworICogdXNlcmxhbmQuCisgKi8KK3N0YXRpYyBpbnQgX19pbmZv KHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCwgc3RydWN0IGRtX2lvY3RsICpwYXJhbSkKK3sK KwlrZGV2X3QgZGV2ID0gZG1fa2RldihtZCk7CisJc3RydWN0IGRtX3RhYmxlICp0YWJsZTsK KwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OworCisJcGFyYW0tPmZsYWdzID0gRE1fRVhJ U1RTX0ZMQUc7CisJaWYgKGRtX3N1c3BlbmRlZChtZCkpCisJCXBhcmFtLT5mbGFncyB8PSBE TV9TVVNQRU5EX0ZMQUc7CisKKwlwYXJhbS0+ZGV2ID0ga2Rldl90X3RvX25yKGRldik7CisJ YmRldiA9IGJkZ2V0KHBhcmFtLT5kZXYpOworCWlmICghYmRldikKKwkJcmV0dXJuIC1FTlhJ TzsKKworCXBhcmFtLT5vcGVuX2NvdW50ID0gYmRldi0+YmRfb3BlbmVyczsKKwliZHB1dChi ZGV2KTsKKworCWlmIChpc19yZWFkX29ubHkoZGV2KSkKKwkJcGFyYW0tPmZsYWdzIHw9IERN X1JFQURPTkxZX0ZMQUc7CisKKwl0YWJsZSA9IGRtX2dldF90YWJsZShtZCk7CisJcGFyYW0t PnRhcmdldF9jb3VudCA9IGRtX3RhYmxlX2dldF9udW1fdGFyZ2V0cyh0YWJsZSk7CisJZG1f dGFibGVfcHV0KHRhYmxlKTsKKworCXJldHVybiAwOworfQorCisvKgorICogQWx3YXlzIHVz ZSBVVUlEIGZvciBsb29rdXBzIGlmIGl0J3MgcHJlc2VudCwgb3RoZXJ3aXNlIHVzZSBuYW1l LgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtYXBwZWRfZGV2aWNlICpmaW5kX2Rldmlj ZShzdHJ1Y3QgZG1faW9jdGwgKnBhcmFtKQoreworCXN0cnVjdCBoYXNoX2NlbGwgKmhjOwor CXN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCA9IE5VTEw7CisKKwlkb3duX3JlYWQoJl9oYXNo X2xvY2spOworCWhjID0gKnBhcmFtLT51dWlkID8gX19nZXRfdXVpZF9jZWxsKHBhcmFtLT51 dWlkKSA6CisJCV9fZ2V0X25hbWVfY2VsbChwYXJhbS0+bmFtZSk7CisJaWYgKGhjKSB7CisJ CW1kID0gaGMtPm1kOworCisJCS8qCisJCSAqIFNuZWFraWx5IHdyaXRlIGluIGJvdGggdGhl IG5hbWUgYW5kIHRoZSB1dWlkCisJCSAqIHdoaWxlIHdlIGhhdmUgdGhlIGNlbGwuCisJCSAq LworCQlzdHJuY3B5KHBhcmFtLT5uYW1lLCBoYy0+bmFtZSwgc2l6ZW9mKHBhcmFtLT5uYW1l KSk7CisJCWlmIChoYy0+dXVpZCkKKwkJCXN0cm5jcHkocGFyYW0tPnV1aWQsIGhjLT51dWlk LCBzaXplb2YocGFyYW0tPnV1aWQpIC0gMSk7CisJCWVsc2UKKwkJCXBhcmFtLT51dWlkWzBd ID0gJ1wwJzsKKworCQlkbV9nZXQobWQpOworCX0KKwl1cF9yZWFkKCZfaGFzaF9sb2NrKTsK KworCXJldHVybiBtZDsKK30KKworI2RlZmluZSBBTElHTk1FTlQgc2l6ZW9mKGludCkKK3N0 YXRpYyB2b2lkICpfYWxpZ24odm9pZCAqcHRyLCB1bnNpZ25lZCBpbnQgYSkKK3sKKwlyZWdp c3RlciB1bnNpZ25lZCBsb25nIGFsaWduID0gLS1hOworCisJcmV0dXJuICh2b2lkICopICgo KHVuc2lnbmVkIGxvbmcpIHB0ciArIGFsaWduKSAmIH5hbGlnbik7Cit9CisKKy8qCisgKiBD b3BpZXMgZGV2aWNlIGluZm8gYmFjayB0byB1c2VyIHNwYWNlLCB1c2VkIGJ5CisgKiB0aGUg Y3JlYXRlIGFuZCBpbmZvIGlvY3Rscy4KKyAqLworc3RhdGljIGludCBpbmZvKHN0cnVjdCBk bV9pb2N0bCAqcGFyYW0sIHN0cnVjdCBkbV9pb2N0bCAqdXNlcikKK3sKKwlzdHJ1Y3QgbWFw cGVkX2RldmljZSAqbWQ7CisKKwlwYXJhbS0+ZmxhZ3MgPSAwOworCisJbWQgPSBmaW5kX2Rl dmljZShwYXJhbSk7CisJaWYgKCFtZCkKKwkJLyoKKwkJICogRGV2aWNlIG5vdCBmb3VuZCAt IHJldHVybnMgY2xlYXJlZCBleGlzdHMgZmxhZy4KKwkJICovCisJCWdvdG8gb3V0OworCisJ X19pbmZvKG1kLCBwYXJhbSk7CisJZG1fcHV0KG1kKTsKKworICAgICAgb3V0OgorCXJldHVy biByZXN1bHRzX3RvX3VzZXIodXNlciwgcGFyYW0sIE5VTEwsIDApOworfQorCitzdGF0aWMg aW5saW5lIGludCBnZXRfbW9kZShzdHJ1Y3QgZG1faW9jdGwgKnBhcmFtKQoreworCWludCBt b2RlID0gRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFOworCisJaWYgKHBhcmFtLT5mbGFncyAm IERNX1JFQURPTkxZX0ZMQUcpCisJCW1vZGUgPSBGTU9ERV9SRUFEOworCisJcmV0dXJuIG1v ZGU7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfbmFtZShjb25zdCBjaGFyICpuYW1lKQorewor CWlmIChzdHJjaHIobmFtZSwgJy8nKSkgeworCQlETVdBUk4oImludmFsaWQgZGV2aWNlIG5h bWUiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRp YyBpbnQgY3JlYXRlKHN0cnVjdCBkbV9pb2N0bCAqcGFyYW0sIHN0cnVjdCBkbV9pb2N0bCAq dXNlcikKK3sKKwlpbnQgcjsKKwlrZGV2X3QgZGV2OworCXN0cnVjdCBkbV90YWJsZSAqdDsK KwlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQ7CisJaW50IG1pbm9yOworCisJciA9IGNoZWNr X25hbWUocGFyYW0tPm5hbWUpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSBkbV90 YWJsZV9jcmVhdGUoJnQsIGdldF9tb2RlKHBhcmFtKSk7CisJaWYgKHIpCisJCXJldHVybiBy OworCisJciA9IHBvcHVsYXRlX3RhYmxlKHQsIHBhcmFtKTsKKwlpZiAocikgeworCQlkbV90 YWJsZV9wdXQodCk7CisJCXJldHVybiByOworCX0KKworCW1pbm9yID0gKHBhcmFtLT5mbGFn cyAmIERNX1BFUlNJU1RFTlRfREVWX0ZMQUcpID8KKwkJbWlub3IodG9fa2Rldl90KHBhcmFt LT5kZXYpKSA6IC0xOworCisJciA9IGRtX2NyZWF0ZShtaW5vciwgdCwgJm1kKTsKKwlpZiAo cikgeworCQlkbV90YWJsZV9wdXQodCk7CisJCXJldHVybiByOworCX0KKwlkbV90YWJsZV9w dXQodCk7CS8qIG1kIHdpbGwgaGF2ZSBncmFiYmVkIGl0cyBvd24gcmVmZXJlbmNlICovCisK KwlkZXYgPSBkbV9rZGV2KG1kKTsKKwlzZXRfZGV2aWNlX3JvKGRldiwgKHBhcmFtLT5mbGFn cyAmIERNX1JFQURPTkxZX0ZMQUcpKTsKKwlyID0gZG1faGFzaF9pbnNlcnQocGFyYW0tPm5h bWUsICpwYXJhbS0+dXVpZCA/IHBhcmFtLT51dWlkIDogTlVMTCwgbWQpOworCWRtX3B1dCht ZCk7CisKKwlyZXR1cm4gciA/IHIgOiBpbmZvKHBhcmFtLCB1c2VyKTsKK30KKworLyoKKyAq IEJ1aWxkIHVwIHRoZSBzdGF0dXMgc3RydWN0IGZvciBlYWNoIHRhcmdldAorICovCitzdGF0 aWMgaW50IF9fc3RhdHVzKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCwgc3RydWN0IGRtX2lv Y3RsICpwYXJhbSwKKwkJICAgIGNoYXIgKm91dGJ1ZiwgaW50ICpsZW4pCit7CisJaW50IGks IG51bV90YXJnZXRzOworCXN0cnVjdCBkbV90YXJnZXRfc3BlYyAqc3BlYzsKKwljaGFyICpv dXRwdHI7CisJc3RhdHVzX3R5cGVfdCB0eXBlOworCXN0cnVjdCBkbV90YWJsZSAqdGFibGUg PSBkbV9nZXRfdGFibGUobWQpOworCisJaWYgKHBhcmFtLT5mbGFncyAmIERNX1NUQVRVU19U QUJMRV9GTEFHKQorCQl0eXBlID0gU1RBVFVTVFlQRV9UQUJMRTsKKwllbHNlCisJCXR5cGUg PSBTVEFUVVNUWVBFX0lORk87CisKKwlvdXRwdHIgPSBvdXRidWY7CisKKwkvKiBHZXQgYWxs IHRoZSB0YXJnZXQgaW5mbyAqLworCW51bV90YXJnZXRzID0gZG1fdGFibGVfZ2V0X251bV90 YXJnZXRzKHRhYmxlKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3RhcmdldHM7IGkrKykgewor CQlzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSA9IGRtX3RhYmxlX2dldF90YXJnZXQodGFibGUsIGkp OworCisJCWlmIChvdXRwdHIgLSBvdXRidWYgKworCQkgICAgc2l6ZW9mKHN0cnVjdCBkbV90 YXJnZXRfc3BlYykgPiBwYXJhbS0+ZGF0YV9zaXplKSB7CisJCQlkbV90YWJsZV9wdXQodGFi bGUpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlzcGVjID0gKHN0cnVjdCBkbV90 YXJnZXRfc3BlYyAqKSBvdXRwdHI7CisKKwkJc3BlYy0+c3RhdHVzID0gMDsKKwkJc3BlYy0+ c2VjdG9yX3N0YXJ0ID0gdGktPmJlZ2luOworCQlzcGVjLT5sZW5ndGggPSB0aS0+bGVuOwor CQlzdHJuY3B5KHNwZWMtPnRhcmdldF90eXBlLCB0aS0+dHlwZS0+bmFtZSwKKwkJCXNpemVv ZihzcGVjLT50YXJnZXRfdHlwZSkpOworCisJCW91dHB0ciArPSBzaXplb2Yoc3RydWN0IGRt X3RhcmdldF9zcGVjKTsKKworCQkvKiBHZXQgdGhlIHN0YXR1cy90YWJsZSBzdHJpbmcgZnJv bSB0aGUgdGFyZ2V0IGRyaXZlciAqLworCQlpZiAodGktPnR5cGUtPnN0YXR1cykKKwkJCXRp LT50eXBlLT5zdGF0dXModGksIHR5cGUsIG91dHB0ciwKKwkJCQkJIG91dGJ1ZiArIHBhcmFt LT5kYXRhX3NpemUgLSBvdXRwdHIpOworCQllbHNlCisJCQlvdXRwdHJbMF0gPSAnXDAnOwor CisJCW91dHB0ciArPSBzdHJsZW4ob3V0cHRyKSArIDE7CisJCV9hbGlnbihvdXRwdHIsIEFM SUdOTUVOVCk7CisJCXNwZWMtPm5leHQgPSBvdXRwdHIgLSBvdXRidWY7CisJfQorCisJcGFy YW0tPnRhcmdldF9jb3VudCA9IG51bV90YXJnZXRzOworCSpsZW4gPSBvdXRwdHIgLSBvdXRi dWY7CisJZG1fdGFibGVfcHV0KHRhYmxlKTsKKworCXJldHVybiAwOworfQorCisvKgorICog UmV0dXJuIHRoZSBzdGF0dXMgb2YgYSBkZXZpY2UgYXMgYSB0ZXh0IHN0cmluZyBmb3IgZWFj aAorICogdGFyZ2V0LgorICovCitzdGF0aWMgaW50IGdldF9zdGF0dXMoc3RydWN0IGRtX2lv Y3RsICpwYXJhbSwgc3RydWN0IGRtX2lvY3RsICp1c2VyKQoreworCXN0cnVjdCBtYXBwZWRf ZGV2aWNlICptZDsKKwlpbnQgbGVuID0gMDsKKwlpbnQgcmV0OworCWNoYXIgKm91dGJ1ZiA9 IE5VTEw7CisKKwltZCA9IGZpbmRfZGV2aWNlKHBhcmFtKTsKKwlpZiAoIW1kKQorCQkvKgor CQkgKiBEZXZpY2Ugbm90IGZvdW5kIC0gcmV0dXJucyBjbGVhcmVkIGV4aXN0cyBmbGFnLgor CQkgKi8KKwkJZ290byBvdXQ7CisKKwkvKiBXZSBoYXZlbid0IGEgY2x1ZSBob3cgbG9uZyB0 aGUgcmVzdWx0YW50IGRhdGEgd2lsbCBiZSBzbworCSAgIGp1c3QgYWxsb2NhdGUgYXMgbXVj aCBhcyB1c2VybGFuZCBoYXMgYWxsb3dlZCB1cyBhbmQgbWFrZSBzdXJlCisJICAgd2UgZG9u J3Qgb3ZlcnVuIGl0ICovCisJb3V0YnVmID0ga21hbGxvYyhwYXJhbS0+ZGF0YV9zaXplLCBH RlBfS0VSTkVMKTsKKwlpZiAoIW91dGJ1ZikKKwkJZ290byBvdXQ7CisJLyoKKwkgKiBHZXQg dGhlIHN0YXR1cyBvZiBhbGwgdGFyZ2V0cworCSAqLworCV9fc3RhdHVzKG1kLCBwYXJhbSwg b3V0YnVmLCAmbGVuKTsKKworCS8qCisJICogU2V0dXAgdGhlIGJhc2ljIGRtX2lvY3RsIHN0 cnVjdHVyZS4KKwkgKi8KKwlfX2luZm8obWQsIHBhcmFtKTsKKworICAgICAgb3V0OgorCWlm IChtZCkKKwkJZG1fcHV0KG1kKTsKKworCXJldCA9IHJlc3VsdHNfdG9fdXNlcih1c2VyLCBw YXJhbSwgb3V0YnVmLCBsZW4pOworCisJaWYgKG91dGJ1ZikKKwkJa2ZyZWUob3V0YnVmKTsK KworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBXYWl0IGZvciBhIGRldmljZSB0byByZXBv cnQgYW4gZXZlbnQKKyAqLworc3RhdGljIGludCB3YWl0X2RldmljZV9ldmVudChzdHJ1Y3Qg ZG1faW9jdGwgKnBhcmFtLCBzdHJ1Y3QgZG1faW9jdGwgKnVzZXIpCit7CisJc3RydWN0IG1h cHBlZF9kZXZpY2UgKm1kOworCXN0cnVjdCBkbV90YWJsZSAqdGFibGU7CisJREVDTEFSRV9X QUlUUVVFVUUod3EsIGN1cnJlbnQpOworCisJbWQgPSBmaW5kX2RldmljZShwYXJhbSk7CisJ aWYgKCFtZCkKKwkJLyoKKwkJICogRGV2aWNlIG5vdCBmb3VuZCAtIHJldHVybnMgY2xlYXJl ZCBleGlzdHMgZmxhZy4KKwkJICovCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBTZXR1cCB0 aGUgYmFzaWMgZG1faW9jdGwgc3RydWN0dXJlLgorCSAqLworCV9faW5mbyhtZCwgcGFyYW0p OworCisJLyoKKwkgKiBXYWl0IGZvciBhIG5vdGlmaWNhdGlvbiBldmVudAorCSAqLworCXNl dF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJdGFibGUgPSBkbV9nZXRf dGFibGUobWQpOworCWRtX3RhYmxlX2FkZF93YWl0X3F1ZXVlKHRhYmxlLCAmd3EpOworCWRt X3RhYmxlX3B1dCh0YWJsZSk7CisJZG1fcHV0KG1kKTsKKworCXlpZWxkKCk7CisJc2V0X2N1 cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworICAgICAgb3V0OgorCXJldHVybiByZXN1 bHRzX3RvX3VzZXIodXNlciwgcGFyYW0sIE5VTEwsIDApOworfQorCisvKgorICogUmV0cmll dmVzIGEgbGlzdCBvZiBkZXZpY2VzIHVzZWQgYnkgYSBwYXJ0aWN1bGFyIGRtIGRldmljZS4K KyAqLworc3RhdGljIGludCBkZXAoc3RydWN0IGRtX2lvY3RsICpwYXJhbSwgc3RydWN0IGRt X2lvY3RsICp1c2VyKQoreworCWludCBjb3VudCwgcjsKKwlzdHJ1Y3QgbWFwcGVkX2Rldmlj ZSAqbWQ7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCXNpemVfdCBsZW4gPSAwOworCXN0 cnVjdCBkbV90YXJnZXRfZGVwcyAqZGVwcyA9IE5VTEw7CisJc3RydWN0IGRtX3RhYmxlICp0 YWJsZTsKKworCW1kID0gZmluZF9kZXZpY2UocGFyYW0pOworCWlmICghbWQpCisJCWdvdG8g b3V0OworCXRhYmxlID0gZG1fZ2V0X3RhYmxlKG1kKTsKKworCS8qCisJICogU2V0dXAgdGhl IGJhc2ljIGRtX2lvY3RsIHN0cnVjdHVyZS4KKwkgKi8KKwlfX2luZm8obWQsIHBhcmFtKTsK KworCS8qCisJICogQ291bnQgdGhlIGRldmljZXMuCisJICovCisJY291bnQgPSAwOworCWxp c3RfZm9yX2VhY2godG1wLCBkbV90YWJsZV9nZXRfZGV2aWNlcyh0YWJsZSkpCisJICAgIGNv dW50Kys7CisKKwkvKgorCSAqIEFsbG9jYXRlIGEga2VybmVsIHNwYWNlIHZlcnNpb24gb2Yg dGhlIGRtX3RhcmdldF9zdGF0dXMKKwkgKiBzdHJ1Y3QuCisJICovCisJaWYgKGFycmF5X3Rv b19iaWcoc2l6ZW9mKCpkZXBzKSwgc2l6ZW9mKCpkZXBzLT5kZXYpLCBjb3VudCkpIHsKKwkJ ZG1fdGFibGVfcHV0KHRhYmxlKTsKKwkJZG1fcHV0KG1kKTsKKwkJcmV0dXJuIC1FTk9NRU07 CisJfQorCisJbGVuID0gc2l6ZW9mKCpkZXBzKSArIChzaXplb2YoKmRlcHMtPmRldikgKiBj b3VudCk7CisJZGVwcyA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRlcHMp IHsKKwkJZG1fdGFibGVfcHV0KHRhYmxlKTsKKwkJZG1fcHV0KG1kKTsKKwkJcmV0dXJuIC1F Tk9NRU07CisJfQorCisJLyoKKwkgKiBGaWxsIGluIHRoZSBkZXZpY2VzLgorCSAqLworCWRl cHMtPmNvdW50ID0gY291bnQ7CisJY291bnQgPSAwOworCWxpc3RfZm9yX2VhY2godG1wLCBk bV90YWJsZV9nZXRfZGV2aWNlcyh0YWJsZSkpIHsKKwkJc3RydWN0IGRtX2RldiAqZGQgPSBs aXN0X2VudHJ5KHRtcCwgc3RydWN0IGRtX2RldiwgbGlzdCk7CisJCWRlcHMtPmRldltjb3Vu dCsrXSA9IGRkLT5iZGV2LT5iZF9kZXY7CisJfQorCWRtX3RhYmxlX3B1dCh0YWJsZSk7CisJ ZG1fcHV0KG1kKTsKKworICAgICAgb3V0OgorCXIgPSByZXN1bHRzX3RvX3VzZXIodXNlciwg cGFyYW0sIGRlcHMsIGxlbik7CisKKwlrZnJlZShkZXBzKTsKKwlyZXR1cm4gcjsKK30KKwor c3RhdGljIGludCByZW1vdmUoc3RydWN0IGRtX2lvY3RsICpwYXJhbSwgc3RydWN0IGRtX2lv Y3RsICp1c2VyKQoreworCXN0cnVjdCBoYXNoX2NlbGwgKmhjOworCisJZG93bl93cml0ZSgm X2hhc2hfbG9jayk7CisJaGMgPSAqcGFyYW0tPnV1aWQgPyBfX2dldF91dWlkX2NlbGwocGFy YW0tPnV1aWQpIDoKKwkJX19nZXRfbmFtZV9jZWxsKHBhcmFtLT5uYW1lKTsKKwlpZiAoIWhj KSB7CisJCURNV0FSTigiZGV2aWNlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGluIHRoZSBkZXYg aGFzaCB0YWJsZS4iKTsKKwkJdXBfd3JpdGUoJl9oYXNoX2xvY2spOworCQlyZXR1cm4gLUVJ TlZBTDsKKwl9CisKKwlfX2hhc2hfcmVtb3ZlKGhjKTsKKwl1cF93cml0ZSgmX2hhc2hfbG9j ayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVtb3ZlX2FsbChzdHJ1Y3QgZG1f aW9jdGwgKnBhcmFtLCBzdHJ1Y3QgZG1faW9jdGwgKnVzZXIpCit7CisJZG1faGFzaF9yZW1v dmVfYWxsKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3VzcGVuZChzdHJ1Y3Qg ZG1faW9jdGwgKnBhcmFtLCBzdHJ1Y3QgZG1faW9jdGwgKnVzZXIpCit7CisJaW50IHI7CisJ c3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kOworCisJbWQgPSBmaW5kX2RldmljZShwYXJhbSk7 CisJaWYgKCFtZCkKKwkJcmV0dXJuIC1FTlhJTzsKKworCWlmIChwYXJhbS0+ZmxhZ3MgJiBE TV9TVVNQRU5EX0ZMQUcpCisJCXIgPSBkbV9zdXNwZW5kKG1kKTsKKwllbHNlCisJCXIgPSBk bV9yZXN1bWUobWQpOworCisJZG1fcHV0KG1kKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGlj IGludCByZWxvYWQoc3RydWN0IGRtX2lvY3RsICpwYXJhbSwgc3RydWN0IGRtX2lvY3RsICp1 c2VyKQoreworCWludCByOworCWtkZXZfdCBkZXY7CisJc3RydWN0IG1hcHBlZF9kZXZpY2Ug Km1kOworCXN0cnVjdCBkbV90YWJsZSAqdDsKKworCXIgPSBkbV90YWJsZV9jcmVhdGUoJnQs IGdldF9tb2RlKHBhcmFtKSk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IHBvcHVs YXRlX3RhYmxlKHQsIHBhcmFtKTsKKwlpZiAocikgeworCQlkbV90YWJsZV9wdXQodCk7CisJ CXJldHVybiByOworCX0KKworCW1kID0gZmluZF9kZXZpY2UocGFyYW0pOworCWlmICghbWQp IHsKKwkJZG1fdGFibGVfcHV0KHQpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXIgPSBk bV9zd2FwX3RhYmxlKG1kLCB0KTsKKwlpZiAocikgeworCQlkbV9wdXQobWQpOworCQlkbV90 YWJsZV9wdXQodCk7CisJCXJldHVybiByOworCX0KKworCWRldiA9IGRtX2tkZXYobWQpOwor CXNldF9kZXZpY2Vfcm8oZGV2LCAocGFyYW0tPmZsYWdzICYgRE1fUkVBRE9OTFlfRkxBRykp OworCWRtX3B1dChtZCk7CisKKwlyID0gaW5mbyhwYXJhbSwgdXNlcik7CisJcmV0dXJuIHI7 Cit9CisKK3N0YXRpYyBpbnQgcmVuYW1lKHN0cnVjdCBkbV9pb2N0bCAqcGFyYW0sIHN0cnVj dCBkbV9pb2N0bCAqdXNlcikKK3sKKwlpbnQgcjsKKwljaGFyICpuZXdfbmFtZSA9IChjaGFy ICopIHBhcmFtICsgcGFyYW0tPmRhdGFfc3RhcnQ7CisKKwlpZiAodmFsaWRfc3RyKG5ld19u YW1lLCAodm9pZCAqKSBwYXJhbSwKKwkJICAgICAgKHZvaWQgKikgcGFyYW0gKyBwYXJhbS0+ ZGF0YV9zaXplKSkgeworCQlETVdBUk4oIkludmFsaWQgbmV3IGxvZ2ljYWwgdm9sdW1lIG5h bWUgc3VwcGxpZWQuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXIgPSBjaGVja19u YW1lKG5ld19uYW1lKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyZXR1cm4gZG1faGFz aF9yZW5hbWUocGFyYW0tPm5hbWUsIG5ld19uYW1lKTsKK30KKworCisvKi0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgKiBJbXBsZW1lbnRhdGlvbiBvZiBvcGVuL2Nsb3NlL2lvY3RsIG9uIHRoZSBzcGVjaWFs IGNoYXIKKyAqIGRldmljZS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpb2N0bF9mbiBsb29r dXBfaW9jdGwodW5zaWduZWQgaW50IGNtZCkKK3sKKwlzdGF0aWMgc3RydWN0IHsKKwkJaW50 IGNtZDsKKwkJaW9jdGxfZm4gZm47CisJfSBfaW9jdGxzW10gPSB7CisJCXtETV9WRVJTSU9O X0NNRCwgTlVMTH0sCS8qIHZlcnNpb24gaXMgZGVhbHQgd2l0aCBlbHNld2hlcmUgKi8KKwkJ e0RNX1JFTU9WRV9BTExfQ01ELCByZW1vdmVfYWxsfSwKKwkJe0RNX0RFVl9DUkVBVEVfQ01E LCBjcmVhdGV9LAorCQl7RE1fREVWX1JFTU9WRV9DTUQsIHJlbW92ZX0sCisJCXtETV9ERVZf UkVMT0FEX0NNRCwgcmVsb2FkfSwKKwkJe0RNX0RFVl9SRU5BTUVfQ01ELCByZW5hbWV9LAor CQl7RE1fREVWX1NVU1BFTkRfQ01ELCBzdXNwZW5kfSwKKwkJe0RNX0RFVl9ERVBTX0NNRCwg ZGVwfSwKKwkJe0RNX0RFVl9TVEFUVVNfQ01ELCBpbmZvfSwKKwkJe0RNX1RBUkdFVF9TVEFU VVNfQ01ELCBnZXRfc3RhdHVzfSwKKwkJe0RNX1RBUkdFVF9XQUlUX0NNRCwgd2FpdF9kZXZp Y2VfZXZlbnR9LAorCX07CisKKwlyZXR1cm4gKGNtZCA+PSBBUlJBWV9TSVpFKF9pb2N0bHMp KSA/IE5VTEwgOiBfaW9jdGxzW2NtZF0uZm47Cit9CisKKy8qCisgKiBBcyB3ZWxsIGFzIGNo ZWNraW5nIHRoZSB2ZXJzaW9uIGNvbXBhdGliaWxpdHkgdGhpcyBhbHdheXMKKyAqIGNvcGll cyB0aGUga2VybmVsIGludGVyZmFjZSB2ZXJzaW9uIG91dC4KKyAqLworc3RhdGljIGludCBj aGVja192ZXJzaW9uKGludCBjbWQsIHN0cnVjdCBkbV9pb2N0bCAqdXNlcikKK3sKKwl1aW50 MzJfdCB2ZXJzaW9uWzNdOworCWludCByID0gMDsKKworCWlmIChjb3B5X2Zyb21fdXNlcih2 ZXJzaW9uLCB1c2VyLT52ZXJzaW9uLCBzaXplb2YodmVyc2lvbikpKQorCQlyZXR1cm4gLUVG QVVMVDsKKworCWlmICgoRE1fVkVSU0lPTl9NQUpPUiAhPSB2ZXJzaW9uWzBdKSB8fAorCSAg ICAoRE1fVkVSU0lPTl9NSU5PUiA8IHZlcnNpb25bMV0pKSB7CisJCURNV0FSTigiaW9jdGwg aW50ZXJmYWNlIG1pc21hdGNoOiAiCisJCSAgICAgICAia2VybmVsKCV1LiV1LiV1KSwgdXNl cigldS4ldS4ldSksIGNtZCglZCkiLAorCQkgICAgICAgRE1fVkVSU0lPTl9NQUpPUiwgRE1f VkVSU0lPTl9NSU5PUiwKKwkJICAgICAgIERNX1ZFUlNJT05fUEFUQ0hMRVZFTCwKKwkJICAg ICAgIHZlcnNpb25bMF0sIHZlcnNpb25bMV0sIHZlcnNpb25bMl0sIGNtZCk7CisJCXIgPSAt RUlOVkFMOworCX0KKworCS8qCisJICogRmlsbCBpbiB0aGUga2VybmVsIHZlcnNpb24uCisJ ICovCisJdmVyc2lvblswXSA9IERNX1ZFUlNJT05fTUFKT1I7CisJdmVyc2lvblsxXSA9IERN X1ZFUlNJT05fTUlOT1I7CisJdmVyc2lvblsyXSA9IERNX1ZFUlNJT05fUEFUQ0hMRVZFTDsK KwlpZiAoY29weV90b191c2VyKHVzZXItPnZlcnNpb24sIHZlcnNpb24sIHNpemVvZih2ZXJz aW9uKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2 b2lkIGZyZWVfcGFyYW1zKHN0cnVjdCBkbV9pb2N0bCAqcGFyYW0pCit7CisJdmZyZWUocGFy YW0pOworfQorCitzdGF0aWMgaW50IGNvcHlfcGFyYW1zKHN0cnVjdCBkbV9pb2N0bCAqdXNl ciwgc3RydWN0IGRtX2lvY3RsICoqcGFyYW0pCit7CisJc3RydWN0IGRtX2lvY3RsIHRtcCwg KmRtaTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdG1wLCB1c2VyLCBzaXplb2YodG1wKSkp CisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKHRtcC5kYXRhX3NpemUgPCBzaXplb2YodG1w KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkbWkgPSAoc3RydWN0IGRtX2lvY3RsICopIHZt YWxsb2ModG1wLmRhdGFfc2l6ZSk7CisJaWYgKCFkbWkpCisJCXJldHVybiAtRU5PTUVNOwor CisJaWYgKGNvcHlfZnJvbV91c2VyKGRtaSwgdXNlciwgdG1wLmRhdGFfc2l6ZSkpIHsKKwkJ dmZyZWUoZG1pKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJKnBhcmFtID0gZG1pOwor CXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZhbGlkYXRlX3BhcmFtcyh1aW50IGNtZCwg c3RydWN0IGRtX2lvY3RsICpwYXJhbSkKK3sKKwkvKiBVbmxlc3MgY3JlYXRpbmcsIGVpdGhl ciBuYW1lIG9mIHV1aWQgYnV0IG5vdCBib3RoICovCisJaWYgKGNtZCAhPSBETV9ERVZfQ1JF QVRFX0NNRCkgeworCQlpZiAoKCEqcGFyYW0tPnV1aWQgJiYgISpwYXJhbS0+bmFtZSkgfHwK KwkJICAgICgqcGFyYW0tPnV1aWQgJiYgKnBhcmFtLT5uYW1lKSkgeworCQkJRE1XQVJOKCJv bmUgb2YgbmFtZSBvciB1dWlkIG11c3QgYmUgc3VwcGxpZWQiKTsKKwkJCXJldHVybiAtRUlO VkFMOworCQl9CisJfQorCisJLyogRW5zdXJlIHN0cmluZ3MgYXJlIHRlcm1pbmF0ZWQgKi8K KwlwYXJhbS0+bmFtZVtETV9OQU1FX0xFTiAtIDFdID0gJ1wwJzsKKwlwYXJhbS0+dXVpZFtE TV9VVUlEX0xFTiAtIDFdID0gJ1wwJzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50 IGN0bF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJ ICAgICB1aW50IGNvbW1hbmQsIHVsb25nIHUpCit7CisJaW50IHIgPSAwLCBjbWQ7CisJc3Ry dWN0IGRtX2lvY3RsICpwYXJhbTsKKwlzdHJ1Y3QgZG1faW9jdGwgKnVzZXIgPSAoc3RydWN0 IGRtX2lvY3RsICopIHU7CisJaW9jdGxfZm4gZm4gPSBOVUxMOworCisJLyogb25seSByb290 IGNhbiBwbGF5IHdpdGggdGhpcyAqLworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkK KwkJcmV0dXJuIC1FQUNDRVM7CisKKwlpZiAoX0lPQ19UWVBFKGNvbW1hbmQpICE9IERNX0lP Q1RMKQorCQlyZXR1cm4gLUVOT1RUWTsKKworCWNtZCA9IF9JT0NfTlIoY29tbWFuZCk7CisK KwkvKgorCSAqIENoZWNrIHRoZSBpbnRlcmZhY2UgdmVyc2lvbiBwYXNzZWQgaW4uICBUaGlz IGFsc28KKwkgKiB3cml0ZXMgb3V0IHRoZSBrZXJuZWxzIGludGVyZmFjZSB2ZXJzaW9uLgor CSAqLworCXIgPSBjaGVja192ZXJzaW9uKGNtZCwgdXNlcik7CisJaWYgKHIpCisJCXJldHVy biByOworCisJLyoKKwkgKiBOb3RoaW5nIG1vcmUgdG8gZG8gZm9yIHRoZSB2ZXJzaW9uIGNv bW1hbmQuCisJICovCisJaWYgKGNtZCA9PSBETV9WRVJTSU9OX0NNRCkKKwkJcmV0dXJuIDA7 CisKKwlmbiA9IGxvb2t1cF9pb2N0bChjbWQpOworCWlmICghZm4pIHsKKwkJRE1XQVJOKCJk bV9jdGxfaW9jdGw6IHVua25vd24gY29tbWFuZCAweCV4IiwgY29tbWFuZCk7CisJCXJldHVy biAtRU5PVFRZOworCX0KKworCS8qCisJICogQ29weSB0aGUgcGFyYW1ldGVycyBpbnRvIGtl cm5lbCBzcGFjZS4KKwkgKi8KKwlyID0gY29weV9wYXJhbXModXNlciwgJnBhcmFtKTsKKwlp ZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gdmFsaWRhdGVfcGFyYW1zKGNtZCwgcGFyYW0p OworCWlmIChyKSB7CisJCWZyZWVfcGFyYW1zKHBhcmFtKTsKKwkJcmV0dXJuIHI7CisJfQor CisJciA9IGZuKHBhcmFtLCB1c2VyKTsKKwlmcmVlX3BhcmFtcyhwYXJhbSk7CisJcmV0dXJu IHI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIF9jdGxfZm9wcyA9IHsK KwkuaW9jdGwJID0gY3RsX2lvY3RsLAorCS5vd25lcgkgPSBUSElTX01PRFVMRSwKK307CisK K3N0YXRpYyBkZXZmc19oYW5kbGVfdCBfY3RsX2hhbmRsZTsKKworc3RhdGljIHN0cnVjdCBt aXNjZGV2aWNlIF9kbV9taXNjID0geworCS5taW5vciA9IE1JU0NfRFlOQU1JQ19NSU5PUiwK KwkubmFtZSAgPSBETV9OQU1FLAorCS5mb3BzICA9ICZfY3RsX2ZvcHMKK307CisKKy8qCisg KiBDcmVhdGUgbWlzYyBjaGFyYWN0ZXIgZGV2aWNlIGFuZCBsaW5rIHRvIERNX0RJUi9jb250 cm9sLgorICovCitpbnQgX19pbml0IGRtX2ludGVyZmFjZV9pbml0KHZvaWQpCit7CisJaW50 IHI7CisJY2hhciBybmFtZVs2NF07CisKKwlyID0gZG1faGFzaF9pbml0KCk7CisJaWYgKHIp CisJCXJldHVybiByOworCisJciA9IG1pc2NfcmVnaXN0ZXIoJl9kbV9taXNjKTsKKwlpZiAo cikgeworCQlETUVSUigibWlzY19yZWdpc3RlciBmYWlsZWQgZm9yIGNvbnRyb2wgZGV2aWNl Iik7CisJCWRtX2hhc2hfZXhpdCgpOworCQlyZXR1cm4gcjsKKwl9CisKKwlyID0gZGV2ZnNf Z2VuZXJhdGVfcGF0aChfZG1fbWlzYy5kZXZmc19oYW5kbGUsIHJuYW1lICsgMywKKwkJCQlz aXplb2Ygcm5hbWUgLSAzKTsKKwlpZiAociA9PSAtRU5PU1lTKQorCQlyZXR1cm4gMDsJLyog ZGV2ZnMgbm90IHByZXNlbnQgKi8KKworCWlmIChyIDwgMCkgeworCQlETUVSUigiZGV2ZnNf Z2VuZXJhdGVfcGF0aCBmYWlsZWQgZm9yIGNvbnRyb2wgZGV2aWNlIik7CisJCWdvdG8gZmFp bGVkOworCX0KKworCXN0cm5jcHkocm5hbWUgKyByLCAiLi4vIiwgMyk7CisJciA9IGRldmZz X21rX3N5bWxpbmsoTlVMTCwgRE1fRElSICIvY29udHJvbCIsCisJCQkgICAgIERFVkZTX0ZM X0RFRkFVTFQsIHJuYW1lICsgciwgJl9jdGxfaGFuZGxlLCBOVUxMKTsKKwlpZiAocikgewor CQlETUVSUigiZGV2ZnNfbWtfc3ltbGluayBmYWlsZWQgZm9yIGNvbnRyb2wgZGV2aWNlIik7 CisJCWdvdG8gZmFpbGVkOworCX0KKwlkZXZmc19hdXRvX3VucmVnaXN0ZXIoX2RtX21pc2Mu ZGV2ZnNfaGFuZGxlLCBfY3RsX2hhbmRsZSk7CisKKwlETUlORk8oIiVkLiVkLiVkJXMgaW5p dGlhbGlzZWQ6ICVzIiwgRE1fVkVSU0lPTl9NQUpPUiwKKwkgICAgICAgRE1fVkVSU0lPTl9N SU5PUiwgRE1fVkVSU0lPTl9QQVRDSExFVkVMLCBETV9WRVJTSU9OX0VYVFJBLAorCSAgICAg ICBETV9EUklWRVJfRU1BSUwpOworCXJldHVybiAwOworCisgICAgICBmYWlsZWQ6CisJZG1f aGFzaF9leGl0KCk7CisJbWlzY19kZXJlZ2lzdGVyKCZfZG1fbWlzYyk7CisJcmV0dXJuIHI7 Cit9CisKK3ZvaWQgZG1faW50ZXJmYWNlX2V4aXQodm9pZCkKK3sKKwlkbV9oYXNoX2V4aXQo KTsKKworCWlmIChtaXNjX2RlcmVnaXN0ZXIoJl9kbV9taXNjKSA8IDApCisJCURNRVJSKCJt aXNjX2RlcmVnaXN0ZXIgZmFpbGVkIGZvciBjb250cm9sIGRldmljZSIpOworfQotLS0gZGlm Zi9kcml2ZXJzL21kL2RtLWxpbmVhci5jCTE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAw ICswMTAwCisrKyBzb3VyY2UvZHJpdmVycy9tZC9kbS1saW5lYXIuYwkyMDAyLTExLTI5IDA5 OjQ0OjU5LjAwMDAwMDAwMCArMDAwMApAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIENvcHly aWdodCAoQykgMjAwMSBTaXN0aW5hIFNvZnR3YXJlIChVSykgTGltaXRlZC4KKyAqCisgKiBU aGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworCisjaW5jbHVkZSAi ZG0uaCIKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lu aXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFi Lmg+CisKKy8qCisgKiBMaW5lYXI6IG1hcHMgYSBsaW5lYXIgcmFuZ2Ugb2YgYSBkZXZpY2Uu CisgKi8KK3N0cnVjdCBsaW5lYXJfYyB7CisJc3RydWN0IGRtX2RldiAqZGV2OworCXNlY3Rv cl90IHN0YXJ0OworfTsKKworLyoKKyAqIENvbnN0cnVjdCBhIGxpbmVhciBtYXBwaW5nOiA8 ZGV2X3BhdGg+IDxvZmZzZXQ+CisgKi8KK3N0YXRpYyBpbnQgbGluZWFyX2N0cihzdHJ1Y3Qg ZG1fdGFyZ2V0ICp0aSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBsaW5l YXJfYyAqbGM7CisKKwlpZiAoYXJnYyAhPSAyKSB7CisJCXRpLT5lcnJvciA9ICJkbS1saW5l YXI6IE5vdCBlbm91Z2ggYXJndW1lbnRzIjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJ bGMgPSBrbWFsbG9jKHNpemVvZigqbGMpLCBHRlBfS0VSTkVMKTsKKwlpZiAobGMgPT0gTlVM TCkgeworCQl0aS0+ZXJyb3IgPSAiZG0tbGluZWFyOiBDYW5ub3QgYWxsb2NhdGUgbGluZWFy IGNvbnRleHQiOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoc3NjYW5mKGFyZ3Zb MV0sIFNFQ1RPUl9GT1JNQVQsICZsYy0+c3RhcnQpICE9IDEpIHsKKwkJdGktPmVycm9yID0g ImRtLWxpbmVhcjogSW52YWxpZCBkZXZpY2Ugc2VjdG9yIjsKKwkJZ290byBiYWQ7CisJfQor CisJaWYgKGRtX2dldF9kZXZpY2UodGksIGFyZ3ZbMF0sIGxjLT5zdGFydCwgdGktPmxlbiwK KwkJCSAgZG1fdGFibGVfZ2V0X21vZGUodGktPnRhYmxlKSwgJmxjLT5kZXYpKSB7CisJCXRp LT5lcnJvciA9ICJkbS1saW5lYXI6IERldmljZSBsb29rdXAgZmFpbGVkIjsKKwkJZ290byBi YWQ7CisJfQorCisJdGktPnByaXZhdGUgPSBsYzsKKwlyZXR1cm4gMDsKKworICAgICAgYmFk OgorCWtmcmVlKGxjKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgbGlu ZWFyX2R0cihzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSkKK3sKKwlzdHJ1Y3QgbGluZWFyX2MgKmxj ID0gKHN0cnVjdCBsaW5lYXJfYyAqKSB0aS0+cHJpdmF0ZTsKKworCWRtX3B1dF9kZXZpY2Uo dGksIGxjLT5kZXYpOworCWtmcmVlKGxjKTsKK30KKworc3RhdGljIGludCBsaW5lYXJfbWFw KHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgcncp Cit7CisJc3RydWN0IGxpbmVhcl9jICpsYyA9IChzdHJ1Y3QgbGluZWFyX2MgKikgdGktPnBy aXZhdGU7CisKKwliaC0+Yl9yZGV2ID0gbGMtPmRldi0+ZGV2OworCWJoLT5iX3JzZWN0b3Ig PSBsYy0+c3RhcnQgKyAoYmgtPmJfcnNlY3RvciAtIHRpLT5iZWdpbik7CisKKwlyZXR1cm4g MTsKK30KKworc3RhdGljIGludCBsaW5lYXJfc3RhdHVzKHN0cnVjdCBkbV90YXJnZXQgKnRp LCBzdGF0dXNfdHlwZV90IHR5cGUsCisJCQkgY2hhciAqcmVzdWx0LCBpbnQgbWF4bGVuKQor eworCXN0cnVjdCBsaW5lYXJfYyAqbGMgPSAoc3RydWN0IGxpbmVhcl9jICopIHRpLT5wcml2 YXRlOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTVEFUVVNUWVBFX0lORk86CisJCXJl c3VsdFswXSA9ICdcMCc7CisJCWJyZWFrOworCisJY2FzZSBTVEFUVVNUWVBFX1RBQkxFOgor CQlzbnByaW50ZihyZXN1bHQsIG1heGxlbiwgIiVzICIgU0VDVE9SX0ZPUk1BVCwKKwkJCSBr ZGV2bmFtZSh0b19rZGV2X3QobGMtPmRldi0+YmRldi0+YmRfZGV2KSksIGxjLT5zdGFydCk7 CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB0YXJnZXRf dHlwZSBsaW5lYXJfdGFyZ2V0ID0geworCS5uYW1lICAgPSAibGluZWFyIiwKKwkubW9kdWxl ID0gVEhJU19NT0RVTEUsCisJLmN0ciAgICA9IGxpbmVhcl9jdHIsCisJLmR0ciAgICA9IGxp bmVhcl9kdHIsCisJLm1hcCAgICA9IGxpbmVhcl9tYXAsCisJLnN0YXR1cyA9IGxpbmVhcl9z dGF0dXMsCit9OworCitpbnQgX19pbml0IGRtX2xpbmVhcl9pbml0KHZvaWQpCit7CisJaW50 IHIgPSBkbV9yZWdpc3Rlcl90YXJnZXQoJmxpbmVhcl90YXJnZXQpOworCisJaWYgKHIgPCAw KQorCQlETUVSUigibGluZWFyOiByZWdpc3RlciBmYWlsZWQgJWQiLCByKTsKKworCXJldHVy biByOworfQorCit2b2lkIGRtX2xpbmVhcl9leGl0KHZvaWQpCit7CisJaW50IHIgPSBkbV91 bnJlZ2lzdGVyX3RhcmdldCgmbGluZWFyX3RhcmdldCk7CisKKwlpZiAociA8IDApCisJCURN RVJSKCJsaW5lYXI6IHVucmVnaXN0ZXIgZmFpbGVkICVkIiwgcik7Cit9Ci0tLSBkaWZmL2Ry aXZlcnMvbWQvZG0tc25hcHNob3QuYwkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCAr MDEwMAorKysgc291cmNlL2RyaXZlcnMvbWQvZG0tc25hcHNob3QuYwkyMDAyLTExLTI5IDA5 OjQ0OjU5LjAwMDAwMDAwMCArMDAwMApAQCAtMCwwICsxLDExNjcgQEAKKy8qCisgKiBkbS1z bmFwc2hvdC5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgU2lzdGluYSBTb2Z0 d2FyZSAoVUspIExpbWl0ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVy IHRoZSBHUEwuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUg PGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxs aW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4 L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvbWVt cG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS1tYXBwZXIuaD4KKyNpbmNsdWRlIDxs aW51eC92bWFsbG9jLmg+CisKKyNpbmNsdWRlICJkbS1zbmFwc2hvdC5oIgorI2luY2x1ZGUg Imtjb3B5ZC5oIgorCisvKgorICogRklYTUU6IFJlbW92ZSB0aGlzIGJlZm9yZSByZWxlYXNl LgorICovCisjaWYgMAorI2RlZmluZSBETURFQlVHKHguLi4pIERNV0FSTiggIyMgeCkKKyNl bHNlCisjZGVmaW5lIERNREVCVUcoeC4uLikKKyNlbmRpZgorCisvKgorICogVGhlIHBlcmNl bnRhZ2UgaW5jcmVtZW50IHdlIHdpbGwgd2FrZSB1cCB1c2VycyBhdAorICovCisjZGVmaW5l IFdBS0VfVVBfUEVSQ0VOVCA1CisKKy8qCisgKiBIYXJkIHNlY3RvciBzaXplIHVzZWQgYWxs IG92ZXIgdGhlIGtlcm5lbAorICovCisjZGVmaW5lIFNFQ1RPUl9TSVpFIDUxMgorCisvKgor ICoga2NvcHlkIHByaW9yaXR5IG9mIHNuYXBzaG90IG9wZXJhdGlvbnMKKyAqLworI2RlZmlu ZSBTTkFQU0hPVF9DT1BZX1BSSU9SSVRZIDIKKworc3RydWN0IHBlbmRpbmdfZXhjZXB0aW9u IHsKKwlzdHJ1Y3QgZXhjZXB0aW9uIGU7CisKKwkvKgorCSAqIE9yaWdpbiBidWZmZXJzIHdh aXRpbmcgZm9yIHRoaXMgdG8gY29tcGxldGUgYXJlIGhlbGQKKwkgKiBpbiBhIGxpc3QgKHVz aW5nIGJfcmVxbmV4dCkuCisJICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICpvcmlnaW5fYmhz OworCXN0cnVjdCBidWZmZXJfaGVhZCAqc25hcHNob3RfYmhzOworCisJLyoKKwkgKiBPdGhl ciBwZW5kaW5nX2V4Y2VwdGlvbnMgdGhhdCBhcmUgcHJvY2Vzc2luZyB0aGlzCisJICogY2h1 bmsuICBXaGVuIHRoaXMgbGlzdCBpcyBlbXB0eSwgd2Uga25vdyB3ZSBjYW4KKwkgKiBjb21w bGV0ZSB0aGUgb3JpZ2lucy4KKwkgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHNpYmxpbmdzOwor CisJLyogUG9pbnRlciBiYWNrIHRvIHNuYXBzaG90IGNvbnRleHQgKi8KKwlzdHJ1Y3QgZG1f c25hcHNob3QgKnNuYXA7CisKKwkvKgorCSAqIDEgaW5kaWNhdGVzIHRoZSBleGNlcHRpb24g aGFzIGFscmVhZHkgYmVlbiBzZW50IHRvCisJICoga2NvcHlkLgorCSAqLworCWludCBzdGFy dGVkOworfTsKKworLyoKKyAqIEhhc2ggdGFibGUgbWFwcGluZyBvcmlnaW4gdm9sdW1lcyB0 byBsaXN0cyBvZiBzbmFwc2hvdHMgYW5kCisgKiBhIGxvY2sgdG8gcHJvdGVjdCBpdAorICov CitzdGF0aWMga21lbV9jYWNoZV90ICpleGNlcHRpb25fY2FjaGU7CitzdGF0aWMga21lbV9j YWNoZV90ICpwZW5kaW5nX2NhY2hlOworc3RhdGljIG1lbXBvb2xfdCAqcGVuZGluZ19wb29s OworCisvKgorICogT25lIG9mIHRoZXNlIHBlciByZWdpc3RlcmVkIG9yaWdpbiwgaGVsZCBp biB0aGUgc25hcHNob3Rfb3JpZ2lucyBoYXNoCisgKi8KK3N0cnVjdCBvcmlnaW4geworCS8q IFRoZSBvcmlnaW4gZGV2aWNlICovCisJa2Rldl90IGRldjsKKworCXN0cnVjdCBsaXN0X2hl YWQgaGFzaF9saXN0OworCisJLyogTGlzdCBvZiBzbmFwc2hvdHMgZm9yIHRoaXMgb3JpZ2lu ICovCisJc3RydWN0IGxpc3RfaGVhZCBzbmFwc2hvdHM7Cit9OworCisvKgorICogU2l6ZSBv ZiB0aGUgaGFzaCB0YWJsZSBmb3Igb3JpZ2luIHZvbHVtZXMuIElmIHdlIG1ha2UgdGhpcwor ICogdGhlIHNpemUgb2YgdGhlIG1pbm9ycyBsaXN0IHRoZW4gaXQgc2hvdWxkIGJlIG5lYXJs eSBwZXJmZWN0CisgKi8KKyNkZWZpbmUgT1JJR0lOX0hBU0hfU0laRSAyNTYKKyNkZWZpbmUg T1JJR0lOX01BU0sgICAgICAweEZGCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqX29yaWdp bnM7CitzdGF0aWMgc3RydWN0IHJ3X3NlbWFwaG9yZSBfb3JpZ2luc19sb2NrOworCitzdGF0 aWMgaW50IGluaXRfb3JpZ2luX2hhc2godm9pZCkKK3sKKwlpbnQgaTsKKworCV9vcmlnaW5z ID0ga21hbGxvYyhPUklHSU5fSEFTSF9TSVpFICogc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQp LAorCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFfb3JpZ2lucykgeworCQlETUVSUigiRGV2 aWNlIG1hcHBlcjogU25hcHNob3Q6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkiKTsKKwkJ cmV0dXJuIC1FTk9NRU07CisJfQorCisJZm9yIChpID0gMDsgaSA8IE9SSUdJTl9IQVNIX1NJ WkU7IGkrKykKKwkJSU5JVF9MSVNUX0hFQUQoX29yaWdpbnMgKyBpKTsKKwlpbml0X3J3c2Vt KCZfb3JpZ2luc19sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBleGl0 X29yaWdpbl9oYXNoKHZvaWQpCit7CisJa2ZyZWUoX29yaWdpbnMpOworfQorCitzdGF0aWMg aW5saW5lIHVuc2lnbmVkIGludCBvcmlnaW5faGFzaChrZGV2X3QgZGV2KQoreworCXJldHVy biBNSU5PUihkZXYpICYgT1JJR0lOX01BU0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3JpZ2lu ICpfX2xvb2t1cF9vcmlnaW4oa2Rldl90IG9yaWdpbikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFk ICpzbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpvbDsKKwlzdHJ1Y3Qgb3JpZ2luICpvOwor CisJb2wgPSAmX29yaWdpbnNbb3JpZ2luX2hhc2gob3JpZ2luKV07CisJbGlzdF9mb3JfZWFj aChzbGlzdCwgb2wpIHsKKwkJbyA9IGxpc3RfZW50cnkoc2xpc3QsIHN0cnVjdCBvcmlnaW4s IGhhc2hfbGlzdCk7CisKKwkJaWYgKG8tPmRldiA9PSBvcmlnaW4pCisJCQlyZXR1cm4gbzsK Kwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgX19pbnNlcnRfb3JpZ2lu KHN0cnVjdCBvcmlnaW4gKm8pCit7CisJc3RydWN0IGxpc3RfaGVhZCAqc2wgPSAmX29yaWdp bnNbb3JpZ2luX2hhc2goby0+ZGV2KV07CisJbGlzdF9hZGRfdGFpbCgmby0+aGFzaF9saXN0 LCBzbCk7Cit9CisKKy8qCisgKiBNYWtlIGEgbm90ZSBvZiB0aGUgc25hcHNob3QgYW5kIGl0 cyBvcmlnaW4gc28gd2UgY2FuIGxvb2sgaXQKKyAqIHVwIHdoZW4gdGhlIG9yaWdpbiBoYXMg YSB3cml0ZSBvbiBpdC4KKyAqLworc3RhdGljIGludCByZWdpc3Rlcl9zbmFwc2hvdChzdHJ1 Y3QgZG1fc25hcHNob3QgKnNuYXApCit7CisJc3RydWN0IG9yaWdpbiAqbzsKKwlrZGV2X3Qg ZGV2ID0gc25hcC0+b3JpZ2luLT5kZXY7CisKKwlkb3duX3dyaXRlKCZfb3JpZ2luc19sb2Nr KTsKKwlvID0gX19sb29rdXBfb3JpZ2luKGRldik7CisKKwlpZiAoIW8pIHsKKwkJLyogTmV3 IG9yaWdpbiAqLworCQlvID0ga21hbGxvYyhzaXplb2YoKm8pLCBHRlBfS0VSTkVMKTsKKwkJ aWYgKCFvKSB7CisJCQl1cF93cml0ZSgmX29yaWdpbnNfbG9jayk7CisJCQlyZXR1cm4gLUVO T01FTTsKKwkJfQorCisJCS8qIEluaXRpYWxpc2UgdGhlIHN0cnVjdCAqLworCQlJTklUX0xJ U1RfSEVBRCgmby0+c25hcHNob3RzKTsKKwkJby0+ZGV2ID0gZGV2OworCisJCV9faW5zZXJ0 X29yaWdpbihvKTsKKwl9CisKKwlsaXN0X2FkZF90YWlsKCZzbmFwLT5saXN0LCAmby0+c25h cHNob3RzKTsKKworCXVwX3dyaXRlKCZfb3JpZ2luc19sb2NrKTsKKwlyZXR1cm4gMDsKK30K Kworc3RhdGljIHZvaWQgdW5yZWdpc3Rlcl9zbmFwc2hvdChzdHJ1Y3QgZG1fc25hcHNob3Qg KnMpCit7CisJc3RydWN0IG9yaWdpbiAqbzsKKworCWRvd25fd3JpdGUoJl9vcmlnaW5zX2xv Y2spOworCW8gPSBfX2xvb2t1cF9vcmlnaW4ocy0+b3JpZ2luLT5kZXYpOworCisJbGlzdF9k ZWwoJnMtPmxpc3QpOworCWlmIChsaXN0X2VtcHR5KCZvLT5zbmFwc2hvdHMpKSB7CisJCWxp c3RfZGVsKCZvLT5oYXNoX2xpc3QpOworCQlrZnJlZShvKTsKKwl9CisKKwl1cF93cml0ZSgm X29yaWdpbnNfbG9jayk7Cit9CisKKy8qCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXhj ZXB0aW9uIGhhc2ggdGFibGVzLgorICovCitzdGF0aWMgaW50IGluaXRfZXhjZXB0aW9uX3Rh YmxlKHN0cnVjdCBleGNlcHRpb25fdGFibGUgKmV0LCB1aW50MzJfdCBzaXplKQoreworCWlu dCBpOworCisJZXQtPmhhc2hfbWFzayA9IHNpemUgLSAxOworCWV0LT50YWJsZSA9IHZjYWxs b2Moc2l6ZSwgc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpKTsKKwlpZiAoIWV0LT50YWJsZSkK KwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQlJ TklUX0xJU1RfSEVBRChldC0+dGFibGUgKyBpKTsKKworCXJldHVybiAwOworfQorCitzdGF0 aWMgdm9pZCBleGl0X2V4Y2VwdGlvbl90YWJsZShzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlICpl dCwga21lbV9jYWNoZV90ICptZW0pCit7CisJc3RydWN0IGxpc3RfaGVhZCAqc2xvdCwgKmVu dHJ5LCAqdGVtcDsKKwlzdHJ1Y3QgZXhjZXB0aW9uICpleDsKKwlpbnQgaSwgc2l6ZTsKKwor CXNpemUgPSBldC0+aGFzaF9tYXNrICsgMTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsr KSB7CisJCXNsb3QgPSBldC0+dGFibGUgKyBpOworCisJCWxpc3RfZm9yX2VhY2hfc2FmZShl bnRyeSwgdGVtcCwgc2xvdCkgeworCQkJZXggPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3Qg ZXhjZXB0aW9uLCBoYXNoX2xpc3QpOworCQkJa21lbV9jYWNoZV9mcmVlKG1lbSwgZXgpOwor CQl9CisJfQorCisJdmZyZWUoZXQtPnRhYmxlKTsKK30KKworLyoKKyAqIEZJWE1FOiBjaGVj ayBob3cgdGhpcyBoYXNoIGZuIGlzIHBlcmZvcm1pbmcuCisgKi8KK3N0YXRpYyBpbmxpbmUg dWludDMyX3QgZXhjZXB0aW9uX2hhc2goc3RydWN0IGV4Y2VwdGlvbl90YWJsZSAqZXQsIGNo dW5rX3QgY2h1bmspCit7CisJcmV0dXJuIGNodW5rICYgZXQtPmhhc2hfbWFzazsKK30KKwor c3RhdGljIHZvaWQgaW5zZXJ0X2V4Y2VwdGlvbihzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlICpl aCwgc3RydWN0IGV4Y2VwdGlvbiAqZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsID0gJmVo LT50YWJsZVtleGNlcHRpb25faGFzaChlaCwgZS0+b2xkX2NodW5rKV07CisJbGlzdF9hZGQo JmUtPmhhc2hfbGlzdCwgbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZW1vdmVfZXhj ZXB0aW9uKHN0cnVjdCBleGNlcHRpb24gKmUpCit7CisJbGlzdF9kZWwoJmUtPmhhc2hfbGlz dCk7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGV4Y2VwdGlvbiBkYXRhIGZvciBhIHNlY3Rv ciwgb3IgTlVMTCBpZiBub3QKKyAqIHJlbWFwcGVkLgorICovCitzdGF0aWMgc3RydWN0IGV4 Y2VwdGlvbiAqbG9va3VwX2V4Y2VwdGlvbihzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlICpldCwK KwkJCQkJICBjaHVua190IGNodW5rKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnNsb3QsICpl bDsKKwlzdHJ1Y3QgZXhjZXB0aW9uICplOworCisJc2xvdCA9ICZldC0+dGFibGVbZXhjZXB0 aW9uX2hhc2goZXQsIGNodW5rKV07CisJbGlzdF9mb3JfZWFjaChlbCwgc2xvdCkgeworCQll ID0gbGlzdF9lbnRyeShlbCwgc3RydWN0IGV4Y2VwdGlvbiwgaGFzaF9saXN0KTsKKwkJaWYg KGUtPm9sZF9jaHVuayA9PSBjaHVuaykKKwkJCXJldHVybiBlOworCX0KKworCXJldHVybiBO VUxMOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBleGNlcHRpb24gKmFsbG9jX2V4Y2Vw dGlvbih2b2lkKQoreworCXN0cnVjdCBleGNlcHRpb24gKmU7CisKKwllID0ga21lbV9jYWNo ZV9hbGxvYyhleGNlcHRpb25fY2FjaGUsIEdGUF9OT0lPKTsKKwlpZiAoIWUpCisJCWUgPSBr bWVtX2NhY2hlX2FsbG9jKGV4Y2VwdGlvbl9jYWNoZSwgR0ZQX0FUT01JQyk7CisKKwlyZXR1 cm4gZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZyZWVfZXhjZXB0aW9uKHN0cnVjdCBl eGNlcHRpb24gKmUpCit7CisJa21lbV9jYWNoZV9mcmVlKGV4Y2VwdGlvbl9jYWNoZSwgZSk7 Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBlbmRpbmdfZXhjZXB0aW9uICphbGxvY19w ZW5kaW5nX2V4Y2VwdGlvbih2b2lkKQoreworCXJldHVybiBtZW1wb29sX2FsbG9jKHBlbmRp bmdfcG9vbCwgR0ZQX05PSU8pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9wZW5k aW5nX2V4Y2VwdGlvbihzdHJ1Y3QgcGVuZGluZ19leGNlcHRpb24gKnBlKQoreworCW1lbXBv b2xfZnJlZShwZSwgcGVuZGluZ19wb29sKTsKK30KKworaW50IGRtX2FkZF9leGNlcHRpb24o c3RydWN0IGRtX3NuYXBzaG90ICpzLCBjaHVua190IG9sZCwgY2h1bmtfdCBuZXcpCit7CisJ c3RydWN0IGV4Y2VwdGlvbiAqZTsKKworCWUgPSBhbGxvY19leGNlcHRpb24oKTsKKwlpZiAo IWUpCisJCXJldHVybiAtRU5PTUVNOworCisJZS0+b2xkX2NodW5rID0gb2xkOworCWUtPm5l d19jaHVuayA9IG5ldzsKKwlpbnNlcnRfZXhjZXB0aW9uKCZzLT5jb21wbGV0ZSwgZSk7CisJ cmV0dXJuIDA7Cit9CisKKy8qCisgKiBIYXJkIGNvZGVkIG1hZ2ljLgorICovCitzdGF0aWMg aW50IGNhbGNfbWF4X2J1Y2tldHModm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIG1lbTsKKwor CW1lbSA9IG51bV9waHlzcGFnZXMgPDwgUEFHRV9TSElGVDsKKwltZW0gLz0gNTA7CisJbWVt IC89IHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKTsKKworCXJldHVybiBtZW07Cit9CisKKy8q CisgKiBSb3VuZHMgYSBudW1iZXIgZG93biB0byBhIHBvd2VyIG9mIDIuCisgKi8KK3N0YXRp YyBpbmxpbmUgdWludDMyX3Qgcm91bmRfZG93bih1aW50MzJfdCBuKQoreworCXdoaWxlIChu ICYgKG4gLSAxKSkKKwkJbiAmPSAobiAtIDEpOworCXJldHVybiBuOworfQorCisvKgorICog QWxsb2NhdGUgcm9vbSBmb3IgYSBzdWl0YWJsZSBoYXNoIHRhYmxlLgorICovCitzdGF0aWMg aW50IGluaXRfaGFzaF90YWJsZXMoc3RydWN0IGRtX3NuYXBzaG90ICpzKQoreworCXNlY3Rv cl90IGhhc2hfc2l6ZSwgY293X2Rldl9zaXplLCBvcmlnaW5fZGV2X3NpemUsIG1heF9idWNr ZXRzOworCisJLyoKKwkgKiBDYWxjdWxhdGUgYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlIG9y aWdpbmFsIHZvbHVtZSBvcgorCSAqIHRoZSBDT1cgdm9sdW1lLi4uCisJICovCisJY293X2Rl dl9zaXplID0gZ2V0X2Rldl9zaXplKHMtPmNvdy0+ZGV2KTsKKwlvcmlnaW5fZGV2X3NpemUg PSBnZXRfZGV2X3NpemUocy0+b3JpZ2luLT5kZXYpOworCW1heF9idWNrZXRzID0gY2FsY19t YXhfYnVja2V0cygpOworCisJaGFzaF9zaXplID0gbWluKG9yaWdpbl9kZXZfc2l6ZSwgY293 X2Rldl9zaXplKSAvIHMtPmNodW5rX3NpemU7CisJaGFzaF9zaXplID0gbWluKGhhc2hfc2l6 ZSwgbWF4X2J1Y2tldHMpOworCisJLyogUm91bmQgaXQgZG93biB0byBhIHBvd2VyIG9mIDIg Ki8KKwloYXNoX3NpemUgPSByb3VuZF9kb3duKGhhc2hfc2l6ZSk7CisJaWYgKGluaXRfZXhj ZXB0aW9uX3RhYmxlKCZzLT5jb21wbGV0ZSwgaGFzaF9zaXplKSkKKwkJcmV0dXJuIC1FTk9N RU07CisKKwkvKgorCSAqIEFsbG9jYXRlIGhhc2ggdGFibGUgZm9yIGluLWZsaWdodCBleGNl cHRpb25zCisJICogTWFrZSB0aGlzIHNtYWxsZXIgdGhhbiB0aGUgcmVhbCBoYXNoIHRhYmxl CisJICovCisJaGFzaF9zaXplID4+PSAzOworCWlmICghaGFzaF9zaXplKQorCQloYXNoX3Np emUgPSA2NDsKKworCWlmIChpbml0X2V4Y2VwdGlvbl90YWJsZSgmcy0+cGVuZGluZywgaGFz aF9zaXplKSkgeworCQlleGl0X2V4Y2VwdGlvbl90YWJsZSgmcy0+Y29tcGxldGUsIGV4Y2Vw dGlvbl9jYWNoZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQor CisvKgorICogUm91bmQgYSBudW1iZXIgdXAgdG8gdGhlIG5lYXJlc3QgJ3NpemUnIGJvdW5k YXJ5LiAgc2l6ZSBtdXN0CisgKiBiZSBhIHBvd2VyIG9mIDIuCisgKi8KK3N0YXRpYyBpbmxp bmUgdWxvbmcgcm91bmRfdXAodWxvbmcgbiwgdWxvbmcgc2l6ZSkKK3sKKwlzaXplLS07CisJ cmV0dXJuIChuICsgc2l6ZSkgJiB+c2l6ZTsKK30KKworLyoKKyAqIENvbnN0cnVjdCBhIHNu YXBzaG90IG1hcHBpbmc6IDxvcmlnaW5fZGV2PiA8Q09XLWRldj4gPHAvbj4gPGNodW5rLXNp emU+CisgKi8KK3N0YXRpYyBpbnQgc25hcHNob3RfY3RyKHN0cnVjdCBkbV90YXJnZXQgKnRp LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGRtX3NuYXBzaG90ICpzOwor CXVuc2lnbmVkIGxvbmcgY2h1bmtfc2l6ZTsKKwlpbnQgciA9IC1FSU5WQUw7CisJY2hhciAq cGVyc2lzdGVudDsKKwljaGFyICpvcmlnaW5fcGF0aDsKKwljaGFyICpjb3dfcGF0aDsKKwlj aGFyICp2YWx1ZTsKKwlpbnQgYmxvY2tzaXplOworCisJaWYgKGFyZ2MgPCA0KSB7CisJCXRp LT5lcnJvciA9ICJkbS1zbmFwc2hvdDogcmVxdWlyZXMgZXhhY3RseSA0IGFyZ3VtZW50cyI7 CisJCXIgPSAtRUlOVkFMOworCQlnb3RvIGJhZDsKKwl9CisKKwlvcmlnaW5fcGF0aCA9IGFy Z3ZbMF07CisJY293X3BhdGggPSBhcmd2WzFdOworCXBlcnNpc3RlbnQgPSBhcmd2WzJdOwor CisJaWYgKCgqcGVyc2lzdGVudCAmIDB4NWYpICE9ICdQJyAmJiAoKnBlcnNpc3RlbnQgJiAw eDVmKSAhPSAnTicpIHsKKwkJdGktPmVycm9yID0gIlBlcnNpc3RlbnQgZmxhZyBpcyBub3Qg UCBvciBOIjsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gYmFkOworCX0KKworCWNodW5rX3Np emUgPSBzaW1wbGVfc3RydG91bChhcmd2WzNdLCAmdmFsdWUsIDEwKTsKKwlpZiAoY2h1bmtf c2l6ZSA9PSAwIHx8IHZhbHVlID09IE5VTEwpIHsKKwkJdGktPmVycm9yID0gIkludmFsaWQg Y2h1bmsgc2l6ZSI7CisJCXIgPSAtRUlOVkFMOworCQlnb3RvIGJhZDsKKwl9CisKKwlzID0g a21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAocyA9PSBOVUxMKSB7CisJ CXRpLT5lcnJvciA9ICJDYW5ub3QgYWxsb2NhdGUgc25hcHNob3QgY29udGV4dCBwcml2YXRl IHN0cnVjdHVyZSI7CisJCXIgPSAtRU5PTUVNOworCQlnb3RvIGJhZDsKKwl9CisKKwlyID0g ZG1fZ2V0X2RldmljZSh0aSwgb3JpZ2luX3BhdGgsIDAsIHRpLT5sZW4sIEZNT0RFX1JFQUQs ICZzLT5vcmlnaW4pOworCWlmIChyKSB7CisJCXRpLT5lcnJvciA9ICJDYW5ub3QgZ2V0IG9y aWdpbiBkZXZpY2UiOworCQlnb3RvIGJhZF9mcmVlOworCX0KKworCS8qIEZJWE1FOiBnZXQg Y293IGxlbmd0aCAqLworCXIgPSBkbV9nZXRfZGV2aWNlKHRpLCBjb3dfcGF0aCwgMCwgMCwK KwkJCSAgRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFLCAmcy0+Y293KTsKKwlpZiAocikgewor CQlkbV9wdXRfZGV2aWNlKHRpLCBzLT5vcmlnaW4pOworCQl0aS0+ZXJyb3IgPSAiQ2Fubm90 IGdldCBDT1cgZGV2aWNlIjsKKwkJZ290byBiYWRfZnJlZTsKKwl9CisKKwkvKgorCSAqIENo dW5rIHNpemUgbXVzdCBiZSBtdWx0aXBsZSBvZiBwYWdlIHNpemUuICBTaWxlbnRseQorCSAq IHJvdW5kIHVwIGlmIGl0J3Mgbm90LgorCSAqLworCWNodW5rX3NpemUgPSByb3VuZF91cChj aHVua19zaXplLCBQQUdFX1NJWkUgLyBTRUNUT1JfU0laRSk7CisKKwkvKiBWYWxpZGF0ZSB0 aGUgY2h1bmsgc2l6ZSBhZ2FpbnN0IHRoZSBkZXZpY2UgYmxvY2sgc2l6ZSAqLworCWJsb2Nr c2l6ZSA9IGdldF9oYXJkc2VjdF9zaXplKHMtPmNvdy0+ZGV2KTsKKwlpZiAoY2h1bmtfc2l6 ZSAlIChibG9ja3NpemUgLyBTRUNUT1JfU0laRSkpIHsKKwkJdGktPmVycm9yID0gIkNodW5r IHNpemUgaXMgbm90IGEgbXVsdGlwbGUgb2YgZGV2aWNlIGJsb2Nrc2l6ZSI7CisJCXIgPSAt RUlOVkFMOworCQlnb3RvIGJhZF9wdXRkZXY7CisJfQorCisJLyogQ2hlY2sgdGhlIHNpemVz IGFyZSBzbWFsbCBlbm91Z2ggdG8gZml0IGluIG9uZSBraW92ZWMgKi8KKwlpZiAoY2h1bmtf c2l6ZSA+IEtJT19NQVhfU0VDVE9SUykgeworCQl0aS0+ZXJyb3IgPSAiQ2h1bmsgc2l6ZSBp cyB0b28gYmlnIjsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gYmFkX3B1dGRldjsKKwl9CisK KwkvKiBDaGVjayBjaHVua19zaXplIGlzIGEgcG93ZXIgb2YgMiAqLworCWlmIChjaHVua19z aXplICYgKGNodW5rX3NpemUgLSAxKSkgeworCQl0aS0+ZXJyb3IgPSAiQ2h1bmsgc2l6ZSBp cyBub3QgYSBwb3dlciBvZiAyIjsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gYmFkX3B1dGRl djsKKwl9CisKKwlzLT5jaHVua19zaXplID0gY2h1bmtfc2l6ZTsKKwlzLT5jaHVua19tYXNr ID0gY2h1bmtfc2l6ZSAtIDE7CisJcy0+dHlwZSA9ICpwZXJzaXN0ZW50OworCWZvciAocy0+ Y2h1bmtfc2hpZnQgPSAwOyBjaHVua19zaXplOworCSAgICAgcy0+Y2h1bmtfc2hpZnQrKywg Y2h1bmtfc2l6ZSA+Pj0gMSkKKwkJOworCXMtPmNodW5rX3NoaWZ0LS07CisKKwlzLT52YWxp ZCA9IDE7CisJcy0+bGFzdF9wZXJjZW50ID0gMDsKKwlpbml0X3J3c2VtKCZzLT5sb2NrKTsK KworCS8qIEFsbG9jYXRlIGhhc2ggdGFibGUgZm9yIENPVyBkYXRhICovCisJaWYgKGluaXRf aGFzaF90YWJsZXMocykpIHsKKwkJdGktPmVycm9yID0gIlVuYWJsZSB0byBhbGxvY2F0ZSBo YXNoIHRhYmxlIHNwYWNlIjsKKwkJciA9IC1FTk9NRU07CisJCWdvdG8gYmFkX3B1dGRldjsK Kwl9CisKKwkvKgorCSAqIENoZWNrIHRoZSBwZXJzaXN0ZW50IGZsYWcgLSBkb25lIGhlcmUg YmVjYXVzZSB3ZSBuZWVkIHRoZSBpb2J1ZgorCSAqIHRvIGNoZWNrIHRoZSBMViBoZWFkZXIK KwkgKi8KKwlzLT5zdG9yZS5zbmFwID0gczsKKworCWlmICgoKnBlcnNpc3RlbnQgJiAweDVm KSA9PSAnUCcpCisJCXIgPSBkbV9jcmVhdGVfcGVyc2lzdGVudCgmcy0+c3RvcmUsIHMtPmNo dW5rX3NpemUpOworCWVsc2UKKwkJciA9IGRtX2NyZWF0ZV90cmFuc2llbnQoJnMtPnN0b3Jl LCBzLCBibG9ja3NpemUpOworCisJaWYgKHIpIHsKKwkJdGktPmVycm9yID0gIkNvdWxkbid0 IGNyZWF0ZSBleGNlcHRpb24gc3RvcmUiOworCQlyID0gLUVJTlZBTDsKKwkJZ290byBiYWRf ZnJlZTE7CisJfQorCisJLyogRmx1c2ggSU8gdG8gdGhlIG9yaWdpbiBkZXZpY2UgKi8KKyNp ZiBMVk1fVkZTX0VOSEFOQ0VNRU5UCisJZnN5bmNfZGV2X2xvY2tmcyhzLT5vcmlnaW4tPmRl dik7CisjZWxzZQorCWZzeW5jX2RldihzLT5vcmlnaW4tPmRldik7CisjZW5kaWYKKworCS8q IEFkZCBzbmFwc2hvdCB0byB0aGUgbGlzdCBvZiBzbmFwc2hvdHMgZm9yIHRoaXMgb3JpZ2lu ICovCisJaWYgKHJlZ2lzdGVyX3NuYXBzaG90KHMpKSB7CisJCXIgPSAtRUlOVkFMOworCQl0 aS0+ZXJyb3IgPSAiQ2Fubm90IHJlZ2lzdGVyIHNuYXBzaG90IG9yaWdpbiI7CisJCWdvdG8g YmFkX2ZyZWUyOworCX0KKyNpZiBMVk1fVkZTX0VOSEFOQ0VNRU5UCisJdW5sb2NrZnMocy0+ b3JpZ2luLT5kZXYpOworI2VuZGlmCisJa2NvcHlkX2luY19jbGllbnRfY291bnQoKTsKKwor CXRpLT5wcml2YXRlID0gczsKKwlyZXR1cm4gMDsKKworICAgICAgYmFkX2ZyZWUyOgorCXMt PnN0b3JlLmRlc3Ryb3koJnMtPnN0b3JlKTsKKworICAgICAgYmFkX2ZyZWUxOgorCWV4aXRf ZXhjZXB0aW9uX3RhYmxlKCZzLT5wZW5kaW5nLCBwZW5kaW5nX2NhY2hlKTsKKwlleGl0X2V4 Y2VwdGlvbl90YWJsZSgmcy0+Y29tcGxldGUsIGV4Y2VwdGlvbl9jYWNoZSk7CisKKyAgICAg IGJhZF9wdXRkZXY6CisJZG1fcHV0X2RldmljZSh0aSwgcy0+Y293KTsKKwlkbV9wdXRfZGV2 aWNlKHRpLCBzLT5vcmlnaW4pOworCisgICAgICBiYWRfZnJlZToKKwlrZnJlZShzKTsKKwor ICAgICAgYmFkOgorCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBzbmFwc2hvdF9kdHIo c3RydWN0IGRtX3RhcmdldCAqdGkpCit7CisJc3RydWN0IGRtX3NuYXBzaG90ICpzID0gKHN0 cnVjdCBkbV9zbmFwc2hvdCAqKSB0aS0+cHJpdmF0ZTsKKworCWRtX3RhYmxlX2V2ZW50KHRp LT50YWJsZSk7CisKKwl1bnJlZ2lzdGVyX3NuYXBzaG90KHMpOworCisJZXhpdF9leGNlcHRp b25fdGFibGUoJnMtPnBlbmRpbmcsIHBlbmRpbmdfY2FjaGUpOworCWV4aXRfZXhjZXB0aW9u X3RhYmxlKCZzLT5jb21wbGV0ZSwgZXhjZXB0aW9uX2NhY2hlKTsKKworCS8qIERlYWxsb2Nh dGUgbWVtb3J5IHVzZWQgKi8KKwlzLT5zdG9yZS5kZXN0cm95KCZzLT5zdG9yZSk7CisKKwlk bV9wdXRfZGV2aWNlKHRpLCBzLT5vcmlnaW4pOworCWRtX3B1dF9kZXZpY2UodGksIHMtPmNv dyk7CisJa2ZyZWUocyk7CisKKwlrY29weWRfZGVjX2NsaWVudF9jb3VudCgpOworfQorCisv KgorICogV2UgaG9sZCBsaXN0cyBvZiBidWZmZXJfaGVhZHMsIHVzaW5nIHRoZSBiX3JlcW5l eHQgZmllbGQuCisgKi8KK3N0YXRpYyB2b2lkIHF1ZXVlX2J1ZmZlcihzdHJ1Y3QgYnVmZmVy X2hlYWQgKipxdWV1ZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwliaC0+Yl9yZXFu ZXh0ID0gKnF1ZXVlOworCSpxdWV1ZSA9IGJoOworfQorCisvKgorICogRmx1c2ggYSBsaXN0 IG9mIGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyB2b2lkIGZsdXNoX2J1ZmZlcnMoc3RydWN0IGJ1 ZmZlcl9oZWFkICpiaCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm47CisKKwlETURFQlVH KCJiZWdpbiBmbHVzaCIpOworCXdoaWxlIChiaCkgeworCQluID0gYmgtPmJfcmVxbmV4dDsK KwkJYmgtPmJfcmVxbmV4dCA9IE5VTEw7CisJCURNREVCVUcoImZsdXNoaW5nICVwIiwgYmgp OworCQlnZW5lcmljX21ha2VfcmVxdWVzdChXUklURSwgYmgpOworCQliaCA9IG47CisJfQor CisJcnVuX3Rhc2tfcXVldWUoJnRxX2Rpc2spOworfQorCisvKgorICogRXJyb3IgYSBsaXN0 IG9mIGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyB2b2lkIGVycm9yX2J1ZmZlcnMoc3RydWN0IGJ1 ZmZlcl9oZWFkICpiaCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm47CisKKwl3aGlsZSAo YmgpIHsKKwkJbiA9IGJoLT5iX3JlcW5leHQ7CisJCWJoLT5iX3JlcW5leHQgPSBOVUxMOwor CQlidWZmZXJfSU9fZXJyb3IoYmgpOworCQliaCA9IG47CisJfQorfQorCitzdGF0aWMgdm9p ZCBwZW5kaW5nX2NvbXBsZXRlKHN0cnVjdCBwZW5kaW5nX2V4Y2VwdGlvbiAqcGUsIGludCBz dWNjZXNzKQoreworCXN0cnVjdCBleGNlcHRpb24gKmU7CisJc3RydWN0IGRtX3NuYXBzaG90 ICpzID0gcGUtPnNuYXA7CisKKwlpZiAoc3VjY2VzcykgeworCQllID0gYWxsb2NfZXhjZXB0 aW9uKCk7CisJCWlmICghZSkgeworCQkJcHJpbnRrKCJVbmFibGUgdG8gYWxsb2NhdGUgZXhj ZXB0aW9uLiIpOworCQkJZG93bl93cml0ZSgmcy0+bG9jayk7CisJCQlzLT5zdG9yZS5kcm9w X3NuYXBzaG90KCZzLT5zdG9yZSk7CisJCQlzLT52YWxpZCA9IDA7CisJCQl1cF93cml0ZSgm cy0+bG9jayk7CisJCQlyZXR1cm47CisJCX0KKworCQkvKgorCQkgKiBBZGQgYSBwcm9wZXIg ZXhjZXB0aW9uLCBhbmQgcmVtb3ZlIHRoZQorCQkgKiBpbmZsaWdodCBleGNlcHRpb24gZnJv bSB0aGUgbGlzdC4KKwkJICovCisJCWRvd25fd3JpdGUoJnMtPmxvY2spOworCisJCW1lbWNw eShlLCAmcGUtPmUsIHNpemVvZigqZSkpOworCQlpbnNlcnRfZXhjZXB0aW9uKCZzLT5jb21w bGV0ZSwgZSk7CisJCXJlbW92ZV9leGNlcHRpb24oJnBlLT5lKTsKKworCQkvKiBTdWJtaXQg YW55IHBlbmRpbmcgd3JpdGUgQkhzICovCisJCXVwX3dyaXRlKCZzLT5sb2NrKTsKKworCQlm bHVzaF9idWZmZXJzKHBlLT5zbmFwc2hvdF9iaHMpOworCQlETURFQlVHKCJFeGNlcHRpb24g Y29tcGxldGVkIHN1Y2Nlc3NmdWxseS4iKTsKKworCQkvKiBOb3RpZnkgYW55IGludGVyZXN0 ZWQgcGFydGllcyAqLworCQlpZiAocy0+c3RvcmUucGVyY2VudF9mdWxsKSB7CisJCQlpbnQg cGMgPSBzLT5zdG9yZS5wZXJjZW50X2Z1bGwoJnMtPnN0b3JlKTsKKworCQkJaWYgKHBjID49 IHMtPmxhc3RfcGVyY2VudCArIFdBS0VfVVBfUEVSQ0VOVCkgeworCQkJCWRtX3RhYmxlX2V2 ZW50KHMtPnRhYmxlKTsKKwkJCQlzLT5sYXN0X3BlcmNlbnQgPSBwYyAtIHBjICUgV0FLRV9V UF9QRVJDRU5UOworCQkJfQorCQl9CisKKwl9IGVsc2UgeworCQkvKiBSZWFkL3dyaXRlIGVy cm9yIC0gc25hcHNob3QgaXMgdW51c2FibGUgKi8KKwkJRE1FUlIoIkVycm9yIHJlYWRpbmcv d3JpdGluZyBzbmFwc2hvdCIpOworCisJCWRvd25fd3JpdGUoJnMtPmxvY2spOworCQlzLT5z dG9yZS5kcm9wX3NuYXBzaG90KCZzLT5zdG9yZSk7CisJCXMtPnZhbGlkID0gMDsKKwkJcmVt b3ZlX2V4Y2VwdGlvbigmcGUtPmUpOworCQl1cF93cml0ZSgmcy0+bG9jayk7CisKKwkJZXJy b3JfYnVmZmVycyhwZS0+c25hcHNob3RfYmhzKTsKKworCQlkbV90YWJsZV9ldmVudChzLT50 YWJsZSk7CisJCURNREVCVUcoIkV4Y2VwdGlvbiBmYWlsZWQuIik7CisJfQorCisJaWYgKGxp c3RfZW1wdHkoJnBlLT5zaWJsaW5ncykpCisJCWZsdXNoX2J1ZmZlcnMocGUtPm9yaWdpbl9i aHMpOworCWVsc2UKKwkJbGlzdF9kZWwoJnBlLT5zaWJsaW5ncyk7CisKKwlmcmVlX3BlbmRp bmdfZXhjZXB0aW9uKHBlKTsKK30KKworc3RhdGljIHZvaWQgY29tbWl0X2NhbGxiYWNrKHZv aWQgKmNvbnRleHQsIGludCBzdWNjZXNzKQoreworCXN0cnVjdCBwZW5kaW5nX2V4Y2VwdGlv biAqcGUgPSAoc3RydWN0IHBlbmRpbmdfZXhjZXB0aW9uICopIGNvbnRleHQ7CisJcGVuZGlu Z19jb21wbGV0ZShwZSwgc3VjY2Vzcyk7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiB0aGUg Y29weSBJL08gaGFzIGZpbmlzaGVkLiAga2NvcHlkIGFjdHVhbGx5IHJ1bnMKKyAqIHRoaXMg Y29kZSBzbyBkb24ndCBibG9jay4KKyAqLworc3RhdGljIHZvaWQgY29weV9jYWxsYmFjayhp bnQgZXJyLCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBwZW5kaW5nX2V4Y2VwdGlvbiAq cGUgPSAoc3RydWN0IHBlbmRpbmdfZXhjZXB0aW9uICopIGNvbnRleHQ7CisJc3RydWN0IGRt X3NuYXBzaG90ICpzID0gcGUtPnNuYXA7CisKKwlpZiAoZXJyKQorCQlwZW5kaW5nX2NvbXBs ZXRlKHBlLCAwKTsKKworCWVsc2UKKwkJLyogVXBkYXRlIHRoZSBtZXRhZGF0YSBpZiB3ZSBh cmUgcGVyc2lzdGVudCAqLworCQlzLT5zdG9yZS5jb21taXRfZXhjZXB0aW9uKCZzLT5zdG9y ZSwgJnBlLT5lLCBjb21taXRfY2FsbGJhY2ssCisJCQkJCSAgcGUpOworfQorCisvKgorICog RGlzcGF0Y2hlcyB0aGUgY29weSBvcGVyYXRpb24gdG8ga2NvcHlkLgorICovCitzdGF0aWMg aW5saW5lIHZvaWQgc3RhcnRfY29weShzdHJ1Y3QgcGVuZGluZ19leGNlcHRpb24gKnBlKQor eworCXN0cnVjdCBkbV9zbmFwc2hvdCAqcyA9IHBlLT5zbmFwOworCXN0cnVjdCBrY29weWRf cmVnaW9uIHNyYywgZGVzdDsKKworCXNyYy5kZXYgPSBzLT5vcmlnaW4tPmRldjsKKwlzcmMu c2VjdG9yID0gY2h1bmtfdG9fc2VjdG9yKHMsIHBlLT5lLm9sZF9jaHVuayk7CisJc3JjLmNv dW50ID0gcy0+Y2h1bmtfc2l6ZTsKKworCWRlc3QuZGV2ID0gcy0+Y293LT5kZXY7CisJZGVz dC5zZWN0b3IgPSBjaHVua190b19zZWN0b3IocywgcGUtPmUubmV3X2NodW5rKTsKKwlkZXN0 LmNvdW50ID0gcy0+Y2h1bmtfc2l6ZTsKKworCWlmICghcGUtPnN0YXJ0ZWQpIHsKKwkJLyog SGFuZCBvdmVyIHRvIGtjb3B5ZCAqLworCQlrY29weWRfY29weSgmc3JjLCAmZGVzdCwgY29w eV9jYWxsYmFjaywgcGUpOworCQlwZS0+c3RhcnRlZCA9IDE7CisJfQorfQorCisvKgorICog TG9va3MgdG8gc2VlIGlmIHRoaXMgc25hcHNob3QgYWxyZWFkeSBoYXMgYSBwZW5kaW5nIGV4 Y2VwdGlvbgorICogZm9yIHRoaXMgY2h1bmssIG90aGVyd2lzZSBpdCBhbGxvY2F0ZXMgYSBu ZXcgb25lIGFuZCBpbnNlcnRzCisgKiBpdCBpbnRvIHRoZSBwZW5kaW5nIHRhYmxlLgorICov CitzdGF0aWMgc3RydWN0IHBlbmRpbmdfZXhjZXB0aW9uICpmaW5kX3BlbmRpbmdfZXhjZXB0 aW9uKHN0cnVjdCBkbV9zbmFwc2hvdCAqcywKKwkJCQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQg KmJoKQoreworCXN0cnVjdCBleGNlcHRpb24gKmU7CisJc3RydWN0IHBlbmRpbmdfZXhjZXB0 aW9uICpwZTsKKwljaHVua190IGNodW5rID0gc2VjdG9yX3RvX2NodW5rKHMsIGJoLT5iX3Jz ZWN0b3IpOworCisJLyoKKwkgKiBJcyB0aGVyZSBhIHBlbmRpbmcgZXhjZXB0aW9uIGZvciB0 aGlzIGFscmVhZHkgPworCSAqLworCWUgPSBsb29rdXBfZXhjZXB0aW9uKCZzLT5wZW5kaW5n LCBjaHVuayk7CisJaWYgKGUpIHsKKwkJLyogY2FzdCB0aGUgZXhjZXB0aW9uIHRvIGEgcGVu ZGluZyBleGNlcHRpb24gKi8KKwkJcGUgPSBsaXN0X2VudHJ5KGUsIHN0cnVjdCBwZW5kaW5n X2V4Y2VwdGlvbiwgZSk7CisKKwl9IGVsc2UgeworCQkvKiBDcmVhdGUgYSBuZXcgcGVuZGlu ZyBleGNlcHRpb24gKi8KKwkJcGUgPSBhbGxvY19wZW5kaW5nX2V4Y2VwdGlvbigpOworCQlp ZiAoIXBlKSB7CisJCQlETVdBUk4oIkNvdWxkbid0IGFsbG9jYXRlIHBlbmRpbmcgZXhjZXB0 aW9uLiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlwZS0+ZS5vbGRfY2h1bmsgPSBj aHVuazsKKwkJcGUtPm9yaWdpbl9iaHMgPSBwZS0+c25hcHNob3RfYmhzID0gTlVMTDsKKwkJ SU5JVF9MSVNUX0hFQUQoJnBlLT5zaWJsaW5ncyk7CisJCXBlLT5zbmFwID0gczsKKwkJcGUt PnN0YXJ0ZWQgPSAwOworCisJCWlmIChzLT5zdG9yZS5wcmVwYXJlX2V4Y2VwdGlvbigmcy0+ c3RvcmUsICZwZS0+ZSkpIHsKKwkJCWZyZWVfcGVuZGluZ19leGNlcHRpb24ocGUpOworCQkJ cy0+dmFsaWQgPSAwOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlpbnNlcnRfZXhjZXB0 aW9uKCZzLT5wZW5kaW5nLCAmcGUtPmUpOworCX0KKworCXJldHVybiBwZTsKK30KKworc3Rh dGljIGlubGluZSB2b2lkIHJlbWFwX2V4Y2VwdGlvbihzdHJ1Y3QgZG1fc25hcHNob3QgKnMs IHN0cnVjdCBleGNlcHRpb24gKmUsCisJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkK K3sKKwliaC0+Yl9yZGV2ID0gcy0+Y293LT5kZXY7CisJYmgtPmJfcnNlY3RvciA9IGNodW5r X3RvX3NlY3RvcihzLCBlLT5uZXdfY2h1bmspICsKKwkgICAgKGJoLT5iX3JzZWN0b3IgJiBz LT5jaHVua19tYXNrKTsKK30KKworc3RhdGljIGludCBzbmFwc2hvdF9tYXAoc3RydWN0IGRt X3RhcmdldCAqdGksIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBydykKK3sKKwlzdHJ1 Y3QgZXhjZXB0aW9uICplOworCXN0cnVjdCBkbV9zbmFwc2hvdCAqcyA9IChzdHJ1Y3QgZG1f c25hcHNob3QgKikgdGktPnByaXZhdGU7CisJaW50IHIgPSAxOworCWNodW5rX3QgY2h1bms7 CisJc3RydWN0IHBlbmRpbmdfZXhjZXB0aW9uICpwZTsKKworCWNodW5rID0gc2VjdG9yX3Rv X2NodW5rKHMsIGJoLT5iX3JzZWN0b3IpOworCisJLyogRnVsbCBzbmFwc2hvdHMgYXJlIG5v dCB1c2FibGUgKi8KKwlpZiAoIXMtPnZhbGlkKQorCQlyZXR1cm4gLTE7CisKKwkvKgorCSAq IFdyaXRlIHRvIHNuYXBzaG90IC0gaGlnaGVyIGxldmVsIHRha2VzIGNhcmUgb2YgUlcvUk8K KwkgKiBmbGFncyBzbyB3ZSBzaG91bGQgb25seSBnZXQgdGhpcyBpZiB3ZSBhcmUKKwkgKiB3 cml0ZWFibGUuCisJICovCisJaWYgKHJ3ID09IFdSSVRFKSB7CisKKwkJZG93bl93cml0ZSgm cy0+bG9jayk7CisKKwkJLyogSWYgdGhlIGJsb2NrIGlzIGFscmVhZHkgcmVtYXBwZWQgLSB1 c2UgdGhhdCwgZWxzZSByZW1hcCBpdCAqLworCQllID0gbG9va3VwX2V4Y2VwdGlvbigmcy0+ Y29tcGxldGUsIGNodW5rKTsKKwkJaWYgKGUpCisJCQlyZW1hcF9leGNlcHRpb24ocywgZSwg YmgpOworCisJCWVsc2UgeworCQkJcGUgPSBmaW5kX3BlbmRpbmdfZXhjZXB0aW9uKHMsIGJo KTsKKworCQkJaWYgKCFwZSkgeworCQkJCXMtPnN0b3JlLmRyb3Bfc25hcHNob3QoJnMtPnN0 b3JlKTsKKwkJCQlzLT52YWxpZCA9IDA7CisJCQl9CisKKwkJCXF1ZXVlX2J1ZmZlcigmcGUt PnNuYXBzaG90X2JocywgYmgpOworCQkJc3RhcnRfY29weShwZSk7CisJCQlyID0gMDsKKwkJ fQorCisJCXVwX3dyaXRlKCZzLT5sb2NrKTsKKworCX0gZWxzZSB7CisJCS8qCisJCSAqIEZJ WE1FOiB0aGlzIHJlYWQgcGF0aCBzY2FyZXMgbWUgYmVjYXVzZSB3ZQorCQkgKiBhbHdheXMg dXNlIHRoZSBvcmlnaW4gd2hlbiB3ZSBoYXZlIGEgcGVuZGluZworCQkgKiBleGNlcHRpb24u ICBIb3dldmVyIEkgY2FuJ3QgdGhpbmsgb2YgYQorCQkgKiBzaXR1YXRpb24gd2hlcmUgdGhp cyBpcyB3cm9uZyAtIGVqdC4KKwkJICovCisKKwkJLyogRG8gcmVhZHMgKi8KKwkJZG93bl9y ZWFkKCZzLT5sb2NrKTsKKworCQkvKiBTZWUgaWYgaXQgaXQgaGFzIGJlZW4gcmVtYXBwZWQg Ki8KKwkJZSA9IGxvb2t1cF9leGNlcHRpb24oJnMtPmNvbXBsZXRlLCBjaHVuayk7CisJCWlm IChlKQorCQkJcmVtYXBfZXhjZXB0aW9uKHMsIGUsIGJoKTsKKwkJZWxzZQorCQkJYmgtPmJf cmRldiA9IHMtPm9yaWdpbi0+ZGV2OworCisJCXVwX3JlYWQoJnMtPmxvY2spOworCX0KKwor CXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBsaXN0X21lcmdlKHN0cnVjdCBsaXN0X2hl YWQgKmwxLCBzdHJ1Y3QgbGlzdF9oZWFkICpsMikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICps MV9uLCAqbDJfcDsKKworCWwxX24gPSBsMS0+bmV4dDsKKwlsMl9wID0gbDItPnByZXY7CisK KwlsMS0+bmV4dCA9IGwyOworCWwyLT5wcmV2ID0gbDE7CisKKwlsMl9wLT5uZXh0ID0gbDFf bjsKKwlsMV9uLT5wcmV2ID0gbDJfcDsKK30KKworc3RhdGljIGludCBfX29yaWdpbl93cml0 ZShzdHJ1Y3QgbGlzdF9oZWFkICpzbmFwc2hvdHMsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgp Cit7CisJaW50IHIgPSAxOworCXN0cnVjdCBsaXN0X2hlYWQgKnNsOworCXN0cnVjdCBkbV9z bmFwc2hvdCAqc25hcDsKKwlzdHJ1Y3QgZXhjZXB0aW9uICplOworCXN0cnVjdCBwZW5kaW5n X2V4Y2VwdGlvbiAqcGUsICpsYXN0ID0gTlVMTDsKKwljaHVua190IGNodW5rOworCisJLyog RG8gYWxsIHRoZSBzbmFwc2hvdHMgb24gdGhpcyBvcmlnaW4gKi8KKwlsaXN0X2Zvcl9lYWNo KHNsLCBzbmFwc2hvdHMpIHsKKwkJc25hcCA9IGxpc3RfZW50cnkoc2wsIHN0cnVjdCBkbV9z bmFwc2hvdCwgbGlzdCk7CisKKwkJLyogT25seSBkZWFsIHdpdGggdmFsaWQgc25hcHNob3Rz ICovCisJCWlmICghc25hcC0+dmFsaWQpCisJCQljb250aW51ZTsKKworCQlkb3duX3dyaXRl KCZzbmFwLT5sb2NrKTsKKworCQkvKgorCQkgKiBSZW1lbWJlciwgZGlmZmVyZW50IHNuYXBz aG90cyBjYW4gaGF2ZQorCQkgKiBkaWZmZXJlbnQgY2h1bmsgc2l6ZXMuCisJCSAqLworCQlj aHVuayA9IHNlY3Rvcl90b19jaHVuayhzbmFwLCBiaC0+Yl9yc2VjdG9yKTsKKworCQkvKgor CQkgKiBDaGVjayBleGNlcHRpb24gdGFibGUgdG8gc2VlIGlmIGJsb2NrCisJCSAqIGlzIGFs cmVhZHkgcmVtYXBwZWQgaW4gdGhpcyBzbmFwc2hvdAorCQkgKiBhbmQgdHJpZ2dlciBhbiBl eGNlcHRpb24gaWYgbm90LgorCQkgKi8KKwkJZSA9IGxvb2t1cF9leGNlcHRpb24oJnNuYXAt PmNvbXBsZXRlLCBjaHVuayk7CisJCWlmICghZSkgeworCQkJcGUgPSBmaW5kX3BlbmRpbmdf ZXhjZXB0aW9uKHNuYXAsIGJoKTsKKwkJCWlmICghcGUpIHsKKwkJCQlzbmFwLT5zdG9yZS5k cm9wX3NuYXBzaG90KCZzbmFwLT5zdG9yZSk7CisJCQkJc25hcC0+dmFsaWQgPSAwOworCisJ CQl9IGVsc2UgeworCQkJCWlmIChsYXN0KQorCQkJCQlsaXN0X21lcmdlKCZwZS0+c2libGlu Z3MsCisJCQkJCQkgICAmbGFzdC0+c2libGluZ3MpOworCisJCQkJbGFzdCA9IHBlOworCQkJ CXIgPSAwOworCQkJfQorCQl9CisKKwkJdXBfd3JpdGUoJnNuYXAtPmxvY2spOworCX0KKwor CS8qCisJICogTm93IHRoYXQgd2UgaGF2ZSBhIGNvbXBsZXRlIHBlIGxpc3Qgd2UgY2FuIHN0 YXJ0IHRoZSBjb3B5aW5nLgorCSAqLworCWlmIChsYXN0KSB7CisJCXBlID0gbGFzdDsKKwkJ ZG8geworCQkJZG93bl93cml0ZSgmcGUtPnNuYXAtPmxvY2spOworCQkJcXVldWVfYnVmZmVy KCZwZS0+b3JpZ2luX2JocywgYmgpOworCQkJc3RhcnRfY29weShwZSk7CisJCQl1cF93cml0 ZSgmcGUtPnNuYXAtPmxvY2spOworCQkJcGUgPSBsaXN0X2VudHJ5KHBlLT5zaWJsaW5ncy5u ZXh0LAorCQkJCQlzdHJ1Y3QgcGVuZGluZ19leGNlcHRpb24sIHNpYmxpbmdzKTsKKworCQl9 IHdoaWxlIChwZSAhPSBsYXN0KTsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGlu dCBzbmFwc2hvdF9zdGF0dXMoc3RydWN0IGRtX3RhcmdldCAqdGksIHN0YXR1c190eXBlX3Qg dHlwZSwKKwkJCSAgIGNoYXIgKnJlc3VsdCwgaW50IG1heGxlbikKK3sKKwlzdHJ1Y3QgZG1f c25hcHNob3QgKnNuYXAgPSAoc3RydWN0IGRtX3NuYXBzaG90ICopIHRpLT5wcml2YXRlOwor CWNoYXIgY293WzE2XTsKKwljaGFyIG9yZ1sxNl07CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwlj YXNlIFNUQVRVU1RZUEVfSU5GTzoKKwkJaWYgKCFzbmFwLT52YWxpZCkKKwkJCXNucHJpbnRm KHJlc3VsdCwgbWF4bGVuLCAiSW52YWxpZCIpOworCQllbHNlIHsKKwkJCWlmIChzbmFwLT5z dG9yZS5wZXJjZW50X2Z1bGwpCisJCQkJc25wcmludGYocmVzdWx0LCBtYXhsZW4sICIlZCUl IiwKKwkJCQkJIHNuYXAtPnN0b3JlLnBlcmNlbnRfZnVsbCgmc25hcC0+CisJCQkJCQkJCSAg c3RvcmUpKTsKKwkJCWVsc2UKKwkJCQlzbnByaW50ZihyZXN1bHQsIG1heGxlbiwgIlVua25v d24iKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU1RBVFVTVFlQRV9UQUJMRToKKwkJLyoK KwkJICoga2Rldm5hbWUgcmV0dXJucyBhIHN0YXRpYyBwb2ludGVyIHNvIHdlIG5lZWQKKwkJ ICogdG8gbWFrZSBwcml2YXRlIGNvcGllcyBpZiB0aGUgb3V0cHV0IGlzIHRvCisJCSAqIG1h a2Ugc2Vuc2UuCisJCSAqLworCQlzdHJuY3B5KGNvdywga2Rldm5hbWUoc25hcC0+Y293LT5k ZXYpLCBzaXplb2YoY293KSk7CisJCXN0cm5jcHkob3JnLCBrZGV2bmFtZShzbmFwLT5vcmln aW4tPmRldiksIHNpemVvZihvcmcpKTsKKwkJc25wcmludGYocmVzdWx0LCBtYXhsZW4sICIl cyAlcyAlYyAlbGQiLCBvcmcsIGNvdywKKwkJCSBzbmFwLT50eXBlLCBzbmFwLT5jaHVua19z aXplKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDYWxsZWQg b24gYSB3cml0ZSBmcm9tIHRoZSBvcmlnaW4gZHJpdmVyLgorICovCitpbnQgZG9fb3JpZ2lu KHN0cnVjdCBkbV9kZXYgKm9yaWdpbiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlz dHJ1Y3Qgb3JpZ2luICpvOworCWludCByOworCisJZG93bl9yZWFkKCZfb3JpZ2luc19sb2Nr KTsKKwlvID0gX19sb29rdXBfb3JpZ2luKG9yaWdpbi0+ZGV2KTsKKwlpZiAoIW8pCisJCUJV RygpOworCisJciA9IF9fb3JpZ2luX3dyaXRlKCZvLT5zbmFwc2hvdHMsIGJoKTsKKwl1cF9y ZWFkKCZfb3JpZ2luc19sb2NrKTsKKworCXJldHVybiByOworfQorCisvKgorICogT3JpZ2lu OiBtYXBzIGEgbGluZWFyIHJhbmdlIG9mIGEgZGV2aWNlLCB3aXRoIGhvb2tzIGZvciBzbmFw c2hvdHRpbmcuCisgKi8KKworLyoKKyAqIENvbnN0cnVjdCBhbiBvcmlnaW4gbWFwcGluZzog PGRldl9wYXRoPgorICogVGhlIGNvbnRleHQgZm9yIGFuIG9yaWdpbiBpcyBtZXJlbHkgYSAn c3RydWN0IGRtX2RldiAqJworICogcG9pbnRpbmcgdG8gdGhlIHJlYWwgZGV2aWNlLgorICov CitzdGF0aWMgaW50IG9yaWdpbl9jdHIoc3RydWN0IGRtX3RhcmdldCAqdGksIGludCBhcmdj LCBjaGFyICoqYXJndikKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgZG1fZGV2ICpkZXY7CisKKwlp ZiAoYXJnYyAhPSAxKSB7CisJCXRpLT5lcnJvciA9ICJkbS1vcmlnaW46IGluY29ycmVjdCBu dW1iZXIgb2YgYXJndW1lbnRzIjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJciA9IGRt X2dldF9kZXZpY2UodGksIGFyZ3ZbMF0sIDAsIHRpLT5sZW4sCisJCQkgIGRtX3RhYmxlX2dl dF9tb2RlKHRpLT50YWJsZSksICZkZXYpOworCWlmIChyKSB7CisJCXRpLT5lcnJvciA9ICJD YW5ub3QgZ2V0IHRhcmdldCBkZXZpY2UiOworCQlyZXR1cm4gcjsKKwl9CisKKwl0aS0+cHJp dmF0ZSA9IGRldjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBvcmlnaW5fZHRy KHN0cnVjdCBkbV90YXJnZXQgKnRpKQoreworCXN0cnVjdCBkbV9kZXYgKmRldiA9IChzdHJ1 Y3QgZG1fZGV2ICopIHRpLT5wcml2YXRlOworCWRtX3B1dF9kZXZpY2UodGksIGRldik7Cit9 CisKK3N0YXRpYyBpbnQgb3JpZ2luX21hcChzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0 IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHJ3KQoreworCXN0cnVjdCBkbV9kZXYgKmRldiA9IChz dHJ1Y3QgZG1fZGV2ICopIHRpLT5wcml2YXRlOworCWJoLT5iX3JkZXYgPSBkZXYtPmRldjsK KworCS8qIE9ubHkgdGVsbCBzbmFwc2hvdHMgaWYgdGhpcyBpcyBhIHdyaXRlICovCisJcmV0 dXJuIChydyA9PSBXUklURSkgPyBkb19vcmlnaW4oZGV2LCBiaCkgOiAxOworfQorCitzdGF0 aWMgaW50IG9yaWdpbl9zdGF0dXMoc3RydWN0IGRtX3RhcmdldCAqdGksIHN0YXR1c190eXBl X3QgdHlwZSwgY2hhciAqcmVzdWx0LAorCQkJIGludCBtYXhsZW4pCit7CisJc3RydWN0IGRt X2RldiAqZGV2ID0gKHN0cnVjdCBkbV9kZXYgKikgdGktPnByaXZhdGU7CisKKwlzd2l0Y2gg KHR5cGUpIHsKKwljYXNlIFNUQVRVU1RZUEVfSU5GTzoKKwkJcmVzdWx0WzBdID0gJ1wwJzsK KwkJYnJlYWs7CisKKwljYXNlIFNUQVRVU1RZUEVfVEFCTEU6CisJCXNucHJpbnRmKHJlc3Vs dCwgbWF4bGVuLCAiJXMiLCBrZGV2bmFtZShkZXYtPmRldikpOworCQlicmVhazsKKwl9CisK KwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB0YXJnZXRfdHlwZSBvcmlnaW5fdGFy Z2V0ID0geworCW5hbWU6CSJzbmFwc2hvdC1vcmlnaW4iLAorCW1vZHVsZToJVEhJU19NT0RV TEUsCisJY3RyOglvcmlnaW5fY3RyLAorCWR0cjoJb3JpZ2luX2R0ciwKKwltYXA6CW9yaWdp bl9tYXAsCisJc3RhdHVzOglvcmlnaW5fc3RhdHVzLAorfTsKKworc3RhdGljIHN0cnVjdCB0 YXJnZXRfdHlwZSBzbmFwc2hvdF90YXJnZXQgPSB7CisJbmFtZToJInNuYXBzaG90IiwKKwlt b2R1bGU6CVRISVNfTU9EVUxFLAorCWN0cjoJc25hcHNob3RfY3RyLAorCWR0cjoJc25hcHNo b3RfZHRyLAorCW1hcDoJc25hcHNob3RfbWFwLAorCXN0YXR1czoJc25hcHNob3Rfc3RhdHVz LAorfTsKKworaW50IF9faW5pdCBkbV9zbmFwc2hvdF9pbml0KHZvaWQpCit7CisJaW50IHI7 CisKKwlyID0gZG1fcmVnaXN0ZXJfdGFyZ2V0KCZzbmFwc2hvdF90YXJnZXQpOworCWlmIChy KSB7CisJCURNRVJSKCJzbmFwc2hvdCB0YXJnZXQgcmVnaXN0ZXIgZmFpbGVkICVkIiwgcik7 CisJCXJldHVybiByOworCX0KKworCXIgPSBkbV9yZWdpc3Rlcl90YXJnZXQoJm9yaWdpbl90 YXJnZXQpOworCWlmIChyIDwgMCkgeworCQlETUVSUigiRGV2aWNlIG1hcHBlcjogT3JpZ2lu OiByZWdpc3RlciBmYWlsZWQgJWRcbiIsIHIpOworCQlnb3RvIGJhZDE7CisJfQorCisJciA9 IGluaXRfb3JpZ2luX2hhc2goKTsKKwlpZiAocikgeworCQlETUVSUigiaW5pdF9vcmlnaW5f aGFzaCBmYWlsZWQuIik7CisJCWdvdG8gYmFkMjsKKwl9CisKKwlleGNlcHRpb25fY2FjaGUg PSBrbWVtX2NhY2hlX2NyZWF0ZSgiZG0tc25hcHNob3QtZXgiLAorCQkJCQkgICAgc2l6ZW9m KHN0cnVjdCBleGNlcHRpb24pLAorCQkJCQkgICAgX19hbGlnbm9mX18oc3RydWN0IGV4Y2Vw dGlvbiksCisJCQkJCSAgICAwLCBOVUxMLCBOVUxMKTsKKwlpZiAoIWV4Y2VwdGlvbl9jYWNo ZSkgeworCQlETUVSUigiQ291bGRuJ3QgY3JlYXRlIGV4Y2VwdGlvbiBjYWNoZS4iKTsKKwkJ ciA9IC1FTk9NRU07CisJCWdvdG8gYmFkMzsKKwl9CisKKwlwZW5kaW5nX2NhY2hlID0KKwkg ICAga21lbV9jYWNoZV9jcmVhdGUoImRtLXNuYXBzaG90LWluIiwKKwkJCSAgICAgIHNpemVv ZihzdHJ1Y3QgcGVuZGluZ19leGNlcHRpb24pLAorCQkJICAgICAgX19hbGlnbm9mX18oc3Ry dWN0IHBlbmRpbmdfZXhjZXB0aW9uKSwKKwkJCSAgICAgIDAsIE5VTEwsIE5VTEwpOworCWlm ICghcGVuZGluZ19jYWNoZSkgeworCQlETUVSUigiQ291bGRuJ3QgY3JlYXRlIHBlbmRpbmcg Y2FjaGUuIik7CisJCXIgPSAtRU5PTUVNOworCQlnb3RvIGJhZDQ7CisJfQorCisJcGVuZGlu Z19wb29sID0gbWVtcG9vbF9jcmVhdGUoMTI4LCBtZW1wb29sX2FsbG9jX3NsYWIsCisJCQkJ ICAgICAgbWVtcG9vbF9mcmVlX3NsYWIsIHBlbmRpbmdfY2FjaGUpOworCWlmICghcGVuZGlu Z19wb29sKSB7CisJCURNRVJSKCJDb3VsZG4ndCBjcmVhdGUgcGVuZGluZyBwb29sLiIpOwor CQlyID0gLUVOT01FTTsKKwkJZ290byBiYWQ1OworCX0KKworCXJldHVybiAwOworCisgICAg ICBiYWQ1OgorCWttZW1fY2FjaGVfZGVzdHJveShwZW5kaW5nX2NhY2hlKTsKKyAgICAgIGJh ZDQ6CisJa21lbV9jYWNoZV9kZXN0cm95KGV4Y2VwdGlvbl9jYWNoZSk7CisgICAgICBiYWQz OgorCWV4aXRfb3JpZ2luX2hhc2goKTsKKyAgICAgIGJhZDI6CisJZG1fdW5yZWdpc3Rlcl90 YXJnZXQoJm9yaWdpbl90YXJnZXQpOworICAgICAgYmFkMToKKwlkbV91bnJlZ2lzdGVyX3Rh cmdldCgmc25hcHNob3RfdGFyZ2V0KTsKKwlyZXR1cm4gcjsKK30KKwordm9pZCBkbV9zbmFw c2hvdF9leGl0KHZvaWQpCit7CisJaW50IHI7CisKKwlyID0gZG1fdW5yZWdpc3Rlcl90YXJn ZXQoJnNuYXBzaG90X3RhcmdldCk7CisJaWYgKHIpCisJCURNRVJSKCJzbmFwc2hvdCB1bnJl Z2lzdGVyIGZhaWxlZCAlZCIsIHIpOworCisJciA9IGRtX3VucmVnaXN0ZXJfdGFyZ2V0KCZv cmlnaW5fdGFyZ2V0KTsKKwlpZiAocikKKwkJRE1FUlIoIm9yaWdpbiB1bnJlZ2lzdGVyIGZh aWxlZCAlZCIsIHIpOworCisJZXhpdF9vcmlnaW5faGFzaCgpOworCW1lbXBvb2xfZGVzdHJv eShwZW5kaW5nX3Bvb2wpOworCWttZW1fY2FjaGVfZGVzdHJveShwZW5kaW5nX2NhY2hlKTsK KwlrbWVtX2NhY2hlX2Rlc3Ryb3koZXhjZXB0aW9uX2NhY2hlKTsKK30KKworLyoKKyAqIE92 ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0 eWxlLgorICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRo ZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5CisgKiBhZGp1c3QgdGhlIHNldHRpbmdzIGZvciB0 aGlzIGJ1ZmZlciBvbmx5LiAgVGhpcyBtdXN0IHJlbWFpbiBhdCB0aGUgZW5kCisgKiBvZiB0 aGUgZmlsZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTG9jYWwgdmFyaWFibGVz OgorICogYy1maWxlLXN0eWxlOiAibGludXgiCisgKiBFbmQ6CisgKi8KLS0tIGRpZmYvZHJp dmVycy9tZC9kbS1zbmFwc2hvdC5oCTE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICsw MTAwCisrKyBzb3VyY2UvZHJpdmVycy9tZC9kbS1zbmFwc2hvdC5oCTIwMDItMTEtMjkgMDk6 NDQ6NTkuMDAwMDAwMDAwICswMDAwCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogZG0tc25h cHNob3QuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIFNpc3RpbmEgU29mdHdh cmUgKFVLKSBMaW1pdGVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0 aGUgR1BMLgorICovCisKKyNpZm5kZWYgRE1fU05BUFNIT1RfSAorI2RlZmluZSBETV9TTkFQ U0hPVF9ICisKKyNpbmNsdWRlICJkbS5oIgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgor CitzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlIHsKKwl1aW50MzJfdCBoYXNoX21hc2s7CisJc3Ry dWN0IGxpc3RfaGVhZCAqdGFibGU7Cit9OworCisvKgorICogVGhlIHNuYXBzaG90IGNvZGUg ZGVhbHMgd2l0aCBsYXJnaXNoIGNodW5rcyBvZiB0aGUgZGlzayBhdCBhCisgKiB0aW1lLiBU eXBpY2FsbHkgNjRrIC0gMjU2ay4KKyAqLworLyogRklYTUU6IGNhbiB3ZSBnZXQgYXdheSB3 aXRoIGxpbWl0aW5nIHRoZXNlIHRvIGEgdWludDMyX3QgPyAqLwordHlwZWRlZiBzZWN0b3Jf dCBjaHVua190OworCisvKgorICogQW4gZXhjZXB0aW9uIGlzIHVzZWQgd2hlcmUgYW4gb2xk IGNodW5rIG9mIGRhdGEgaGFzIGJlZW4KKyAqIHJlcGxhY2VkIGJ5IGEgbmV3IG9uZS4KKyAq Lworc3RydWN0IGV4Y2VwdGlvbiB7CisJc3RydWN0IGxpc3RfaGVhZCBoYXNoX2xpc3Q7CisK KwljaHVua190IG9sZF9jaHVuazsKKwljaHVua190IG5ld19jaHVuazsKK307CisKKy8qCisg KiBBYnN0cmFjdGlvbiB0byBoYW5kbGUgdGhlIG1ldGEvbGF5b3V0IG9mIGV4Y2VwdGlvbiBz dG9yZXMgKHRoZQorICogQ09XIGRldmljZSkuCisgKi8KK3N0cnVjdCBleGNlcHRpb25fc3Rv cmUgeworCisJLyoKKwkgKiBEZXN0cm95cyB0aGlzIG9iamVjdCB3aGVuIHlvdSd2ZSBmaW5p c2hlZCB3aXRoIGl0LgorCSAqLworCXZvaWQgKCpkZXN0cm95KSAoc3RydWN0IGV4Y2VwdGlv bl9zdG9yZSAqc3RvcmUpOworCisJLyoKKwkgKiBGaW5kIHNvbWV3aGVyZSB0byBzdG9yZSB0 aGUgbmV4dCBleGNlcHRpb24uCisJICovCisJaW50ICgqcHJlcGFyZV9leGNlcHRpb24pIChz dHJ1Y3QgZXhjZXB0aW9uX3N0b3JlICpzdG9yZSwKKwkJCQkgIHN0cnVjdCBleGNlcHRpb24g KmUpOworCisJLyoKKwkgKiBVcGRhdGUgdGhlIG1ldGFkYXRhIHdpdGggdGhpcyBleGNlcHRp b24uCisJICovCisJdm9pZCAoKmNvbW1pdF9leGNlcHRpb24pIChzdHJ1Y3QgZXhjZXB0aW9u X3N0b3JlICpzdG9yZSwKKwkJCQkgIHN0cnVjdCBleGNlcHRpb24gKmUsCisJCQkJICB2b2lk ICgqY2FsbGJhY2spICh2b2lkICosIGludCBzdWNjZXNzKSwKKwkJCQkgIHZvaWQgKmNhbGxi YWNrX2NvbnRleHQpOworCisJLyoKKwkgKiBUaGUgc25hcHNob3QgaXMgaW52YWxpZCwgbm90 ZSB0aGlzIGluIHRoZSBtZXRhZGF0YS4KKwkgKi8KKwl2b2lkICgqZHJvcF9zbmFwc2hvdCkg KHN0cnVjdCBleGNlcHRpb25fc3RvcmUgKnN0b3JlKTsKKworCS8qCisJICogUmV0dXJuIHRo ZSAlYWdlIGZ1bGwgb2YgdGhlIHNuYXBzaG90CisJICovCisJaW50ICgqcGVyY2VudF9mdWxs KSAoc3RydWN0IGV4Y2VwdGlvbl9zdG9yZSAqc3RvcmUpOworCisJc3RydWN0IGRtX3NuYXBz aG90ICpzbmFwOworCXZvaWQgKmNvbnRleHQ7Cit9OworCitzdHJ1Y3QgZG1fc25hcHNob3Qg eworCXN0cnVjdCByd19zZW1hcGhvcmUgbG9jazsKKwlzdHJ1Y3QgZG1fdGFibGUgKnRhYmxl OworCisJc3RydWN0IGRtX2RldiAqb3JpZ2luOworCXN0cnVjdCBkbV9kZXYgKmNvdzsKKwor CS8qIExpc3Qgb2Ygc25hcHNob3RzIHBlciBPcmlnaW4gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFk IGxpc3Q7CisKKwkvKiBTaXplIG9mIGRhdGEgYmxvY2tzIHNhdmVkIC0gbXVzdCBiZSBhIHBv d2VyIG9mIDIgKi8KKwljaHVua190IGNodW5rX3NpemU7CisJY2h1bmtfdCBjaHVua19tYXNr OworCWNodW5rX3QgY2h1bmtfc2hpZnQ7CisKKwkvKiBZb3UgY2FuJ3QgdXNlIGEgc25hcHNo b3QgaWYgdGhpcyBpcyAwIChlLmcuIGlmIGZ1bGwpICovCisJaW50IHZhbGlkOworCisJLyog VXNlZCBmb3IgZGlzcGxheSBvZiB0YWJsZSAqLworCWNoYXIgdHlwZTsKKworCS8qIFRoZSBs YXN0IHBlcmNlbnRhZ2Ugd2Ugbm90aWZpZWQgKi8KKwlpbnQgbGFzdF9wZXJjZW50OworCisJ c3RydWN0IGV4Y2VwdGlvbl90YWJsZSBwZW5kaW5nOworCXN0cnVjdCBleGNlcHRpb25fdGFi bGUgY29tcGxldGU7CisKKwkvKiBUaGUgb24gZGlzayBtZXRhZGF0YSBoYW5kbGVyICovCisJ c3RydWN0IGV4Y2VwdGlvbl9zdG9yZSBzdG9yZTsKK307CisKKy8qCisgKiBVc2VkIGJ5IHRo ZSBleGNlcHRpb24gc3RvcmVzIHRvIGxvYWQgZXhjZXB0aW9ucyBoZW4KKyAqIGluaXRpYWxp c2luZy4KKyAqLworaW50IGRtX2FkZF9leGNlcHRpb24oc3RydWN0IGRtX3NuYXBzaG90ICpz LCBjaHVua190IG9sZCwgY2h1bmtfdCBuZXcpOworCisvKgorICogQ29uc3RydWN0b3IgYW5k IGRlc3RydWN0b3IgZm9yIHRoZSBkZWZhdWx0IHBlcnNpc3RlbnQKKyAqIHN0b3JlLgorICov CitpbnQgZG1fY3JlYXRlX3BlcnNpc3RlbnQoc3RydWN0IGV4Y2VwdGlvbl9zdG9yZSAqc3Rv cmUsIHVpbnQzMl90IGNodW5rX3NpemUpOworCitpbnQgZG1fY3JlYXRlX3RyYW5zaWVudChz dHJ1Y3QgZXhjZXB0aW9uX3N0b3JlICpzdG9yZSwKKwkJCXN0cnVjdCBkbV9zbmFwc2hvdCAq cywgaW50IGJsb2Nrc2l6ZSk7CisKKy8qCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzZWN0 b3JzIGluIHRoZSBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgc2VjdG9yX3QgZ2V0X2Rl dl9zaXplKGtkZXZfdCBkZXYpCit7CisJaW50ICpzaXplczsKKworCXNpemVzID0gYmxrX3Np emVbTUFKT1IoZGV2KV07CisJaWYgKHNpemVzKQorCQlyZXR1cm4gc2l6ZXNbTUlOT1IoZGV2 KV0gPDwgMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGNodW5rX3Qgc2Vj dG9yX3RvX2NodW5rKHN0cnVjdCBkbV9zbmFwc2hvdCAqcywgc2VjdG9yX3Qgc2VjdG9yKQor eworCXJldHVybiAoc2VjdG9yICYgfnMtPmNodW5rX21hc2spID4+IHMtPmNodW5rX3NoaWZ0 OworfQorCitzdGF0aWMgaW5saW5lIHNlY3Rvcl90IGNodW5rX3RvX3NlY3RvcihzdHJ1Y3Qg ZG1fc25hcHNob3QgKnMsIGNodW5rX3QgY2h1bmspCit7CisJcmV0dXJuIGNodW5rIDw8IHMt PmNodW5rX3NoaWZ0OworfQorCisjZW5kaWYKLS0tIGRpZmYvZHJpdmVycy9tZC9kbS1zdHJp cGUuYwkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCArMDEwMAorKysgc291cmNlL2Ry aXZlcnMvbWQvZG0tc3RyaXBlLmMJMjAwMi0xMS0yOSAwOTo0NDo1OS4wMDAwMDAwMDAgKzAw MDAKQEAgLTAsMCArMSwyNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgU2lzdGlu YSBTb2Z0d2FyZSAoVUspIExpbWl0ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2Vk IHVuZGVyIHRoZSBHUEwuCisgKi8KKworI2luY2x1ZGUgImRtLmgiCisKKyNpbmNsdWRlIDxs aW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGlu dXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCitzdHJ1Y3Qgc3RyaXBl IHsKKwlzdHJ1Y3QgZG1fZGV2ICpkZXY7CisJc2VjdG9yX3QgcGh5c2ljYWxfc3RhcnQ7Cit9 OworCitzdHJ1Y3Qgc3RyaXBlX2MgeworCXVpbnQzMl90IHN0cmlwZXM7CisKKwkvKiBUaGUg c2l6ZSBvZiB0aGlzIHRhcmdldCAvIG51bS4gc3RyaXBlcyAqLworCXVpbnQzMl90IHN0cmlw ZV93aWR0aDsKKworCS8qIHN0cmlwZSBjaHVuayBzaXplICovCisJdWludDMyX3QgY2h1bmtf c2hpZnQ7CisJc2VjdG9yX3QgY2h1bmtfbWFzazsKKworCXN0cnVjdCBzdHJpcGUgc3RyaXBl WzBdOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3RyaXBlX2MgKmFsbG9jX2NvbnRl eHQoaW50IHN0cmlwZXMpCit7CisJc2l6ZV90IGxlbjsKKworCWlmIChhcnJheV90b29fYmln KHNpemVvZihzdHJ1Y3Qgc3RyaXBlX2MpLCBzaXplb2Yoc3RydWN0IHN0cmlwZSksCisJCQkg IHN0cmlwZXMpKQorCQlyZXR1cm4gTlVMTDsKKworCWxlbiA9IHNpemVvZihzdHJ1Y3Qgc3Ry aXBlX2MpICsgKHNpemVvZihzdHJ1Y3Qgc3RyaXBlKSAqIHN0cmlwZXMpOworCisJcmV0dXJu IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKK30KKworLyoKKyAqIFBhcnNlIGEgc2luZ2xl IDxkZXY+IDxzZWN0b3I+IHBhaXIKKyAqLworc3RhdGljIGludCBnZXRfc3RyaXBlKHN0cnVj dCBkbV90YXJnZXQgKnRpLCBzdHJ1Y3Qgc3RyaXBlX2MgKnNjLAorCQkgICAgICBpbnQgc3Ry aXBlLCBjaGFyICoqYXJndikKK3sKKwlzZWN0b3JfdCBzdGFydDsKKworCWlmIChzc2NhbmYo YXJndlsxXSwgU0VDVE9SX0ZPUk1BVCwgJnN0YXJ0KSAhPSAxKQorCQlyZXR1cm4gLUVJTlZB TDsKKworCWlmIChkbV9nZXRfZGV2aWNlKHRpLCBhcmd2WzBdLCBzdGFydCwgc2MtPnN0cmlw ZV93aWR0aCwKKwkJCSAgZG1fdGFibGVfZ2V0X21vZGUodGktPnRhYmxlKSwKKwkJCSAgJnNj LT5zdHJpcGVbc3RyaXBlXS5kZXYpKQorCQlyZXR1cm4gLUVOWElPOworCisJc2MtPnN0cmlw ZVtzdHJpcGVdLnBoeXNpY2FsX3N0YXJ0ID0gc3RhcnQ7CisJcmV0dXJuIDA7Cit9CisKKy8q CisgKiBGSVhNRTogTmFzdHkgZnVuY3Rpb24sIG9ubHkgcHJlc2VudCBiZWNhdXNlIHdlIGNh bid0IGxpbmsKKyAqIGFnYWluc3QgX19tb2RkaTMgYW5kIF9fZGl2ZGkzLgorICoKKyAqIHJl dHVybnMgYSA9PSBiICogbgorICovCitzdGF0aWMgaW50IG11bHRpcGxlKHNlY3Rvcl90IGEs IHNlY3Rvcl90IGIsIHNlY3Rvcl90ICpuKQoreworCXNlY3Rvcl90IGFjYywgcHJldiwgaTsK KworCSpuID0gMDsKKwl3aGlsZSAoYSA+PSBiKSB7CisJCWZvciAoYWNjID0gYiwgcHJldiA9 IDAsIGkgPSAxOworCQkgICAgIGFjYyA8PSBhOworCQkgICAgIHByZXYgPSBhY2MsIGFjYyA8 PD0gMSwgaSA8PD0gMSkKKwkJCTsKKworCQlhIC09IHByZXY7CisJCSpuICs9IGkgPj4gMTsK Kwl9CisKKwlyZXR1cm4gYSA9PSAwOworfQorCisvKgorICogQ29uc3RydWN0IGEgc3RyaXBl ZCBtYXBwaW5nLgorICogPG51bWJlciBvZiBzdHJpcGVzPiA8Y2h1bmsgc2l6ZSAoMl5ebik+ IFs8ZGV2X3BhdGg+IDxvZmZzZXQ+XSsKKyAqLworc3RhdGljIGludCBzdHJpcGVfY3RyKHN0 cnVjdCBkbV90YXJnZXQgKnRpLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0 IHN0cmlwZV9jICpzYzsKKwlzZWN0b3JfdCB3aWR0aDsKKwl1aW50MzJfdCBzdHJpcGVzOwor CXVpbnQzMl90IGNodW5rX3NpemU7CisJY2hhciAqZW5kOworCWludCByLCBpOworCisJaWYg KGFyZ2MgPCAyKSB7CisJCXRpLT5lcnJvciA9ICJkbS1zdHJpcGU6IE5vdCBlbm91Z2ggYXJn dW1lbnRzIjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RyaXBlcyA9IHNpbXBsZV9z dHJ0b3VsKGFyZ3ZbMF0sICZlbmQsIDEwKTsKKwlpZiAoKmVuZCkgeworCQl0aS0+ZXJyb3Ig PSAiZG0tc3RyaXBlOiBJbnZhbGlkIHN0cmlwZSBjb3VudCI7CisJCXJldHVybiAtRUlOVkFM OworCX0KKworCWNodW5rX3NpemUgPSBzaW1wbGVfc3RydG91bChhcmd2WzFdLCAmZW5kLCAx MCk7CisJaWYgKCplbmQpIHsKKwkJdGktPmVycm9yID0gImRtLXN0cmlwZTogSW52YWxpZCBj aHVua19zaXplIjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFtdWx0aXBsZSh0 aS0+bGVuLCBzdHJpcGVzLCAmd2lkdGgpKSB7CisJCXRpLT5lcnJvciA9ICJkbS1zdHJpcGU6 IFRhcmdldCBsZW5ndGggbm90IGRpdmlzYWJsZSBieSAiCisJCSAgICAibnVtYmVyIG9mIHN0 cmlwZXMiOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzYyA9IGFsbG9jX2NvbnRleHQo c3RyaXBlcyk7CisJaWYgKCFzYykgeworCQl0aS0+ZXJyb3IgPSAiZG0tc3RyaXBlOiBNZW1v cnkgYWxsb2NhdGlvbiBmb3Igc3RyaXBlZCBjb250ZXh0ICIKKwkJICAgICJmYWlsZWQiOwor CQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzYy0+c3RyaXBlcyA9IHN0cmlwZXM7CisJc2Mt PnN0cmlwZV93aWR0aCA9IHdpZHRoOworCisJLyoKKwkgKiBjaHVua19zaXplIGlzIGEgcG93 ZXIgb2YgdHdvCisJICovCisJaWYgKCFjaHVua19zaXplIHx8IChjaHVua19zaXplICYgKGNo dW5rX3NpemUgLSAxKSkpIHsKKwkJdGktPmVycm9yID0gImRtLXN0cmlwZTogSW52YWxpZCBj aHVuayBzaXplIjsKKwkJa2ZyZWUoc2MpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlz Yy0+Y2h1bmtfbWFzayA9ICgoc2VjdG9yX3QpIGNodW5rX3NpemUpIC0gMTsKKwlmb3IgKHNj LT5jaHVua19zaGlmdCA9IDA7IGNodW5rX3NpemU7IHNjLT5jaHVua19zaGlmdCsrKQorCQlj aHVua19zaXplID4+PSAxOworCXNjLT5jaHVua19zaGlmdC0tOworCisJLyoKKwkgKiBHZXQg dGhlIHN0cmlwZSBkZXN0aW5hdGlvbnMuCisJICovCisJZm9yIChpID0gMDsgaSA8IHN0cmlw ZXM7IGkrKykgeworCQlpZiAoYXJnYyA8IDIpIHsKKwkJCXRpLT5lcnJvciA9ICJkbS1zdHJp cGU6IE5vdCBlbm91Z2ggZGVzdGluYXRpb25zICIKKwkJCQkic3BlY2lmaWVkIjsKKwkJCWtm cmVlKHNjKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJYXJndiArPSAyOworCisJ CXIgPSBnZXRfc3RyaXBlKHRpLCBzYywgaSwgYXJndik7CisJCWlmIChyIDwgMCkgeworCQkJ dGktPmVycm9yID0gImRtLXN0cmlwZTogQ291bGRuJ3QgcGFyc2Ugc3RyaXBlICIKKwkJCQki ZGVzdGluYXRpb24iOworCQkJd2hpbGUgKGktLSkKKwkJCQlkbV9wdXRfZGV2aWNlKHRpLCBz Yy0+c3RyaXBlW2ldLmRldik7CisJCQlrZnJlZShzYyk7CisJCQlyZXR1cm4gcjsKKwkJfQor CX0KKworCXRpLT5wcml2YXRlID0gc2M7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lk IHN0cmlwZV9kdHIoc3RydWN0IGRtX3RhcmdldCAqdGkpCit7CisJdW5zaWduZWQgaW50IGk7 CisJc3RydWN0IHN0cmlwZV9jICpzYyA9IChzdHJ1Y3Qgc3RyaXBlX2MgKikgdGktPnByaXZh dGU7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2MtPnN0cmlwZXM7IGkrKykKKwkJZG1fcHV0X2Rl dmljZSh0aSwgc2MtPnN0cmlwZVtpXS5kZXYpOworCisJa2ZyZWUoc2MpOworfQorCitzdGF0 aWMgaW50IHN0cmlwZV9tYXAoc3RydWN0IGRtX3RhcmdldCAqdGksIHN0cnVjdCBidWZmZXJf aGVhZCAqYmgsIGludCBydykKK3sKKwlzdHJ1Y3Qgc3RyaXBlX2MgKnNjID0gKHN0cnVjdCBz dHJpcGVfYyAqKSB0aS0+cHJpdmF0ZTsKKworCXNlY3Rvcl90IG9mZnNldCA9IGJoLT5iX3Jz ZWN0b3IgLSB0aS0+YmVnaW47CisJdWludDMyX3QgY2h1bmsgPSAodWludDMyX3QpIChvZmZz ZXQgPj4gc2MtPmNodW5rX3NoaWZ0KTsKKwl1aW50MzJfdCBzdHJpcGUgPSBjaHVuayAlIHNj LT5zdHJpcGVzOwkvKiAzMmJpdCBtb2R1bHVzICovCisJY2h1bmsgPSBjaHVuayAvIHNjLT5z dHJpcGVzOworCisJYmgtPmJfcmRldiA9IHNjLT5zdHJpcGVbc3RyaXBlXS5kZXYtPmRldjsK KwliaC0+Yl9yc2VjdG9yID0gc2MtPnN0cmlwZVtzdHJpcGVdLnBoeXNpY2FsX3N0YXJ0ICsK KwkgICAgKGNodW5rIDw8IHNjLT5jaHVua19zaGlmdCkgKyAob2Zmc2V0ICYgc2MtPmNodW5r X21hc2spOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHN0cmlwZV9zdGF0dXMoc3Ry dWN0IGRtX3RhcmdldCAqdGksCisJCQkgc3RhdHVzX3R5cGVfdCB0eXBlLCBjaGFyICpyZXN1 bHQsIGludCBtYXhsZW4pCit7CisJc3RydWN0IHN0cmlwZV9jICpzYyA9IChzdHJ1Y3Qgc3Ry aXBlX2MgKikgdGktPnByaXZhdGU7CisJaW50IG9mZnNldDsKKwlpbnQgaTsKKworCXN3aXRj aCAodHlwZSkgeworCWNhc2UgU1RBVFVTVFlQRV9JTkZPOgorCQlyZXN1bHRbMF0gPSAnXDAn OworCQlicmVhazsKKworCWNhc2UgU1RBVFVTVFlQRV9UQUJMRToKKwkJb2Zmc2V0ID0gc25w cmludGYocmVzdWx0LCBtYXhsZW4sICIlZCAiIFNFQ1RPUl9GT1JNQVQsCisJCQkJICBzYy0+ c3RyaXBlcywgc2MtPmNodW5rX21hc2sgKyAxKTsKKwkJZm9yIChpID0gMDsgaSA8IHNjLT5z dHJpcGVzOyBpKyspIHsKKwkJCW9mZnNldCArPQorCQkJICAgIHNucHJpbnRmKHJlc3VsdCAr IG9mZnNldCwgbWF4bGVuIC0gb2Zmc2V0LAorCQkJCSAgICAgIiAlcyAiIFNFQ1RPUl9GT1JN QVQsCisJCSAgICAgICBrZGV2bmFtZSh0b19rZGV2X3Qoc2MtPnN0cmlwZVtpXS5kZXYtPmJk ZXYtPmJkX2RldikpLAorCQkJCSAgICAgc2MtPnN0cmlwZVtpXS5waHlzaWNhbF9zdGFydCk7 CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHRh cmdldF90eXBlIHN0cmlwZV90YXJnZXQgPSB7CisJLm5hbWUgICA9ICJzdHJpcGVkIiwKKwku bW9kdWxlID0gVEhJU19NT0RVTEUsCisJLmN0ciAgICA9IHN0cmlwZV9jdHIsCisJLmR0ciAg ICA9IHN0cmlwZV9kdHIsCisJLm1hcCAgICA9IHN0cmlwZV9tYXAsCisJLnN0YXR1cyA9IHN0 cmlwZV9zdGF0dXMsCit9OworCitpbnQgX19pbml0IGRtX3N0cmlwZV9pbml0KHZvaWQpCit7 CisJaW50IHI7CisKKwlyID0gZG1fcmVnaXN0ZXJfdGFyZ2V0KCZzdHJpcGVfdGFyZ2V0KTsK KwlpZiAociA8IDApCisJCURNV0FSTigic3RyaXBlZCB0YXJnZXQgcmVnaXN0cmF0aW9uIGZh aWxlZCIpOworCisJcmV0dXJuIHI7Cit9CisKK3ZvaWQgZG1fc3RyaXBlX2V4aXQodm9pZCkK K3sKKwlpZiAoZG1fdW5yZWdpc3Rlcl90YXJnZXQoJnN0cmlwZV90YXJnZXQpKQorCQlETVdB Uk4oInN0cmlwZWQgdGFyZ2V0IHVucmVnaXN0cmF0aW9uIGZhaWxlZCIpOworCisJcmV0dXJu OworfQotLS0gZGlmZi9kcml2ZXJzL21kL2RtLXRhYmxlLmMJMTk3MC0wMS0wMSAwMTowMDow MC4wMDAwMDAwMDAgKzAxMDAKKysrIHNvdXJjZS9kcml2ZXJzL21kL2RtLXRhYmxlLmMJMjAw Mi0xMS0yOSAwOTo0NDo1OS4wMDAwMDAwMDAgKzAwMDAKQEAgLTAsMCArMSw2NjggQEAKKy8q CisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgU2lzdGluYSBTb2Z0d2FyZSAoVUspIExpbWl0ZWQu CisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCisgKi8KKwor I2luY2x1ZGUgImRtLmgiCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRl IDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVk ZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8 YXNtL2F0b21pYy5oPgorCisjZGVmaW5lIE1BWF9ERVBUSCAxNgorI2RlZmluZSBOT0RFX1NJ WkUgTDFfQ0FDSEVfQllURVMKKyNkZWZpbmUgS0VZU19QRVJfTk9ERSAoTk9ERV9TSVpFIC8g c2l6ZW9mKHNlY3Rvcl90KSkKKyNkZWZpbmUgQ0hJTERSRU5fUEVSX05PREUgKEtFWVNfUEVS X05PREUgKyAxKQorCitzdHJ1Y3QgZG1fdGFibGUgeworCWF0b21pY190IGhvbGRlcnM7CisK KwkvKiBidHJlZSB0YWJsZSAqLworCWludCBkZXB0aDsKKwlpbnQgY291bnRzW01BWF9ERVBU SF07CS8qIGluIG5vZGVzICovCisJc2VjdG9yX3QgKmluZGV4W01BWF9ERVBUSF07CisKKwlp bnQgbnVtX3RhcmdldHM7CisJaW50IG51bV9hbGxvY2F0ZWQ7CisJc2VjdG9yX3QgKmhpZ2hz OworCXN0cnVjdCBkbV90YXJnZXQgKnRhcmdldHM7CisKKwkvKgorCSAqIEluZGljYXRlcyB0 aGUgcncgcGVybWlzc2lvbnMgZm9yIHRoZSBuZXcgbG9naWNhbAorCSAqIGRldmljZS4gIFRo aXMgc2hvdWxkIGJlIGEgY29tYmluYXRpb24gb2YgRk1PREVfUkVBRAorCSAqIGFuZCBGTU9E RV9XUklURS4KKwkgKi8KKwlpbnQgbW9kZTsKKworCS8qIGEgbGlzdCBvZiBkZXZpY2VzIHVz ZWQgYnkgdGhpcyB0YWJsZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgZGV2aWNlczsKKworCS8q CisJICogQSB3YWl0cXVldWUgZm9yIHByb2Nlc3NlcyB3YWl0aW5nIGZvciBzb21ldGhpbmcK KwkgKiBpbnRlcmVzdGluZyB0byBoYXBwZW4gdG8gdGhpcyB0YWJsZS4KKwkgKi8KKwl3YWl0 X3F1ZXVlX2hlYWRfdCBldmVudHE7Cit9OworCisvKgorICogQ2VpbGluZyhuIC8gc2l6ZSkK KyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGRpdl91cCh1bnNpZ25lZCBsb25n IG4sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlyZXR1cm4gZG1fcm91bmRfdXAobiwgc2l6 ZSkgLyBzaXplOworfQorCisvKgorICogU2ltaWxhciB0byBjZWlsaW5nKGxvZ19zaXplKG4p KQorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGludF9sb2codW5zaWduZWQgbG9uZyBuLCB1 bnNpZ25lZCBsb25nIGJhc2UpCit7CisJaW50IHJlc3VsdCA9IDA7CisKKwl3aGlsZSAobiA+ IDEpIHsKKwkJbiA9IGRpdl91cChuLCBiYXNlKTsKKwkJcmVzdWx0Kys7CisJfQorCisJcmV0 dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIENhbGN1bGF0ZSB0aGUgaW5kZXggb2YgdGhlIGNo aWxkIG5vZGUgb2YgdGhlIG4ndGggbm9kZSBrJ3RoIGtleS4KKyAqLworc3RhdGljIGlubGlu ZSBpbnQgZ2V0X2NoaWxkKGludCBuLCBpbnQgaykKK3sKKwlyZXR1cm4gKG4gKiBDSElMRFJF Tl9QRVJfTk9ERSkgKyBrOworfQorCisvKgorICogUmV0dXJuIHRoZSBuJ3RoIG5vZGUgb2Yg bGV2ZWwgbCBmcm9tIHRhYmxlIHQuCisgKi8KK3N0YXRpYyBpbmxpbmUgc2VjdG9yX3QgKmdl dF9ub2RlKHN0cnVjdCBkbV90YWJsZSAqdCwgaW50IGwsIGludCBuKQoreworCXJldHVybiB0 LT5pbmRleFtsXSArIChuICogS0VZU19QRVJfTk9ERSk7Cit9CisKKy8qCisgKiBSZXR1cm4g dGhlIGhpZ2hlc3Qga2V5IHRoYXQgeW91IGNvdWxkIGxvb2t1cCBmcm9tIHRoZSBuJ3RoCisg KiBub2RlIG9uIGxldmVsIGwgb2YgdGhlIGJ0cmVlLgorICovCitzdGF0aWMgc2VjdG9yX3Qg aGlnaChzdHJ1Y3QgZG1fdGFibGUgKnQsIGludCBsLCBpbnQgbikKK3sKKwlmb3IgKDsgbCA8 IHQtPmRlcHRoIC0gMTsgbCsrKQorCQluID0gZ2V0X2NoaWxkKG4sIENISUxEUkVOX1BFUl9O T0RFIC0gMSk7CisKKwlpZiAobiA+PSB0LT5jb3VudHNbbF0pCisJCXJldHVybiAoc2VjdG9y X3QpIC0gMTsKKworCXJldHVybiBnZXRfbm9kZSh0LCBsLCBuKVtLRVlTX1BFUl9OT0RFIC0g MV07Cit9CisKKy8qCisgKiBGaWxscyBpbiBhIGxldmVsIG9mIHRoZSBidHJlZSBiYXNlZCBv biB0aGUgaGlnaHMgb2YgdGhlIGxldmVsCisgKiBiZWxvdyBpdC4KKyAqLworc3RhdGljIGlu dCBzZXR1cF9idHJlZV9pbmRleChpbnQgbCwgc3RydWN0IGRtX3RhYmxlICp0KQoreworCWlu dCBuLCBrOworCXNlY3Rvcl90ICpub2RlOworCisJZm9yIChuID0gMDsgbiA8IHQtPmNvdW50 c1tsXTsgbisrKSB7CisJCW5vZGUgPSBnZXRfbm9kZSh0LCBsLCBuKTsKKworCQlmb3IgKGsg PSAwOyBrIDwgS0VZU19QRVJfTk9ERTsgaysrKQorCQkJbm9kZVtrXSA9IGhpZ2godCwgbCAr IDEsIGdldF9jaGlsZChuLCBrKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBo aWdocywgYW5kIHRhcmdldHMgYXJlIG1hbmFnZWQgYXMgZHluYW1pYyBhcnJheXMgZHVyaW5n IGEKKyAqIHRhYmxlIGxvYWQuCisgKi8KK3N0YXRpYyBpbnQgYWxsb2NfdGFyZ2V0cyhzdHJ1 Y3QgZG1fdGFibGUgKnQsIGludCBudW0pCit7CisJc2VjdG9yX3QgKm5faGlnaHM7CisJc3Ry dWN0IGRtX3RhcmdldCAqbl90YXJnZXRzOworCWludCBuID0gdC0+bnVtX3RhcmdldHM7CisK KwkvKgorCSAqIEFsbG9jYXRlIGJvdGggdGhlIHRhcmdldCBhcnJheSBhbmQgb2Zmc2V0IGFy cmF5IGF0IG9uY2UuCisJICovCisJbl9oaWdocyA9IChzZWN0b3JfdCAqKSB2Y2FsbG9jKHNp emVvZihzdHJ1Y3QgZG1fdGFyZ2V0KSArCisJCQkJICAgICAgIHNpemVvZihzZWN0b3JfdCks CisJCQkJICAgICAgIG51bSk7CisJaWYgKCFuX2hpZ2hzKQorCQlyZXR1cm4gLUVOT01FTTsK KworCW5fdGFyZ2V0cyA9IChzdHJ1Y3QgZG1fdGFyZ2V0ICopIChuX2hpZ2hzICsgbnVtKTsK KworCWlmIChuKSB7CisJCW1lbWNweShuX2hpZ2hzLCB0LT5oaWdocywgc2l6ZW9mKCpuX2hp Z2hzKSAqIG4pOworCQltZW1jcHkobl90YXJnZXRzLCB0LT50YXJnZXRzLCBzaXplb2YoKm5f dGFyZ2V0cykgKiBuKTsKKwl9CisKKwltZW1zZXQobl9oaWdocyArIG4sIC0xLCBzaXplb2Yo Km5faGlnaHMpICogKG51bSAtIG4pKTsKKwl2ZnJlZSh0LT5oaWdocyk7CisKKwl0LT5udW1f YWxsb2NhdGVkID0gbnVtOworCXQtPmhpZ2hzID0gbl9oaWdoczsKKwl0LT50YXJnZXRzID0g bl90YXJnZXRzOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkbV90YWJsZV9jcmVhdGUoc3Ry dWN0IGRtX3RhYmxlICoqcmVzdWx0LCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgZG1fdGFibGUg KnQgPSBrbWFsbG9jKHNpemVvZigqdCksIEdGUF9OT0lPKTsKKworCWlmICghdCkKKwkJcmV0 dXJuIC1FTk9NRU07CisKKwltZW1zZXQodCwgMCwgc2l6ZW9mKCp0KSk7CisJSU5JVF9MSVNU X0hFQUQoJnQtPmRldmljZXMpOworCWF0b21pY19zZXQoJnQtPmhvbGRlcnMsIDEpOworCisJ LyogYWxsb2NhdGUgYSBzaW5nbGUgbm9kZXMgd29ydGggb2YgdGFyZ2V0cyB0byBiZWdpbiB3 aXRoICovCisJaWYgKGFsbG9jX3RhcmdldHModCwgS0VZU19QRVJfTk9ERSkpIHsKKwkJa2Zy ZWUodCk7CisJCXQgPSBOVUxMOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpbml0X3dh aXRxdWV1ZV9oZWFkKCZ0LT5ldmVudHEpOworCXQtPm1vZGUgPSBtb2RlOworCSpyZXN1bHQg PSB0OworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2RldmljZXMoc3RydWN0 IGxpc3RfaGVhZCAqZGV2aWNlcykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXAsICpuZXh0 OworCisJZm9yICh0bXAgPSBkZXZpY2VzLT5uZXh0OyB0bXAgIT0gZGV2aWNlczsgdG1wID0g bmV4dCkgeworCQlzdHJ1Y3QgZG1fZGV2ICpkZCA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3Qg ZG1fZGV2LCBsaXN0KTsKKwkJbmV4dCA9IHRtcC0+bmV4dDsKKwkJa2ZyZWUoZGQpOworCX0K K30KKwordm9pZCB0YWJsZV9kZXN0cm95KHN0cnVjdCBkbV90YWJsZSAqdCkKK3sKKwlpbnQg aTsKKworCURNV0FSTigiZGVzdHJveWluZyB0YWJsZSIpOworCisJLyogZGVzdHJveWluZyB0 aGUgdGFibGUgY291bnRzIGFzIGFuIGV2ZW50ICovCisJZG1fdGFibGVfZXZlbnQodCk7CisK KwkvKiBmcmVlIHRoZSBpbmRleGVzIChzZWUgZG1fdGFibGVfY29tcGxldGUpICovCisJaWYg KHQtPmRlcHRoID49IDIpCisJCXZmcmVlKHQtPmluZGV4W3QtPmRlcHRoIC0gMl0pOworCisJ LyogZnJlZSB0aGUgdGFyZ2V0cyAqLworCWZvciAoaSA9IDA7IGkgPCB0LT5udW1fdGFyZ2V0 czsgaSsrKSB7CisJCXN0cnVjdCBkbV90YXJnZXQgKnRndCA9ICZ0LT50YXJnZXRzW2ldOwor CisJCWRtX3B1dF90YXJnZXRfdHlwZSh0LT50YXJnZXRzW2ldLnR5cGUpOworCisJCWlmICh0 Z3QtPnR5cGUtPmR0cikKKwkJCXRndC0+dHlwZS0+ZHRyKHRndCk7CisJfQorCisJdmZyZWUo dC0+aGlnaHMpOworCisJLyogZnJlZSB0aGUgZGV2aWNlIGxpc3QgKi8KKwlpZiAodC0+ZGV2 aWNlcy5uZXh0ICE9ICZ0LT5kZXZpY2VzKSB7CisJCURNV0FSTigiZGV2aWNlcyBzdGlsbCBw cmVzZW50IGR1cmluZyBkZXN0cm95OiAiCisJCSAgICAgICAiZG1fdGFibGVfcmVtb3ZlX2Rl dmljZSBjYWxscyBtaXNzaW5nIik7CisKKwkJZnJlZV9kZXZpY2VzKCZ0LT5kZXZpY2VzKTsK Kwl9CisKKwlrZnJlZSh0KTsKK30KKwordm9pZCBkbV90YWJsZV9nZXQoc3RydWN0IGRtX3Rh YmxlICp0KQoreworCWF0b21pY19pbmMoJnQtPmhvbGRlcnMpOworfQorCit2b2lkIGRtX3Rh YmxlX3B1dChzdHJ1Y3QgZG1fdGFibGUgKnQpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rl c3QoJnQtPmhvbGRlcnMpKQorCQl0YWJsZV9kZXN0cm95KHQpOworfQorCisvKgorICogQ2hl Y2tzIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGV4dGVuZCBoaWdocyBvciB0YXJnZXRzLgorICov CitzdGF0aWMgaW5saW5lIGludCBjaGVja19zcGFjZShzdHJ1Y3QgZG1fdGFibGUgKnQpCit7 CisJaWYgKHQtPm51bV90YXJnZXRzID49IHQtPm51bV9hbGxvY2F0ZWQpCisJCXJldHVybiBh bGxvY190YXJnZXRzKHQsIHQtPm51bV9hbGxvY2F0ZWQgKiAyKTsKKworCXJldHVybiAwOwor fQorCisvKgorICogQ29udmVydCBhIGRldmljZSBwYXRoIHRvIGEgZGV2X3QuCisgKi8KK3N0 YXRpYyBpbnQgbG9va3VwX2RldmljZShjb25zdCBjaGFyICpwYXRoLCBrZGV2X3QgKmRldikK K3sKKwlpbnQgcjsKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCXN0cnVjdCBpbm9kZSAqaW5v ZGU7CisKKwlpZiAoIXBhdGhfaW5pdChwYXRoLCBMT09LVVBfRk9MTE9XLCAmbmQpKQorCQly ZXR1cm4gMDsKKworCWlmICgociA9IHBhdGhfd2FsayhwYXRoLCAmbmQpKSkKKwkJZ290byBv dXQ7CisKKwlpbm9kZSA9IG5kLmRlbnRyeS0+ZF9pbm9kZTsKKwlpZiAoIWlub2RlKSB7CisJ CXIgPSAtRU5PRU5UOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIVNfSVNCTEsoaW5vZGUt PmlfbW9kZSkpIHsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCSpkZXYg PSBpbm9kZS0+aV9yZGV2OworCisgb3V0OgorCXBhdGhfcmVsZWFzZSgmbmQpOworCXJldHVy biByOworfQorCisvKgorICogU2VlIGlmIHdlJ3ZlIGFscmVhZHkgZ290IGEgZGV2aWNlIGlu IHRoZSBsaXN0LgorICovCitzdGF0aWMgc3RydWN0IGRtX2RldiAqZmluZF9kZXZpY2Uoc3Ry dWN0IGxpc3RfaGVhZCAqbCwga2Rldl90IGRldikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0 bXA7CisKKwlsaXN0X2Zvcl9lYWNoKHRtcCwgbCkgeworCQlzdHJ1Y3QgZG1fZGV2ICpkZCA9 IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgZG1fZGV2LCBsaXN0KTsKKwkJaWYgKGtkZXZfc2Ft ZShkZC0+ZGV2LCBkZXYpKQorCQkJcmV0dXJuIGRkOworCX0KKworCXJldHVybiBOVUxMOwor fQorCisvKgorICogT3BlbiBhIGRldmljZSBzbyB3ZSBjYW4gdXNlIGl0IGFzIGEgbWFwIGRl c3RpbmF0aW9uLgorICovCitzdGF0aWMgaW50IG9wZW5fZGV2KHN0cnVjdCBkbV9kZXYgKmRk KQoreworCWlmIChkZC0+YmRldikKKwkJQlVHKCk7CisKKwlkZC0+YmRldiA9IGJkZ2V0KGtk ZXZfdF90b19ucihkZC0+ZGV2KSk7CisJaWYgKCFkZC0+YmRldikKKwkJcmV0dXJuIC1FTk9N RU07CisKKwlyZXR1cm4gYmxrZGV2X2dldChkZC0+YmRldiwgZGQtPm1vZGUsIDAsIEJERVZf UkFXKTsKK30KKworLyoKKyAqIENsb3NlIGEgZGV2aWNlIHRoYXQgd2UndmUgYmVlbiB1c2lu Zy4KKyAqLworc3RhdGljIHZvaWQgY2xvc2VfZGV2KHN0cnVjdCBkbV9kZXYgKmRkKQorewor CWlmICghZGQtPmJkZXYpCisJCXJldHVybjsKKworCWJsa2Rldl9wdXQoZGQtPmJkZXYsIEJE RVZfUkFXKTsKKwlkZC0+YmRldiA9IE5VTEw7Cit9CisKKy8qCisgKiBJZiBwb3NzaWJsZSAo aWUuIGJsa19zaXplW21ham9yXSBpcyBzZXQpLCB0aGlzIGNoZWNrcyBhbiBhcmVhCisgKiBv ZiBhIGRlc3RpbmF0aW9uIGRldmljZSBpcyB2YWxpZC4KKyAqLworc3RhdGljIGludCBjaGVj a19kZXZpY2VfYXJlYShrZGV2X3QgZGV2LCBzZWN0b3JfdCBzdGFydCwgc2VjdG9yX3QgbGVu KQoreworCWludCAqc2l6ZXM7CisJc2VjdG9yX3QgZGV2X3NpemU7CisKKwlpZiAoIShzaXpl cyA9IGJsa19zaXplW21ham9yKGRldildKSB8fCAhKGRldl9zaXplID0gc2l6ZXNbbWlub3Io ZGV2KV0pKQorCQkvKiB3ZSBkb24ndCBrbm93IHRoZSBkZXZpY2UgZGV0YWlscywKKwkJICog c28gZ2l2ZSB0aGUgYmVuZWZpdCBvZiB0aGUgZG91YnQgKi8KKwkJcmV0dXJuIDE7CisKKwkv KiBjb252ZXJ0IHRvIDUxMi1ieXRlIHNlY3RvcnMgKi8KKwlkZXZfc2l6ZSA8PD0gMTsKKwor CXJldHVybiAoKHN0YXJ0IDwgZGV2X3NpemUpICYmIChsZW4gPD0gKGRldl9zaXplIC0gc3Rh cnQpKSk7Cit9CisKKy8qCisgKiBUaGlzIHVwZ3JhZGVzIHRoZSBtb2RlIG9uIGFuIGFscmVh ZHkgb3BlbiBkbV9kZXYuICBCZWluZworICogY2FyZWZ1bCB0byBsZWF2ZSB0aGluZ3MgYXMg dGhleSB3ZXJlIGlmIHdlIGZhaWwgdG8gcmVvcGVuIHRoZQorICogZGV2aWNlLgorICovCitz dGF0aWMgaW50IHVwZ3JhZGVfbW9kZShzdHJ1Y3QgZG1fZGV2ICpkZCwgaW50IG5ld19tb2Rl KQoreworCWludCByOworCXN0cnVjdCBkbV9kZXYgZGRfY29weTsKKworCW1lbWNweSgmZGRf Y29weSwgZGQsIHNpemVvZihkZF9jb3B5KSk7CisKKwlkZC0+bW9kZSB8PSBuZXdfbW9kZTsK KwlkZC0+YmRldiA9IE5VTEw7CisJciA9IG9wZW5fZGV2KGRkKTsKKwlpZiAoIXIpCisJCWNs b3NlX2RldigmZGRfY29weSk7CisJZWxzZQorCQltZW1jcHkoZGQsICZkZF9jb3B5LCBzaXpl b2YoZGRfY29weSkpOworCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBBZGQgYSBkZXZpY2Ug dG8gdGhlIGxpc3QsIG9yIGp1c3QgaW5jcmVtZW50IHRoZSB1c2FnZSBjb3VudCBpZgorICog aXQncyBhbHJlYWR5IHByZXNlbnQuCisgKi8KK2ludCBkbV9nZXRfZGV2aWNlKHN0cnVjdCBk bV90YXJnZXQgKnRpLCBjb25zdCBjaGFyICpwYXRoLCBzZWN0b3JfdCBzdGFydCwKKwkJICBz ZWN0b3JfdCBsZW4sIGludCBtb2RlLCBzdHJ1Y3QgZG1fZGV2ICoqcmVzdWx0KQoreworCWlu dCByOworCWtkZXZfdCBkZXY7CisJc3RydWN0IGRtX2RldiAqZGQ7CisJaW50IG1ham9yLCBt aW5vcjsKKwlzdHJ1Y3QgZG1fdGFibGUgKnQgPSB0aS0+dGFibGU7CisKKwlpZiAoIXQpCisJ CUJVRygpOworCisJaWYgKHNzY2FuZihwYXRoLCAiJXg6JXgiLCAmbWFqb3IsICZtaW5vcikg PT0gMikgeworCQkvKiBFeHRyYWN0IHRoZSBtYWpvci9taW5vciBudW1iZXJzICovCisJCWRl diA9IG1rX2tkZXYobWFqb3IsIG1pbm9yKTsKKwl9IGVsc2UgeworCQkvKiBjb252ZXJ0IHRo ZSBwYXRoIHRvIGEgZGV2aWNlICovCisJCWlmICgociA9IGxvb2t1cF9kZXZpY2UocGF0aCwg JmRldikpKQorCQkJcmV0dXJuIHI7CisJfQorCisJZGQgPSBmaW5kX2RldmljZSgmdC0+ZGV2 aWNlcywgZGV2KTsKKwlpZiAoIWRkKSB7CisJCWRkID0ga21hbGxvYyhzaXplb2YoKmRkKSwg R0ZQX0tFUk5FTCk7CisJCWlmICghZGQpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlkZC0+ ZGV2ID0gZGV2OworCQlkZC0+bW9kZSA9IG1vZGU7CisJCWRkLT5iZGV2ID0gTlVMTDsKKwor CQlpZiAoKHIgPSBvcGVuX2RldihkZCkpKSB7CisJCQlrZnJlZShkZCk7CisJCQlyZXR1cm4g cjsKKwkJfQorCisJCWF0b21pY19zZXQoJmRkLT5jb3VudCwgMCk7CisJCWxpc3RfYWRkKCZk ZC0+bGlzdCwgJnQtPmRldmljZXMpOworCisJfSBlbHNlIGlmIChkZC0+bW9kZSAhPSAobW9k ZSB8IGRkLT5tb2RlKSkgeworCQlyID0gdXBncmFkZV9tb2RlKGRkLCBtb2RlKTsKKwkJaWYg KHIpCisJCQlyZXR1cm4gcjsKKwl9CisJYXRvbWljX2luYygmZGQtPmNvdW50KTsKKworCWlm ICghY2hlY2tfZGV2aWNlX2FyZWEoZGQtPmRldiwgc3RhcnQsIGxlbikpIHsKKwkJRE1XQVJO KCJkZXZpY2UgJXMgdG9vIHNtYWxsIGZvciB0YXJnZXQiLCBwYXRoKTsKKwkJZG1fcHV0X2Rl dmljZSh0aSwgZGQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkqcmVzdWx0ID0gZGQ7 CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERlY3JlbWVudCBhIGRldmljZXMgdXNlIGNv dW50IGFuZCByZW1vdmUgaXQgaWYgbmVjY2Vzc2FyeS4KKyAqLwordm9pZCBkbV9wdXRfZGV2 aWNlKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdHJ1Y3QgZG1fZGV2ICpkZCkKK3sKKwlpZiAo YXRvbWljX2RlY19hbmRfdGVzdCgmZGQtPmNvdW50KSkgeworCQljbG9zZV9kZXYoZGQpOwor CQlsaXN0X2RlbCgmZGQtPmxpc3QpOworCQlrZnJlZShkZCk7CisJfQorfQorCisvKgorICog Q2hlY2tzIHRvIHNlZSBpZiB0aGUgdGFyZ2V0IGpvaW5zIG9udG8gdGhlIGVuZCBvZiB0aGUg dGFibGUuCisgKi8KK3N0YXRpYyBpbnQgYWRqb2luKHN0cnVjdCBkbV90YWJsZSAqdGFibGUs IHN0cnVjdCBkbV90YXJnZXQgKnRpKQoreworCXN0cnVjdCBkbV90YXJnZXQgKnByZXY7CisK KwlpZiAoIXRhYmxlLT5udW1fdGFyZ2V0cykKKwkJcmV0dXJuICF0aS0+YmVnaW47CisKKwlw cmV2ID0gJnRhYmxlLT50YXJnZXRzW3RhYmxlLT5udW1fdGFyZ2V0cyAtIDFdOworCXJldHVy biAodGktPmJlZ2luID09IChwcmV2LT5iZWdpbiArIHByZXYtPmxlbikpOworfQorCisvKgor ICogRGVzdHJ1Y3RpdmVseSBzcGxpdHMgdXAgdGhlIGFyZ3VtZW50IGxpc3QgdG8gcGFzcyB0 byBjdHIuCisgKi8KK3N0YXRpYyBpbnQgc3BsaXRfYXJncyhpbnQgbWF4LCBpbnQgKmFyZ2Ms IGNoYXIgKiphcmd2LCBjaGFyICppbnB1dCkKK3sKKwljaGFyICpzdGFydCwgKmVuZCA9IGlu cHV0LCAqb3V0OworCSphcmdjID0gMDsKKworCXdoaWxlICgxKSB7CisJCXN0YXJ0ID0gZW5k OworCisJCS8qIFNraXAgd2hpdGVzcGFjZSAqLworCQl3aGlsZSAoKnN0YXJ0ICYmIGlzc3Bh Y2UoKnN0YXJ0KSkKKwkJCXN0YXJ0Kys7CisKKwkJaWYgKCEqc3RhcnQpCisJCQlicmVhazsJ Lyogc3VjY2Vzcywgd2UgaGl0IHRoZSBlbmQgKi8KKworCQkvKiAnb3V0JyBpcyB1c2VkIHRv IHJlbW92ZSBhbnkgYmFjay1xdW90ZXMgKi8KKwkJZW5kID0gb3V0ID0gc3RhcnQ7CisJCXdo aWxlICgqZW5kKSB7CisJCQkvKiBFdmVyeXRoaW5nIGFwYXJ0IGZyb20gJ1wwJyBjYW4gYmUg cXVvdGVkICovCisJCQlpZiAoKmVuZCA9PSAnXFwnICYmICooZW5kICsgMSkpIHsKKwkJCQkq b3V0KysgPSAqKGVuZCArIDEpOworCQkJCWVuZCArPSAyOworCQkJCWNvbnRpbnVlOworCQkJ fQorCisJCQlpZiAoaXNzcGFjZSgqZW5kKSkKKwkJCQlicmVhazsJLyogZW5kIG9mIHRva2Vu ICovCisKKwkJCSpvdXQrKyA9ICplbmQrKzsKKwkJfQorCisJCS8qIGhhdmUgd2UgYWxyZWFk eSBmaWxsZWQgdGhlIGFycmF5ID8gKi8KKwkJaWYgKCgqYXJnYyArIDEpID4gbWF4KQorCQkJ cmV0dXJuIC1FSU5WQUw7CisKKwkJLyogd2Uga25vdyB0aGlzIGlzIHdoaXRlc3BhY2UgKi8K KwkJaWYgKCplbmQpCisJCQllbmQrKzsKKworCQkvKiB0ZXJtaW5hdGUgdGhlIHN0cmluZyBh bmQgcHV0IGl0IGluIHRoZSBhcnJheSAqLworCQkqb3V0ID0gJ1wwJzsKKwkJYXJndlsqYXJn Y10gPSBzdGFydDsKKwkJKCphcmdjKSsrOworCX0KKworCXJldHVybiAwOworfQorCitpbnQg ZG1fdGFibGVfYWRkX3RhcmdldChzdHJ1Y3QgZG1fdGFibGUgKnQsIGNvbnN0IGNoYXIgKnR5 cGUsCisJCQlzZWN0b3JfdCBzdGFydCwgc2VjdG9yX3QgbGVuLCBjaGFyICpwYXJhbXMpCit7 CisJaW50IHIsIGFyZ2M7CisJY2hhciAqYXJndlszMl07CisJc3RydWN0IHRhcmdldF90eXBl ICp0dDsKKwlzdHJ1Y3QgZG1fdGFyZ2V0ICp0Z3Q7CisKKwlpZiAoKHIgPSBjaGVja19zcGFj ZSh0KSkpCisJCXJldHVybiByOworCisJdGd0ID0gdC0+dGFyZ2V0cyArIHQtPm51bV90YXJn ZXRzOworCW1lbXNldCh0Z3QsIDAsIHNpemVvZigqdGd0KSk7CisKKwl0dCA9IGRtX2dldF90 YXJnZXRfdHlwZSh0eXBlKTsKKwlpZiAoIXR0KSB7CisJCXRndC0+ZXJyb3IgPSAidW5rbm93 biB0YXJnZXQgdHlwZSI7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXRndC0+dGFibGUg PSB0OworCXRndC0+dHlwZSA9IHR0OworCXRndC0+YmVnaW4gPSBzdGFydDsKKwl0Z3QtPmxl biA9IGxlbjsKKwl0Z3QtPmVycm9yID0gIlVua25vd24gZXJyb3IiOworCisJLyoKKwkgKiBE b2VzIHRoaXMgdGFyZ2V0IGFkam9pbiB0aGUgcHJldmlvdXMgb25lID8KKwkgKi8KKwlpZiAo IWFkam9pbih0LCB0Z3QpKSB7CisJCURNRVJSKCJHYXAgaW4gdGFibGUiKTsKKwkJZG1fcHV0 X3RhcmdldF90eXBlKHR0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJciA9IHNwbGl0 X2FyZ3MoQVJSQVlfU0laRShhcmd2KSwgJmFyZ2MsIGFyZ3YsIHBhcmFtcyk7CisJaWYgKHIp IHsKKwkJdGd0LT5lcnJvciA9ICJjb3VsZG4ndCBzcGxpdCBwYXJhbWV0ZXJzIjsKKwkJZG1f cHV0X3RhcmdldF90eXBlKHR0KTsKKwkJcmV0dXJuIHI7CisJfQorCisJciA9IHR0LT5jdHIo dGd0LCBhcmdjLCBhcmd2KTsKKwlpZiAocikgeworCQlkbV9wdXRfdGFyZ2V0X3R5cGUodHQp OworCQlyZXR1cm4gcjsKKwl9CisKKwl0LT5oaWdoc1t0LT5udW1fdGFyZ2V0cysrXSA9IHRn dC0+YmVnaW4gKyB0Z3QtPmxlbiAtIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQg c2V0dXBfaW5kZXhlcyhzdHJ1Y3QgZG1fdGFibGUgKnQpCit7CisJaW50IGksIHRvdGFsID0g MDsKKwlzZWN0b3JfdCAqaW5kZXhlczsKKworCS8qIGFsbG9jYXRlIHRoZSBzcGFjZSBmb3Ig KmFsbCogdGhlIGluZGV4ZXMgKi8KKwlmb3IgKGkgPSB0LT5kZXB0aCAtIDI7IGkgPj0gMDsg aS0tKSB7CisJCXQtPmNvdW50c1tpXSA9IGRpdl91cCh0LT5jb3VudHNbaSArIDFdLCBDSElM RFJFTl9QRVJfTk9ERSk7CisJCXRvdGFsICs9IHQtPmNvdW50c1tpXTsKKwl9CisKKwlpbmRl eGVzID0gKHNlY3Rvcl90ICopIHZjYWxsb2ModG90YWwsICh1bnNpZ25lZCBsb25nKSBOT0RF X1NJWkUpOworCWlmICghaW5kZXhlcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBzZXQg dXAgaW50ZXJuYWwgbm9kZXMsIGJvdHRvbS11cCAqLworCWZvciAoaSA9IHQtPmRlcHRoIC0g MiwgdG90YWwgPSAwOyBpID49IDA7IGktLSkgeworCQl0LT5pbmRleFtpXSA9IGluZGV4ZXM7 CisJCWluZGV4ZXMgKz0gKEtFWVNfUEVSX05PREUgKiB0LT5jb3VudHNbaV0pOworCQlzZXR1 cF9idHJlZV9pbmRleChpLCB0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEJ1 aWxkcyB0aGUgYnRyZWUgdG8gaW5kZXggdGhlIG1hcC4KKyAqLworaW50IGRtX3RhYmxlX2Nv bXBsZXRlKHN0cnVjdCBkbV90YWJsZSAqdCkKK3sKKwlpbnQgbGVhZl9ub2RlcywgciA9IDA7 CisKKwkvKiBob3cgbWFueSBpbmRleGVzIHdpbGwgdGhlIGJ0cmVlIGhhdmUgPyAqLworCWxl YWZfbm9kZXMgPSBkaXZfdXAodC0+bnVtX3RhcmdldHMsIEtFWVNfUEVSX05PREUpOworCXQt PmRlcHRoID0gMSArIGludF9sb2cobGVhZl9ub2RlcywgQ0hJTERSRU5fUEVSX05PREUpOwor CisJLyogbGVhZiBsYXllciBoYXMgYWxyZWFkeSBiZWVuIHNldCB1cCAqLworCXQtPmNvdW50 c1t0LT5kZXB0aCAtIDFdID0gbGVhZl9ub2RlczsKKwl0LT5pbmRleFt0LT5kZXB0aCAtIDFd ID0gdC0+aGlnaHM7CisKKwlpZiAodC0+ZGVwdGggPj0gMikKKwkJciA9IHNldHVwX2luZGV4 ZXModCk7CisKKwlyZXR1cm4gcjsKK30KKwordm9pZCBkbV90YWJsZV9ldmVudChzdHJ1Y3Qg ZG1fdGFibGUgKnQpCit7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0LT5ldmVudHEpOwor fQorCitzZWN0b3JfdCBkbV90YWJsZV9nZXRfc2l6ZShzdHJ1Y3QgZG1fdGFibGUgKnQpCit7 CisJcmV0dXJuIHQtPm51bV90YXJnZXRzID8gKHQtPmhpZ2hzW3QtPm51bV90YXJnZXRzIC0g MV0gKyAxKSA6IDA7Cit9CisKK3N0cnVjdCBkbV90YXJnZXQgKmRtX3RhYmxlX2dldF90YXJn ZXQoc3RydWN0IGRtX3RhYmxlICp0LCBpbnQgaW5kZXgpCit7CisJaWYgKGluZGV4ID4gdC0+ bnVtX3RhcmdldHMpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIHQtPnRhcmdldHMgKyBp bmRleDsKK30KKworLyoKKyAqIFNlYXJjaCB0aGUgYnRyZWUgZm9yIHRoZSBjb3JyZWN0IHRh cmdldC4KKyAqLworc3RydWN0IGRtX3RhcmdldCAqZG1fdGFibGVfZmluZF90YXJnZXQoc3Ry dWN0IGRtX3RhYmxlICp0LCBzZWN0b3JfdCBzZWN0b3IpCit7CisJaW50IGwsIG4gPSAwLCBr ID0gMDsKKwlzZWN0b3JfdCAqbm9kZTsKKworCWZvciAobCA9IDA7IGwgPCB0LT5kZXB0aDsg bCsrKSB7CisJCW4gPSBnZXRfY2hpbGQobiwgayk7CisJCW5vZGUgPSBnZXRfbm9kZSh0LCBs LCBuKTsKKworCQlmb3IgKGsgPSAwOyBrIDwgS0VZU19QRVJfTk9ERTsgaysrKQorCQkJaWYg KG5vZGVba10gPj0gc2VjdG9yKQorCQkJCWJyZWFrOworCX0KKworCXJldHVybiAmdC0+dGFy Z2V0c1soS0VZU19QRVJfTk9ERSAqIG4pICsga107Cit9CisKK3Vuc2lnbmVkIGludCBkbV90 YWJsZV9nZXRfbnVtX3RhcmdldHMoc3RydWN0IGRtX3RhYmxlICp0KQoreworCXJldHVybiB0 LT5udW1fdGFyZ2V0czsKK30KKworc3RydWN0IGxpc3RfaGVhZCAqZG1fdGFibGVfZ2V0X2Rl dmljZXMoc3RydWN0IGRtX3RhYmxlICp0KQoreworCXJldHVybiAmdC0+ZGV2aWNlczsKK30K KworaW50IGRtX3RhYmxlX2dldF9tb2RlKHN0cnVjdCBkbV90YWJsZSAqdCkKK3sKKwlyZXR1 cm4gdC0+bW9kZTsKK30KKwordm9pZCBkbV90YWJsZV9hZGRfd2FpdF9xdWV1ZShzdHJ1Y3Qg ZG1fdGFibGUgKnQsIHdhaXRfcXVldWVfdCAqd3EpCit7CisJYWRkX3dhaXRfcXVldWUoJnQt PmV2ZW50cSwgd3EpOworfQorCitFWFBPUlRfU1lNQk9MKGRtX2dldF9kZXZpY2UpOworRVhQ T1JUX1NZTUJPTChkbV9wdXRfZGV2aWNlKTsKK0VYUE9SVF9TWU1CT0woZG1fdGFibGVfZXZl bnQpOwotLS0gZGlmZi9kcml2ZXJzL21kL2RtLXRhcmdldC5jCTE5NzAtMDEtMDEgMDE6MDA6 MDAuMDAwMDAwMDAwICswMTAwCisrKyBzb3VyY2UvZHJpdmVycy9tZC9kbS10YXJnZXQuYwky MDAyLTExLTI5IDA5OjQ0OjU5LjAwMDAwMDAwMCArMDAwMApAQCAtMCwwICsxLDE5MCBAQAor LyoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBTaXN0aW5hIFNvZnR3YXJlIChVSykgTGltaXRl ZAorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICovCisK KyNpbmNsdWRlICJkbS5oIgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVk ZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworc3RydWN0IHR0 X2ludGVybmFsIHsKKwlzdHJ1Y3QgdGFyZ2V0X3R5cGUgdHQ7CisKKwlzdHJ1Y3QgbGlzdF9o ZWFkIGxpc3Q7CisJbG9uZyB1c2U7Cit9OworCitzdGF0aWMgTElTVF9IRUFEKF90YXJnZXRz KTsKK3N0YXRpYyByd2xvY2tfdCBfbG9jayA9IFJXX0xPQ0tfVU5MT0NLRUQ7CisKKyNkZWZp bmUgRE1fTU9EX05BTUVfU0laRSAzMgorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0dF9pbnRl cm5hbCAqX19maW5kX3RhcmdldF90eXBlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0 IGxpc3RfaGVhZCAqdGloOworCXN0cnVjdCB0dF9pbnRlcm5hbCAqdGk7CisKKwlsaXN0X2Zv cl9lYWNoKHRpaCwgJl90YXJnZXRzKSB7CisJCXRpID0gbGlzdF9lbnRyeSh0aWgsIHN0cnVj dCB0dF9pbnRlcm5hbCwgbGlzdCk7CisKKwkJaWYgKCFzdHJjbXAobmFtZSwgdGktPnR0Lm5h bWUpKQorCQkJcmV0dXJuIHRpOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMg c3RydWN0IHR0X2ludGVybmFsICpnZXRfdGFyZ2V0X3R5cGUoY29uc3QgY2hhciAqbmFtZSkK K3sKKwlzdHJ1Y3QgdHRfaW50ZXJuYWwgKnRpOworCisJcmVhZF9sb2NrKCZfbG9jayk7CisJ dGkgPSBfX2ZpbmRfdGFyZ2V0X3R5cGUobmFtZSk7CisKKwlpZiAodGkpIHsKKwkJaWYgKHRp LT51c2UgPT0gMCAmJiB0aS0+dHQubW9kdWxlKQorCQkJX19NT0RfSU5DX1VTRV9DT1VOVCh0 aS0+dHQubW9kdWxlKTsKKwkJdGktPnVzZSsrOworCX0KKwlyZWFkX3VubG9jaygmX2xvY2sp OworCisJcmV0dXJuIHRpOworfQorCitzdGF0aWMgdm9pZCBsb2FkX21vZHVsZShjb25zdCBj aGFyICpuYW1lKQoreworCWNoYXIgbW9kdWxlX25hbWVbRE1fTU9EX05BTUVfU0laRV0gPSAi ZG0tIjsKKworCS8qIExlbmd0aCBjaGVjayBmb3Igc3RyY2F0KCkgYmVsb3cgKi8KKwlpZiAo c3RybGVuKG5hbWUpID4gKERNX01PRF9OQU1FX1NJWkUgLSA0KSkKKwkJcmV0dXJuOworCisJ c3RyY2F0KG1vZHVsZV9uYW1lLCBuYW1lKTsKKwlyZXF1ZXN0X21vZHVsZShtb2R1bGVfbmFt ZSk7CisKKwlyZXR1cm47Cit9CisKK3N0cnVjdCB0YXJnZXRfdHlwZSAqZG1fZ2V0X3Rhcmdl dF90eXBlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHR0X2ludGVybmFsICp0aSA9 IGdldF90YXJnZXRfdHlwZShuYW1lKTsKKworCWlmICghdGkpIHsKKwkJbG9hZF9tb2R1bGUo bmFtZSk7CisJCXRpID0gZ2V0X3RhcmdldF90eXBlKG5hbWUpOworCX0KKworCXJldHVybiB0 aSA/ICZ0aS0+dHQgOiBOVUxMOworfQorCit2b2lkIGRtX3B1dF90YXJnZXRfdHlwZShzdHJ1 Y3QgdGFyZ2V0X3R5cGUgKnQpCit7CisJc3RydWN0IHR0X2ludGVybmFsICp0aSA9IChzdHJ1 Y3QgdHRfaW50ZXJuYWwgKikgdDsKKworCXJlYWRfbG9jaygmX2xvY2spOworCWlmICgtLXRp LT51c2UgPT0gMCAmJiB0aS0+dHQubW9kdWxlKQorCQlfX01PRF9ERUNfVVNFX0NPVU5UKHRp LT50dC5tb2R1bGUpOworCisJaWYgKHRpLT51c2UgPCAwKQorCQlCVUcoKTsKKwlyZWFkX3Vu bG9jaygmX2xvY2spOworCisJcmV0dXJuOworfQorCitzdGF0aWMgc3RydWN0IHR0X2ludGVy bmFsICphbGxvY190YXJnZXQoc3RydWN0IHRhcmdldF90eXBlICp0KQoreworCXN0cnVjdCB0 dF9pbnRlcm5hbCAqdGkgPSBrbWFsbG9jKHNpemVvZigqdGkpLCBHRlBfS0VSTkVMKTsKKwor CWlmICh0aSkgeworCQltZW1zZXQodGksIDAsIHNpemVvZigqdGkpKTsKKwkJdGktPnR0ID0g KnQ7CisJfQorCisJcmV0dXJuIHRpOworfQorCitpbnQgZG1fcmVnaXN0ZXJfdGFyZ2V0KHN0 cnVjdCB0YXJnZXRfdHlwZSAqdCkKK3sKKwlpbnQgcnYgPSAwOworCXN0cnVjdCB0dF9pbnRl cm5hbCAqdGkgPSBhbGxvY190YXJnZXQodCk7CisKKwlpZiAoIXRpKQorCQlyZXR1cm4gLUVO T01FTTsKKworCXdyaXRlX2xvY2soJl9sb2NrKTsKKwlpZiAoX19maW5kX3RhcmdldF90eXBl KHQtPm5hbWUpKQorCQlydiA9IC1FRVhJU1Q7CisJZWxzZQorCQlsaXN0X2FkZCgmdGktPmxp c3QsICZfdGFyZ2V0cyk7CisKKwl3cml0ZV91bmxvY2soJl9sb2NrKTsKKwlyZXR1cm4gcnY7 Cit9CisKK2ludCBkbV91bnJlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgdGFyZ2V0X3R5cGUgKnQp Cit7CisJc3RydWN0IHR0X2ludGVybmFsICp0aTsKKworCXdyaXRlX2xvY2soJl9sb2NrKTsK KwlpZiAoISh0aSA9IF9fZmluZF90YXJnZXRfdHlwZSh0LT5uYW1lKSkpIHsKKwkJd3JpdGVf dW5sb2NrKCZfbG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh0aS0+dXNl KSB7CisJCXdyaXRlX3VubG9jaygmX2xvY2spOworCQlyZXR1cm4gLUVUWFRCU1k7CisJfQor CisJbGlzdF9kZWwoJnRpLT5saXN0KTsKKwlrZnJlZSh0aSk7CisKKwl3cml0ZV91bmxvY2so Jl9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGlvLWVycjogYWx3YXlzIGZhaWxz IGFuIGlvLCB1c2VmdWwgZm9yIGJyaW5naW5nCisgKiB1cCBMVnMgdGhhdCBoYXZlIGhvbGVz IGluIHRoZW0uCisgKi8KK3N0YXRpYyBpbnQgaW9fZXJyX2N0cihzdHJ1Y3QgZG1fdGFyZ2V0 ICp0aSwgaW50IGFyZ2MsIGNoYXIgKiphcmdzKQoreworCXJldHVybiAwOworfQorCitzdGF0 aWMgdm9pZCBpb19lcnJfZHRyKHN0cnVjdCBkbV90YXJnZXQgKnRpKQoreworCS8qIGVtcHR5 ICovCisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IGlvX2Vycl9tYXAoc3RydWN0IGRtX3Rh cmdldCAqdGksIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBydykKK3sKKwlidWZmZXJf SU9fZXJyb3IoYmgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHRhcmdldF90 eXBlIGVycm9yX3RhcmdldCA9IHsKKwkubmFtZSA9ICJlcnJvciIsCisJLmN0ciAgPSBpb19l cnJfY3RyLAorCS5kdHIgID0gaW9fZXJyX2R0ciwKKwkubWFwICA9IGlvX2Vycl9tYXAsCit9 OworCitpbnQgZG1fdGFyZ2V0X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gZG1fcmVnaXN0ZXJf dGFyZ2V0KCZlcnJvcl90YXJnZXQpOworfQorCit2b2lkIGRtX3RhcmdldF9leGl0KHZvaWQp Cit7CisJaWYgKGRtX3VucmVnaXN0ZXJfdGFyZ2V0KCZlcnJvcl90YXJnZXQpKQorCQlETVdB Uk4oImVycm9yIHRhcmdldCB1bnJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKK30KKworRVhQT1JU X1NZTUJPTChkbV9yZWdpc3Rlcl90YXJnZXQpOworRVhQT1JUX1NZTUJPTChkbV91bnJlZ2lz dGVyX3RhcmdldCk7Ci0tLSBkaWZmL2RyaXZlcnMvbWQvZG0uYwkxOTcwLTAxLTAxIDAxOjAw OjAwLjAwMDAwMDAwMCArMDEwMAorKysgc291cmNlL2RyaXZlcnMvbWQvZG0uYwkyMDAyLTEx LTI5IDA5OjQ0OjU5LjAwMDAwMDAwMCArMDAwMApAQCAtMCwwICsxLDg2MiBAQAorLyoKKyAq IENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBTaXN0aW5hIFNvZnR3YXJlIChVSykgTGltaXRl ZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAqLwor CisjaW5jbHVkZSAiZG0uaCIKKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRl IDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGsuaD4KKyNpbmNsdWRlIDxs aW51eC9ibGtwZy5oPgorI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KKyNpbmNsdWRlIDxs aW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8bGlu dXgvbHZtLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgY29uc3Qg Y2hhciAqX25hbWUgPSBETV9OQU1FOworI2RlZmluZSBNQVhfREVWSUNFUyAoMSA8PCBNSU5P UkJJVFMpCisjZGVmaW5lIFNFQ1RPUl9TSElGVCA5CisjZGVmaW5lIERFRkFVTFRfUkVBRF9B SEVBRCA2NAorCitzdGF0aWMgaW50IG1ham9yID0gMDsKK3N0YXRpYyBpbnQgX21ham9yID0g MDsKKworc3RydWN0IGRtX2lvIHsKKwlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQ7CisKKwl2 b2lkICgqZW5kX2lvKSAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsIGludCB1cHRvZGF0ZSk7 CisJdm9pZCAqY29udGV4dDsKK307CisKK3N0cnVjdCBkZWZlcnJlZF9pbyB7CisJaW50IHJ3 OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGRlZmVycmVkX2lvICpuZXh0 OworfTsKKworLyoKKyAqIEJpdHMgZm9yIHRoZSBtZC0+ZmxhZ3MgZmllbGQuCisgKi8KKyNk ZWZpbmUgRE1GX0JMT0NLX0lPIDAKKyNkZWZpbmUgRE1GX1NVU1BFTkRFRCAxCisKK3N0cnVj dCBtYXBwZWRfZGV2aWNlIHsKKwlzdHJ1Y3Qgcndfc2VtYXBob3JlIGxvY2s7CisJYXRvbWlj X3QgaG9sZGVyczsKKworCWtkZXZfdCBkZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwor CS8qCisJICogQSBsaXN0IG9mIGlvcyB0aGF0IGFycml2ZWQgd2hpbGUgd2Ugd2VyZSBzdXNw ZW5kZWQuCisJICovCisJYXRvbWljX3QgcGVuZGluZzsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3 YWl0OworCXN0cnVjdCBkZWZlcnJlZF9pbyAqZGVmZXJyZWQ7CisKKwkvKgorCSAqIFRoZSBj dXJyZW50IG1hcHBpbmcuCisJICovCisJc3RydWN0IGRtX3RhYmxlICptYXA7Cit9OworCisj ZGVmaW5lIE1JTl9JT1MgMjU2CitzdGF0aWMga21lbV9jYWNoZV90ICpfaW9fY2FjaGU7Citz dGF0aWMgbWVtcG9vbF90ICpfaW9fcG9vbDsKKworLyogYmxvY2sgZGV2aWNlIGFycmF5cyAq Lworc3RhdGljIGludCBfYmxvY2tfc2l6ZVtNQVhfREVWSUNFU107CitzdGF0aWMgaW50IF9i bGtzaXplX3NpemVbTUFYX0RFVklDRVNdOworc3RhdGljIGludCBfaGFyZHNlY3Rfc2l6ZVtN QVhfREVWSUNFU107CisKK3N0YXRpYyBzdHJ1Y3QgbWFwcGVkX2RldmljZSAqZ2V0X2tkZXYo a2Rldl90IGRldik7CitzdGF0aWMgaW50IGRtX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpx LCBpbnQgcncsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOworc3RhdGljIGludCBkbV91c2Vy X2JtYXAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGx2X2JtYXAgKmx2Yik7CisKKwor c3RhdGljIF9faW5pdCBpbnQgbG9jYWxfaW5pdCh2b2lkKQoreworCWludCByOworCisJLyog YWxsb2NhdGUgYSBzbGFiIGZvciB0aGUgZG1faW9zICovCisJX2lvX2NhY2hlID0ga21lbV9j YWNoZV9jcmVhdGUoImRtIGlvIiwKKwkJCQkgICAgICBzaXplb2Yoc3RydWN0IGRtX2lvKSwg MCwgMCwgTlVMTCwgTlVMTCk7CisKKwlpZiAoIV9pb19jYWNoZSkKKwkJcmV0dXJuIC1FTk9N RU07CisKKwlfaW9fcG9vbCA9IG1lbXBvb2xfY3JlYXRlKE1JTl9JT1MsIG1lbXBvb2xfYWxs b2Nfc2xhYiwKKwkJCQkgIG1lbXBvb2xfZnJlZV9zbGFiLCBfaW9fY2FjaGUpOworCWlmICgh X2lvX3Bvb2wpIHsKKwkJa21lbV9jYWNoZV9kZXN0cm95KF9pb19jYWNoZSk7CisJCXJldHVy biAtRU5PTUVNOworCX0KKworCV9tYWpvciA9IG1ham9yOworCXIgPSByZWdpc3Rlcl9ibGtk ZXYoX21ham9yLCBfbmFtZSwgJmRtX2Jsa19kb3BzKTsKKwlpZiAociA8IDApIHsKKwkJRE1F UlIoInJlZ2lzdGVyX2Jsa2RldiBmYWlsZWQiKTsKKwkJbWVtcG9vbF9kZXN0cm95KF9pb19w b29sKTsKKwkJa21lbV9jYWNoZV9kZXN0cm95KF9pb19jYWNoZSk7CisJCXJldHVybiByOwor CX0KKworCWlmICghX21ham9yKQorCQlfbWFqb3IgPSByOworCisJLyogc2V0IHVwIHRoZSBh cnJheXMgKi8KKwlyZWFkX2FoZWFkW19tYWpvcl0gPSBERUZBVUxUX1JFQURfQUhFQUQ7CisJ YmxrX3NpemVbX21ham9yXSA9IF9ibG9ja19zaXplOworCWJsa3NpemVfc2l6ZVtfbWFqb3Jd ID0gX2Jsa3NpemVfc2l6ZTsKKwloYXJkc2VjdF9zaXplW19tYWpvcl0gPSBfaGFyZHNlY3Rf c2l6ZTsKKworCWJsa19xdWV1ZV9tYWtlX3JlcXVlc3QoQkxLX0RFRkFVTFRfUVVFVUUoX21h am9yKSwgZG1fcmVxdWVzdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbG9j YWxfZXhpdCh2b2lkKQoreworCW1lbXBvb2xfZGVzdHJveShfaW9fcG9vbCk7CisJa21lbV9j YWNoZV9kZXN0cm95KF9pb19jYWNoZSk7CisKKwlpZiAodW5yZWdpc3Rlcl9ibGtkZXYoX21h am9yLCBfbmFtZSkgPCAwKQorCQlETUVSUigiZGV2ZnNfdW5yZWdpc3Rlcl9ibGtkZXYgZmFp bGVkIik7CisKKwlyZWFkX2FoZWFkW19tYWpvcl0gPSAwOworCWJsa19zaXplW19tYWpvcl0g PSBOVUxMOworCWJsa3NpemVfc2l6ZVtfbWFqb3JdID0gTlVMTDsKKwloYXJkc2VjdF9zaXpl W19tYWpvcl0gPSBOVUxMOworCV9tYWpvciA9IDA7CisKKwlETUlORk8oImNsZWFuZWQgdXAi KTsKK30KKworLyoKKyAqIFdlIGhhdmUgYSBsb3Qgb2YgaW5pdC9leGl0IGZ1bmN0aW9ucywg c28gaXQgc2VlbXMgZWFzaWVyIHRvCisgKiBzdG9yZSB0aGVtIGluIGFuIGFycmF5LiAgVGhl IGRpc3Bvc2FibGUgbWFjcm8gJ3h4JworICogZXhwYW5kcyBhIHByZWZpeCBpbnRvIGEgcGFp ciBvZiBmdW5jdGlvbiBuYW1lcy4KKyAqLworc3RhdGljIHN0cnVjdCB7CisJaW50ICgqaW5p dCkgKHZvaWQpOworCXZvaWQgKCpleGl0KSAodm9pZCk7CisKK30gX2luaXRzW10gPSB7Cisj ZGVmaW5lIHh4KG4pIHtuICMjIF9pbml0LCBuICMjIF9leGl0fSwKKwl4eChsb2NhbCkKKwl4 eChkbV90YXJnZXQpCisJeHgoZG1fbGluZWFyKQorCXh4KGRtX3N0cmlwZSkKKwl4eChkbV9z bmFwc2hvdCkKKwl4eChkbV9pbnRlcmZhY2UpCisjdW5kZWYgeHgKK307CisKK3N0YXRpYyBp bnQgX19pbml0IGRtX2luaXQodm9pZCkKK3sKKwljb25zdCBpbnQgY291bnQgPSBBUlJBWV9T SVpFKF9pbml0cyk7CisKKwlpbnQgciwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsg aSsrKSB7CisJCXIgPSBfaW5pdHNbaV0uaW5pdCgpOworCQlpZiAocikKKwkJCWdvdG8gYmFk OworCX0KKworCXJldHVybiAwOworCisgICAgICBiYWQ6CisJd2hpbGUgKGktLSkKKwkJX2lu aXRzW2ldLmV4aXQoKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQg ZG1fZXhpdCh2b2lkKQoreworCWludCBpID0gQVJSQVlfU0laRShfaW5pdHMpOworCisJd2hp bGUgKGktLSkKKwkJX2luaXRzW2ldLmV4aXQoKTsKK30KKworLyoKKyAqIEJsb2NrIGRldmlj ZSBmdW5jdGlvbnMKKyAqLworc3RhdGljIGludCBkbV9ibGtfb3BlbihzdHJ1Y3QgaW5vZGUg Kmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgbWFwcGVkX2RldmljZSAq bWQ7CisKKwltZCA9IGdldF9rZGV2KGlub2RlLT5pX3JkZXYpOworCWlmICghbWQpCisJCXJl dHVybiAtRU5YSU87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkbV9ibGtfY2xv c2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0 IG1hcHBlZF9kZXZpY2UgKm1kOworCisJbWQgPSBnZXRfa2Rldihpbm9kZS0+aV9yZGV2KTsK KwlkbV9wdXQobWQpOwkJLyogcHV0IHRoZSByZWZlcmVuY2UgZ2FpbmVkIGJ5IGRtX2Jsa19v cGVuICovCisJZG1fcHV0KG1kKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBz dHJ1Y3QgZG1faW8gKmFsbG9jX2lvKHZvaWQpCit7CisJcmV0dXJuIG1lbXBvb2xfYWxsb2Mo X2lvX3Bvb2wsIEdGUF9OT0lPKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZyZWVfaW8o c3RydWN0IGRtX2lvICppbykKK3sKKwltZW1wb29sX2ZyZWUoaW8sIF9pb19wb29sKTsKK30K Kworc3RhdGljIGlubGluZSBzdHJ1Y3QgZGVmZXJyZWRfaW8gKmFsbG9jX2RlZmVycmVkKHZv aWQpCit7CisJcmV0dXJuIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZWZlcnJlZF9pbyksIEdG UF9OT0lPKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZyZWVfZGVmZXJyZWQoc3RydWN0 IGRlZmVycmVkX2lvICpkaSkKK3sKKwlrZnJlZShkaSk7Cit9CisKKy8qIEluIDUxMi1ieXRl IHVuaXRzICovCisjZGVmaW5lIFZPTFVNRV9TSVpFKG1pbm9yKSAoX2Jsb2NrX3NpemVbKG1p bm9yKV0gPDwgMSkKKworLyogRklYTUU6IGNoZWNrIHRoaXMgKi8KK3N0YXRpYyBpbnQgZG1f YmxrX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJ dWludCBjb21tYW5kLCB1bnNpZ25lZCBsb25nIGEpCit7CisJaW50IG1pbm9yID0gTUlOT1Io aW5vZGUtPmlfcmRldik7CisJbG9uZyBzaXplOworCisJaWYgKG1pbm9yID49IE1BWF9ERVZJ Q0VTKQorCQlyZXR1cm4gLUVOWElPOworCisJc3dpdGNoIChjb21tYW5kKSB7CisJY2FzZSBC TEtST1NFVDoKKwljYXNlIEJMS1JPR0VUOgorCWNhc2UgQkxLUkFTRVQ6CisJY2FzZSBCTEtS QUdFVDoKKwljYXNlIEJMS0ZMU0JVRjoKKwljYXNlIEJMS1NTWkdFVDoKKwkJLy9jYXNlIEJM S1JSUEFSVDogLyogUmUtcmVhZCBwYXJ0aXRpb24gdGFibGVzICovCisJCS8vY2FzZSBCTEtQ RzoKKwljYXNlIEJMS0VMVkdFVDoKKwljYXNlIEJMS0VMVlNFVDoKKwljYXNlIEJMS0JTWkdF VDoKKwljYXNlIEJMS0JTWlNFVDoKKwkJcmV0dXJuIGJsa19pb2N0bChpbm9kZS0+aV9yZGV2 LCBjb21tYW5kLCBhKTsKKwkJYnJlYWs7CisKKwljYXNlIEJMS0dFVFNJWkU6CisJCXNpemUg PSBWT0xVTUVfU0laRShtaW5vcik7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYSwg JnNpemUsIHNpemVvZihsb25nKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisK KwljYXNlIEJMS0dFVFNJWkU2NDoKKwkJc2l6ZSA9IFZPTFVNRV9TSVpFKG1pbm9yKTsKKwkJ aWYgKHB1dF91c2VyKCh1NjQpICgodTY0KSBzaXplKSA8PCA5LCAodTY0ICopIGEpKQorCQkJ cmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBCTEtSUlBBUlQ6CisJCXJldHVy biAtRU5PVFRZOworCisJY2FzZSBMVl9CTUFQOgorCQlyZXR1cm4gZG1fdXNlcl9ibWFwKGlu b2RlLCAoc3RydWN0IGx2X2JtYXAgKikgYSk7CisKKwlkZWZhdWx0OgorCQlETVdBUk4oInVu a25vd24gYmxvY2sgaW9jdGwgMHgleCIsIGNvbW1hbmQpOworCQlyZXR1cm4gLUVOT1RUWTsK Kwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFkZCB0aGUgYnVmZmVyIHRvIHRoZSBs aXN0IG9mIGRlZmVycmVkIGlvLgorICovCitzdGF0aWMgaW50IHF1ZXVlX2lvKHN0cnVjdCBt YXBwZWRfZGV2aWNlICptZCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHJ3KQorewor CXN0cnVjdCBkZWZlcnJlZF9pbyAqZGk7CisKKwlkaSA9IGFsbG9jX2RlZmVycmVkKCk7CisJ aWYgKCFkaSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkb3duX3dyaXRlKCZtZC0+bG9jayk7 CisKKwlpZiAoIXRlc3RfYml0KERNRl9TVVNQRU5ERUQsICZtZC0+ZmxhZ3MpKSB7CisJCXVw X3dyaXRlKCZtZC0+bG9jayk7CisJCWZyZWVfZGVmZXJyZWQoZGkpOworCQlyZXR1cm4gMTsK Kwl9CisKKwlkaS0+YmggPSBiaDsKKwlkaS0+cncgPSBydzsKKwlkaS0+bmV4dCA9IG1kLT5k ZWZlcnJlZDsKKwltZC0+ZGVmZXJyZWQgPSBkaTsKKworCXVwX3dyaXRlKCZtZC0+bG9jayk7 CisJcmV0dXJuIDA7CQkvKiBkZWZlcnJlZCBzdWNjZXNzZnVsbHkgKi8KK30KKworLyoKKyAq IGJoLT5iX2VuZF9pbyByb3V0aW5lIHRoYXQgZGVjcmVtZW50cyB0aGUgcGVuZGluZyBjb3Vu dAorICogYW5kIHRoZW4gY2FsbHMgdGhlIG9yaWdpbmFsIGJoLT5iX2VuZF9pbyBmbi4KKyAq Lworc3RhdGljIHZvaWQgZGVjX3BlbmRpbmcoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50 IHVwdG9kYXRlKQoreworCXN0cnVjdCBkbV9pbyAqaW8gPSBiaC0+Yl9wcml2YXRlOworCisJ aWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmlvLT5tZC0+cGVuZGluZykpCisJCS8qIG51ZGdl IGFueW9uZSB3YWl0aW5nIG9uIHN1c3BlbmQgcXVldWUgKi8KKwkJd2FrZV91cCgmaW8tPm1k LT53YWl0KTsKKworCWJoLT5iX2VuZF9pbyA9IGlvLT5lbmRfaW87CisJYmgtPmJfcHJpdmF0 ZSA9IGlvLT5jb250ZXh0OworCWZyZWVfaW8oaW8pOworCisJYmgtPmJfZW5kX2lvKGJoLCB1 cHRvZGF0ZSk7Cit9CisKKy8qCisgKiBEbyB0aGUgYmggbWFwcGluZyBmb3IgYSBnaXZlbiBs ZWFmCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9fbWFwX2J1ZmZlcihzdHJ1Y3QgbWFwcGVk X2RldmljZSAqbWQsCisJCQkgICAgICAgaW50IHJ3LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJo KQoreworCWludCByOworCXN0cnVjdCBkbV9pbyAqaW87CisJc3RydWN0IGRtX3RhcmdldCAq dGk7CisKKwl0aSA9IGRtX3RhYmxlX2ZpbmRfdGFyZ2V0KG1kLT5tYXAsIGJoLT5iX3JzZWN0 b3IpOworCWlmICghdGkpCisJCXJldHVybiAtRUlOVkFMOworCisJaW8gPSBhbGxvY19pbygp OworCWlmICghaW8pCisJCXJldHVybiAtRU5PTUVNOworCisJaW8tPm1kID0gbWQ7CisJaW8t PmVuZF9pbyA9IGJoLT5iX2VuZF9pbzsKKwlpby0+Y29udGV4dCA9IGJoLT5iX3ByaXZhdGU7 CisKKwlyID0gdGktPnR5cGUtPm1hcCh0aSwgYmgsIHJ3KTsKKworCWlmIChyID4gMCkgewor CQkvKiBob29rIHRoZSBlbmQgaW8gcmVxdWVzdCBmbiAqLworCQlhdG9taWNfaW5jKCZtZC0+ cGVuZGluZyk7CisJCWJoLT5iX2VuZF9pbyA9IGRlY19wZW5kaW5nOworCQliaC0+Yl9wcml2 YXRlID0gaW87CisKKwl9IGVsc2UKKwkJLyogd2UgZG9uJ3QgbmVlZCB0byBob29rICovCisJ CWZyZWVfaW8oaW8pOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX19yZXF1ZXN0 KHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCwgaW50IHJ3LCBzdHJ1Y3QgYnVmZmVyX2hlYWQg KmJoKQoreworCWludCByOworCisJLyoKKwkgKiBJZiB3ZSdyZSBzdXNwZW5kZWQgd2UgaGF2 ZSB0byBxdWV1ZSB0aGlzIGlvIGZvciBsYXRlci4KKwkgKi8KKwl3aGlsZSAodGVzdF9iaXQo RE1GX0JMT0NLX0lPLCAmbWQtPmZsYWdzKSkgeworCQl1cF9yZWFkKCZtZC0+bG9jayk7CisK KwkJLyoKKwkJICogVGhlcmUncyBubyBwb2ludCBkZWZlcnJpbmcgYSByZWFkIGFoZWFkCisJ CSAqIHJlcXVlc3QsIGp1c3QgZHJvcCBpdC4KKwkJICovCisJCWlmIChydyA9PSBSRUFEQSkg eworCQkJciA9IC1FSU87CisJCQlnb3RvIG91dF9ub19sb2NrOworCQl9CisKKwkJciA9IHF1 ZXVlX2lvKG1kLCBiaCwgcncpOworCQlpZiAociA8PSAwKQorCQkJLyoKKwkJCSAqIEVpdGhl ciBhbiBlcnJvciBvY2N1cnJlZCBvciB3ZSBkZWZlcnJlZAorCQkJICogc3VjY2Vzc2Z1bGx5 LgorCQkJICovCisJCQlnb3RvIG91dF9ub19sb2NrOworCisJCS8qCisJCSAqIFdlJ3JlIGlu IGEgd2hpbGUgbG9vcCwgYmVjYXVzZSBzb21lb25lIGNvdWxkCisJCSAqIHN1c3BlbmQgYmVm b3JlIHdlIGdldCB0byB0aGUgZm9sbG93aW5nIHJlYWQKKwkJICogbG9jay4KKwkJICovCisJ CWRvd25fcmVhZCgmbWQtPmxvY2spOworCX0KKworCXIgPSBfX21hcF9idWZmZXIobWQsIHJ3 LCBiaCk7CisKKyBvdXRfbm9fbG9jazoKKwlkb3duX3JlYWQoJm1kLT5sb2NrKTsKKwlyZXR1 cm4gcjsKK30KKworc3RhdGljIGludCBkbV9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwg aW50IHJ3LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWludCByOworCXN0cnVjdCBt YXBwZWRfZGV2aWNlICptZDsKKworCW1kID0gZ2V0X2tkZXYoYmgtPmJfcmRldik7CisJaWYg KCFtZCkgeworCQlidWZmZXJfSU9fZXJyb3IoYmgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlk b3duX3JlYWQoJm1kLT5sb2NrKTsKKworCXIgPSBfX3JlcXVlc3QobWQsIHJ3LCBiaCk7CisJ aWYgKHIgPCAwKSB7CisJCWJ1ZmZlcl9JT19lcnJvcihiaCk7CisJCXIgPSAwOworCX0KKwor CXVwX3JlYWQoJm1kLT5sb2NrKTsKKwlkbV9wdXQobWQpOworCXJldHVybiByOworfQorCitz dGF0aWMgaW50IGNoZWNrX2Rldl9zaXplKGtkZXZfdCBkZXYsIHVuc2lnbmVkIGxvbmcgYmxv Y2spCit7CisJLyogRklYTUU6IGNoZWNrIHRoaXMgKi8KKwlpbnQgbWlub3IgPSBNSU5PUihk ZXYpOworCXVuc2lnbmVkIGxvbmcgbWF4X3NlY3RvciA9IChfYmxvY2tfc2l6ZVttaW5vcl0g PDwgMSkgKyAxOworCXVuc2lnbmVkIGxvbmcgc2VjdG9yID0gKGJsb2NrICsgMSkgKiAoX2Js a3NpemVfc2l6ZVttaW5vcl0gPj4gOSk7CisKKwlyZXR1cm4gKHNlY3RvciA+IG1heF9zZWN0 b3IpID8gMCA6IDE7Cit9CisKKy8qCisgKiBDcmVhdGVzIGEgZHVtbXkgYnVmZmVyIGhlYWQg YW5kIG1hcHMgaXQgKGZvciBsaWxvKS4KKyAqLworc3RhdGljIGludCBfX2JtYXAoc3RydWN0 IG1hcHBlZF9kZXZpY2UgKm1kLCBrZGV2X3QgZGV2LCB1bnNpZ25lZCBsb25nIGJsb2NrLAor CQkgIGtkZXZfdCAqcl9kZXYsIHVuc2lnbmVkIGxvbmcgKnJfYmxvY2spCit7CisJc3RydWN0 IGJ1ZmZlcl9oZWFkIGJoOworCXN0cnVjdCBkbV90YXJnZXQgKnRpOworCWludCByOworCisJ aWYgKHRlc3RfYml0KERNRl9CTE9DS19JTywgJm1kLT5mbGFncykpIHsKKwkJcmV0dXJuIC1F UEVSTTsKKwl9CisKKwlpZiAoIWNoZWNrX2Rldl9zaXplKGRldiwgYmxvY2spKSB7CisJCXJl dHVybiAtRUlOVkFMOworCX0KKworCS8qIHNldHVwIGR1bW15IGJoICovCisJbWVtc2V0KCZi aCwgMCwgc2l6ZW9mKGJoKSk7CisJYmguYl9ibG9ja25yID0gYmxvY2s7CisJYmguYl9kZXYg PSBiaC5iX3JkZXYgPSBkZXY7CisJYmguYl9zaXplID0gX2Jsa3NpemVfc2l6ZVtNSU5PUihk ZXYpXTsKKwliaC5iX3JzZWN0b3IgPSBibG9jayAqIChiaC5iX3NpemUgPj4gOSk7CisKKwkv KiBmaW5kIHRhcmdldCAqLworCXRpID0gZG1fdGFibGVfZmluZF90YXJnZXQobWQtPm1hcCwg YmguYl9yc2VjdG9yKTsKKworCS8qIGRvIHRoZSBtYXBwaW5nICovCisJciA9IHRpLT50eXBl LT5tYXAodGksICZiaCwgUkVBRCk7CisKKwlpZiAoIXIpIHsKKwkJKnJfZGV2ID0gYmguYl9y ZGV2OworCQkqcl9ibG9jayA9IGJoLmJfcnNlY3RvciAvIChiaC5iX3NpemUgPj4gOSk7CisJ fQorCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBNYXJzaGFscyBhcmd1bWVudHMgYW5kIHJl c3VsdHMgYmV0d2VlbiB1c2VyIGFuZCBrZXJuZWwgc3BhY2UuCisgKi8KK3N0YXRpYyBpbnQg ZG1fdXNlcl9ibWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBsdl9ibWFwICpsdmIp Cit7CisJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kOworCXVuc2lnbmVkIGxvbmcgYmxvY2ss IHJfYmxvY2s7CisJa2Rldl90IHJfZGV2OworCWludCByOworCisJaWYgKGdldF91c2VyKGJs b2NrLCAmbHZiLT5sdl9ibG9jaykpCisJCXJldHVybiAtRUZBVUxUOworCisJbWQgPSBnZXRf a2Rldihpbm9kZS0+aV9yZGV2KTsKKwlpZiAoIW1kKQorCQlyZXR1cm4gLUVOWElPOworCisJ ZG93bl9yZWFkKCZtZC0+bG9jayk7CisJciA9IF9fYm1hcChtZCwgaW5vZGUtPmlfcmRldiwg YmxvY2ssICZyX2RldiwgJnJfYmxvY2spOworCXVwX3JlYWQoJm1kLT5sb2NrKTsKKwlkbV9w dXQobWQpOworCisJaWYgKCFyICYmIChwdXRfdXNlcihrZGV2X3RfdG9fbnIocl9kZXYpLCAm bHZiLT5sdl9kZXYpIHx8CisJCSAgIHB1dF91c2VyKHJfYmxvY2ssICZsdmItPmx2X2Jsb2Nr KSkpCisJCXIgPSAtRUZBVUxUOworCisJcmV0dXJuIHI7Cit9CisKKy8qLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyAqIEEgYml0c2V0IGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBhbGxvY2F0ZWQgbWlub3Ig bnVtYmVycy4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBzcGlubG9ja190IF9taW5vcl9sb2Nr ID0gU1BJTl9MT0NLX1VOTE9DS0VEOworc3RhdGljIHN0cnVjdCBtYXBwZWRfZGV2aWNlICog X21kc1tNQVhfREVWSUNFU107CisKK3N0YXRpYyB2b2lkIGZyZWVfbWlub3IoaW50IG1pbm9y KQoreworCXNwaW5fbG9jaygmX21pbm9yX2xvY2spOworCV9tZHNbbWlub3JdID0gTlVMTDsK KwlzcGluX3VubG9jaygmX21pbm9yX2xvY2spOworfQorCisvKgorICogU2VlIGlmIHRoZSBk ZXZpY2Ugd2l0aCBhIHNwZWNpZmljIG1pbm9yICMgaXMgZnJlZS4KKyAqLworc3RhdGljIGlu dCBzcGVjaWZpY19taW5vcihpbnQgbWlub3IsIHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCkK K3sKKwlpbnQgciA9IC1FQlVTWTsKKworCWlmIChtaW5vciA+PSBNQVhfREVWSUNFUykgewor CQlETVdBUk4oInJlcXVlc3QgZm9yIGEgbWFwcGVkX2RldmljZSBiZXlvbmQgTUFYX0RFVklD RVMgKCVkKSIsCisJCSAgICAgICBNQVhfREVWSUNFUyk7CisJCXJldHVybiAtRUlOVkFMOwor CX0KKworCXNwaW5fbG9jaygmX21pbm9yX2xvY2spOworCWlmICghX21kc1ttaW5vcl0pIHsK KwkJX21kc1ttaW5vcl0gPSBtZDsKKwkJciA9IG1pbm9yOworCX0KKwlzcGluX3VubG9jaygm X21pbm9yX2xvY2spOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgbmV4dF9mcmVl X21pbm9yKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCkKK3sKKwlpbnQgaTsKKworCXNwaW5f bG9jaygmX21pbm9yX2xvY2spOworCWZvciAoaSA9IDA7IGkgPCBNQVhfREVWSUNFUzsgaSsr KSB7CisJCWlmICghX21kc1tpXSkgeworCQkJX21kc1tpXSA9IG1kOworCQkJYnJlYWs7CisJ CX0KKwl9CisJc3Bpbl91bmxvY2soJl9taW5vcl9sb2NrKTsKKworCXJldHVybiAoaSA8IE1B WF9ERVZJQ0VTKSA/IGkgOiAtRUJVU1k7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWFwcGVkX2Rl dmljZSAqZ2V0X2tkZXYoa2Rldl90IGRldikKK3sKKwlzdHJ1Y3QgbWFwcGVkX2RldmljZSAq bWQ7CisKKwlpZiAobWFqb3IoZGV2KSAhPSBfbWFqb3IpCisJCXJldHVybiBOVUxMOworCisJ c3Bpbl9sb2NrKF9taW5vcl9sb2NrKTsKKwltZCA9IF9tZHNbbWlub3IoZGV2KV07CisJaWYg KG1kKQorCQlkbV9nZXQobWQpOworCXNwaW5fdW5sb2NrKF9taW5vcl9sb2NrKTsKKworCXJl dHVybiBtZDsKK30KKworLyoKKyAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIGEgYmxhbmsg ZGV2aWNlIHdpdGggYSBnaXZlbiBtaW5vci4KKyAqLworc3RhdGljIHN0cnVjdCBtYXBwZWRf ZGV2aWNlICphbGxvY19kZXYoaW50IG1pbm9yKQoreworCXN0cnVjdCBtYXBwZWRfZGV2aWNl ICptZCA9IGttYWxsb2Moc2l6ZW9mKCptZCksIEdGUF9LRVJORUwpOworCisJaWYgKCFtZCkg eworCQlETVdBUk4oInVuYWJsZSB0byBhbGxvY2F0ZSBkZXZpY2UsIG91dCBvZiBtZW1vcnku Iik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIGdldCBhIG1pbm9yIG51bWJlciBmb3Ig dGhlIGRldiAqLworCW1pbm9yID0gKG1pbm9yIDwgMCkgPyBuZXh0X2ZyZWVfbWlub3IobWQp IDogc3BlY2lmaWNfbWlub3IobWlub3IsIG1kKTsKKwlpZiAobWlub3IgPCAwKSB7CisJCWtm cmVlKG1kKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJRE1XQVJOKCJhbGxvY2F0aW5nIG1p bm9yICVkLiIsIG1pbm9yKTsKKwltZW1zZXQobWQsIDAsIHNpemVvZigqbWQpKTsKKwltZC0+ ZGV2ID0gbWtfa2RldihfbWFqb3IsIG1pbm9yKTsKKwlpbml0X3J3c2VtKCZtZC0+bG9jayk7 CisJYXRvbWljX3NldCgmbWQtPmhvbGRlcnMsIDEpOworCWF0b21pY19zZXQoJm1kLT5wZW5k aW5nLCAwKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtZC0+d2FpdCk7CisKKwlyZXR1cm4g bWQ7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfZGV2KHN0cnVjdCBtYXBwZWRfZGV2aWNlICpt ZCkKK3sKKwlmcmVlX21pbm9yKG1pbm9yKG1kLT5kZXYpKTsKKwlrZnJlZShtZCk7Cit9CisK Ky8qCisgKiBUaGUgaGFyZHNlY3Qgc2l6ZSBmb3IgYSBtYXBwZWQgZGV2aWNlIGlzIHRoZSBs YXJnZXN0IGhhcmRzZWN0IHNpemUKKyAqIGZyb20gdGhlIGRldmljZXMgaXQgbWFwcyBvbnRv LgorICovCitzdGF0aWMgaW50IF9fZmluZF9oYXJkc2VjdF9zaXplKHN0cnVjdCBsaXN0X2hl YWQgKmRldmljZXMpCit7CisJaW50IHJlc3VsdCA9IDUxMiwgc2l6ZTsKKwlzdHJ1Y3QgbGlz dF9oZWFkICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoKHRtcCwgZGV2aWNlcykgeworCQlzdHJ1 Y3QgZG1fZGV2ICpkZCA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgZG1fZGV2LCBsaXN0KTsK KwkJc2l6ZSA9IGdldF9oYXJkc2VjdF9zaXplKGRkLT5kZXYpOworCQlpZiAoc2l6ZSA+IHJl c3VsdCkKKwkJCXJlc3VsdCA9IHNpemU7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKwor LyoKKyAqIEJpbmQgYSB0YWJsZSB0byB0aGUgZGV2aWNlLgorICovCitzdGF0aWMgaW50IF9f YmluZChzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQsIHN0cnVjdCBkbV90YWJsZSAqdCkKK3sK KwlpbnQgbWlub3IgPSBtaW5vcihtZC0+ZGV2KTsKKwltZC0+bWFwID0gdDsKKworCS8qIGlu IGsgKi8KKwlfYmxvY2tfc2l6ZVttaW5vcl0gPSBkbV90YWJsZV9nZXRfc2l6ZSh0KSA+PiAx OworCV9ibGtzaXplX3NpemVbbWlub3JdID0gQkxPQ0tfU0laRTsKKwlfaGFyZHNlY3Rfc2l6 ZVttaW5vcl0gPSBfX2ZpbmRfaGFyZHNlY3Rfc2l6ZShkbV90YWJsZV9nZXRfZGV2aWNlcyh0 KSk7CisJcmVnaXN0ZXJfZGlzayhOVUxMLCBtZC0+ZGV2LCAxLCAmZG1fYmxrX2RvcHMsIF9i bG9ja19zaXplW21pbm9yXSk7CisKKwlkbV90YWJsZV9nZXQodCk7CisJcmV0dXJuIDA7Cit9 CisKK3N0YXRpYyB2b2lkIF9fdW5iaW5kKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCkKK3sK KwlpbnQgbWlub3IgPSBtaW5vcihtZC0+ZGV2KTsKKworCWRtX3RhYmxlX3B1dChtZC0+bWFw KTsKKwltZC0+bWFwID0gTlVMTDsKKworCV9ibG9ja19zaXplW21pbm9yXSA9IDA7CisJX2Js a3NpemVfc2l6ZVttaW5vcl0gPSAwOworCV9oYXJkc2VjdF9zaXplW21pbm9yXSA9IDA7Cit9 CisKKy8qCisgKiBDb25zdHJ1Y3RvciBmb3IgYSBuZXcgZGV2aWNlLgorICovCitpbnQgZG1f Y3JlYXRlKGludCBtaW5vciwgc3RydWN0IGRtX3RhYmxlICp0YWJsZSwgc3RydWN0IG1hcHBl ZF9kZXZpY2UgKipyZXN1bHQpCit7CisJaW50IHI7CisJc3RydWN0IG1hcHBlZF9kZXZpY2Ug Km1kOworCisJbWQgPSBhbGxvY19kZXYobWlub3IpOworCWlmICghbWQpCisJCXJldHVybiAt RU5YSU87CisKKwlyID0gX19iaW5kKG1kLCB0YWJsZSk7CisJaWYgKHIpIHsKKwkJZnJlZV9k ZXYobWQpOworCQlyZXR1cm4gcjsKKwl9CisKKwkqcmVzdWx0ID0gbWQ7CisJcmV0dXJuIDA7 Cit9CisKK3ZvaWQgZG1fZ2V0KHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCkKK3sKKwlhdG9t aWNfaW5jKCZtZC0+aG9sZGVycyk7Cit9CisKK3ZvaWQgZG1fcHV0KHN0cnVjdCBtYXBwZWRf ZGV2aWNlICptZCkKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmbWQtPmhvbGRlcnMp KSB7CisJCURNV0FSTigiZGVzdHJveWluZyBtZCIpOworCQlfX3VuYmluZChtZCk7CisJCWZy ZWVfZGV2KG1kKTsKKwl9Cit9CisKKy8qCisgKiBSZXF1ZXVlIHRoZSBkZWZlcnJlZCBpbyBi eSBjYWxsaW5nIGdlbmVyaWNfbWFrZV9yZXF1ZXN0LgorICovCitzdGF0aWMgdm9pZCBmbHVz aF9kZWZlcnJlZF9pbyhzdHJ1Y3QgZGVmZXJyZWRfaW8gKmMpCit7CisJc3RydWN0IGRlZmVy cmVkX2lvICpuOworCisJd2hpbGUgKGMpIHsKKwkJbiA9IGMtPm5leHQ7CisJCWdlbmVyaWNf bWFrZV9yZXF1ZXN0KGMtPnJ3LCBjLT5iaCk7CisJCWZyZWVfZGVmZXJyZWQoYyk7CisJCWMg PSBuOworCX0KK30KKworLyoKKyAqIFN3YXAgaW4gYSBuZXcgdGFibGUgKGRlc3Ryb3lpbmcg b2xkIG9uZSkuCisgKi8KK2ludCBkbV9zd2FwX3RhYmxlKHN0cnVjdCBtYXBwZWRfZGV2aWNl ICptZCwgc3RydWN0IGRtX3RhYmxlICp0YWJsZSkKK3sKKwlpbnQgcjsKKworCWRvd25fd3Jp dGUoJm1kLT5sb2NrKTsKKworCS8qIGRldmljZSBtdXN0IGJlIHN1c3BlbmRlZCAqLworCWlm ICghdGVzdF9iaXQoRE1GX1NVU1BFTkRFRCwgJm1kLT5mbGFncykpIHsKKwkJdXBfd3JpdGUo Jm1kLT5sb2NrKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlfX3VuYmluZChtZCk7CisJ ciA9IF9fYmluZChtZCwgdGFibGUpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXVwX3dy aXRlKCZtZC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXZSBuZWVkIHRvIGJl IGFibGUgdG8gY2hhbmdlIGEgbWFwcGluZyB0YWJsZSB1bmRlciBhIG1vdW50ZWQKKyAqIGZp bGVzeXN0ZW0uICBGb3IgZXhhbXBsZSB3ZSBtaWdodCB3YW50IHRvIG1vdmUgc29tZSBkYXRh IGluCisgKiB0aGUgYmFja2dyb3VuZC4gIEJlZm9yZSB0aGUgdGFibGUgY2FuIGJlIHN3YXBw ZWQgd2l0aAorICogZG1fYmluZF90YWJsZSwgZG1fc3VzcGVuZCBtdXN0IGJlIGNhbGxlZCB0 byBmbHVzaCBhbnkgaW4KKyAqIGZsaWdodCBpbyBhbmQgZW5zdXJlIHRoYXQgYW55IGZ1cnRo ZXIgaW8gZ2V0cyBkZWZlcnJlZC4KKyAqLworaW50IGRtX3N1c3BlbmQoc3RydWN0IG1hcHBl ZF9kZXZpY2UgKm1kKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwor CisJZG93bl93cml0ZSgmbWQtPmxvY2spOworCisJLyoKKwkgKiBGaXJzdCB3ZSBzZXQgdGhl IEJMT0NLX0lPIGZsYWcgc28gbm8gbW9yZSBpb3Mgd2lsbCBiZQorCSAqIG1hcHBlZC4KKwkg Ki8KKwlpZiAodGVzdF9iaXQoRE1GX0JMT0NLX0lPLCAmbWQtPmZsYWdzKSkgeworCQl1cF93 cml0ZSgmbWQtPmxvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzZXRfYml0KERN Rl9CTE9DS19JTywgJm1kLT5mbGFncyk7CisJdXBfd3JpdGUoJm1kLT5sb2NrKTsKKworCS8q CisJICogVGhlbiB3ZSB3YWl0IGZvciB0aGUgYWxyZWFkeSBtYXBwZWQgaW9zIHRvCisJICog Y29tcGxldGUuCisJICovCisJZG93bl9yZWFkKCZtZC0+bG9jayk7CisKKwlhZGRfd2FpdF9x dWV1ZSgmbWQtPndhaXQsICZ3YWl0KTsKKwl3aGlsZSAoMSkgeworCQlzZXRfY3VycmVudF9z dGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCisJCWlmICghYXRvbWljX3JlYWQoJm1kLT5w ZW5kaW5nKSkKKwkJCWJyZWFrOworCisJCXNjaGVkdWxlKCk7CisJfQorCisJY3VycmVudC0+ c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJcmVtb3ZlX3dhaXRfcXVldWUoJm1kLT53YWl0LCAm d2FpdCk7CisJdXBfcmVhZCgmbWQtPmxvY2spOworCisJLyogc2V0X2JpdCBpcyBhdG9taWMg Ki8KKwlzZXRfYml0KERNRl9TVVNQRU5ERUQsICZtZC0+ZmxhZ3MpOworCisJcmV0dXJuIDA7 Cit9CisKK2ludCBkbV9yZXN1bWUoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKQoreworCXN0 cnVjdCBkZWZlcnJlZF9pbyAqZGVmOworCisJZG93bl93cml0ZSgmbWQtPmxvY2spOworCWlm ICghdGVzdF9iaXQoRE1GX1NVU1BFTkRFRCwgJm1kLT5mbGFncykgfHwKKwkgICAgIWRtX3Rh YmxlX2dldF9zaXplKG1kLT5tYXApKSB7CisJCXVwX3dyaXRlKCZtZC0+bG9jayk7CisJCXJl dHVybiAtRUlOVkFMOworCX0KKworCWNsZWFyX2JpdChETUZfU1VTUEVOREVELCAmbWQtPmZs YWdzKTsKKwljbGVhcl9iaXQoRE1GX0JMT0NLX0lPLCAmbWQtPmZsYWdzKTsKKwlkZWYgPSBt ZC0+ZGVmZXJyZWQ7CisJbWQtPmRlZmVycmVkID0gTlVMTDsKKwl1cF93cml0ZSgmbWQtPmxv Y2spOworCisJZmx1c2hfZGVmZXJyZWRfaW8oZGVmKTsKKwlydW5fdGFza19xdWV1ZSgmdHFf ZGlzayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGRtX3RhYmxlICpkbV9nZXRfdGFi bGUoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKQoreworCXN0cnVjdCBkbV90YWJsZSAqdDsK KworCWRvd25fcmVhZCgmbWQtPmxvY2spOworCXQgPSBtZC0+bWFwOworCWRtX3RhYmxlX2dl dCh0KTsKKwl1cF9yZWFkKCZtZC0+bG9jayk7CisKKwlyZXR1cm4gdDsKK30KKwora2Rldl90 IGRtX2tkZXYoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKQoreworCWtkZXZfdCBkZXY7CisK Kwlkb3duX3JlYWQoJm1kLT5sb2NrKTsKKwlkZXYgPSBtZC0+ZGV2OworCXVwX3JlYWQoJm1k LT5sb2NrKTsKKworCXJldHVybiBkZXY7Cit9CisKK2ludCBkbV9zdXNwZW5kZWQoc3RydWN0 IG1hcHBlZF9kZXZpY2UgKm1kKQoreworCXJldHVybiB0ZXN0X2JpdChETUZfU1VTUEVOREVE LCAmbWQtPmZsYWdzKTsKK30KKworc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIGRt X2Jsa19kb3BzID0geworCS5vcGVuID0gZG1fYmxrX29wZW4sCisJLnJlbGVhc2UgPSBkbV9i bGtfY2xvc2UsCisJLmlvY3RsID0gZG1fYmxrX2lvY3RsLAorCS5vd25lciA9IFRISVNfTU9E VUxFCit9OworCisvKgorICogbW9kdWxlIGhvb2tzCisgKi8KK21vZHVsZV9pbml0KGRtX2lu aXQpOworbW9kdWxlX2V4aXQoZG1fZXhpdCk7CisKK01PRFVMRV9QQVJNKG1ham9yLCAiaSIp OworTU9EVUxFX1BBUk1fREVTQyhtYWpvciwgIlRoZSBtYWpvciBudW1iZXIgb2YgdGhlIGRl dmljZSBtYXBwZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTihETV9OQU1FICIgZHJpdmVyIik7 CitNT0RVTEVfQVVUSE9SKCJKb2UgVGhvcm5iZXIgPHRob3JuYmVyQHNpc3RpbmEuY29tPiIp OworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotLS0gZGlmZi9kcml2ZXJzL21kL2RtLmgJMTk3 MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKKysrIHNvdXJjZS9kcml2ZXJzL21k L2RtLmgJMjAwMi0xMS0yOSAwOTo0NDo1OS4wMDAwMDAwMDAgKzAwMDAKQEAgLTAsMCArMSwx NTEgQEAKKy8qCisgKiBJbnRlcm5hbCBoZWFkZXIgZmlsZSBmb3IgZGV2aWNlIG1hcHBlcgor ICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBTaXN0aW5hIFNvZnR3YXJlCisgKgor ICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBMR1BMLgorICovCisKKyNpZm5k ZWYgRE1fSU5URVJOQUxfSAorI2RlZmluZSBETV9JTlRFUk5BTF9ICisKKyNpbmNsdWRlIDxs aW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS1tYXBwZXIuaD4KKyNpbmNsdWRl IDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisKKyNkZWZpbmUg RE1fTkFNRSAiZGV2aWNlLW1hcHBlciIKKyNkZWZpbmUgRE1XQVJOKGYsIHguLi4pIHByaW50 ayhLRVJOX1dBUk5JTkcgRE1fTkFNRSAiOiAiIGYgIlxuIiAsICMjIHgpCisjZGVmaW5lIERN RVJSKGYsIHguLi4pIHByaW50ayhLRVJOX0VSUiBETV9OQU1FICI6ICIgZiAiXG4iICwgIyMg eCkKKyNkZWZpbmUgRE1JTkZPKGYsIHguLi4pIHByaW50ayhLRVJOX0lORk8gRE1fTkFNRSAi OiAiIGYgIlxuIiAsICMjIHgpCisKKy8qCisgKiBGSVhNRTogSSB0aGluayB0aGlzIHNob3Vs ZCBiZSB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHNlY3Rvcl90CisgKiBpbiB0eXBlcy5oLgor ICovCisjaWZkZWYgQ09ORklHX0xCRAorI2RlZmluZSBTRUNUT1JfRk9STUFUICIlTHUiCisj ZWxzZQorI2RlZmluZSBTRUNUT1JfRk9STUFUICIlbHUiCisjZW5kaWYKKworZXh0ZXJuIHN0 cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyBkbV9ibGtfZG9wczsKKworLyoKKyAqIExp c3Qgb2YgZGV2aWNlcyB0aGF0IGEgbWV0YWRldmljZSB1c2VzIGFuZCBzaG91bGQgb3Blbi9j bG9zZS4KKyAqLworc3RydWN0IGRtX2RldiB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0Owor CisJYXRvbWljX3QgY291bnQ7CisJaW50IG1vZGU7CisJa2Rldl90IGRldjsKKwlzdHJ1Y3Qg YmxvY2tfZGV2aWNlICpiZGV2OworfTsKKworc3RydWN0IGRtX3RhYmxlOworc3RydWN0IG1h cHBlZF9kZXZpY2U7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9ucyBmb3IgbWFuaXB1 bGF0aW5nIGEgc3RydWN0IG1hcHBlZF9kZXZpY2UuCisgKiBEcm9wIHRoZSByZWZlcmVuY2Ug d2l0aCBkbV9wdXQgd2hlbiB5b3UgZmluaXNoIHdpdGggdGhlIG9iamVjdC4KKyAqLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tKi8KK2ludCBkbV9jcmVhdGUoaW50IG1pbm9yLCBzdHJ1Y3QgZG1fdGFibGUgKnRhYmxl LCBzdHJ1Y3QgbWFwcGVkX2RldmljZSAqKm1kKTsKKworLyoKKyAqIFJlZmVyZW5jZSBjb3Vu dGluZyBmb3IgbWQuCisgKi8KK3ZvaWQgZG1fZ2V0KHN0cnVjdCBtYXBwZWRfZGV2aWNlICpt ZCk7Cit2b2lkIGRtX3B1dChzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpOworCisvKgorICog QSBkZXZpY2UgY2FuIHN0aWxsIGJlIHVzZWQgd2hpbGUgc3VzcGVuZGVkLCBidXQgSS9PIGlz IGRlZmVycmVkLgorICovCitpbnQgZG1fc3VzcGVuZChzdHJ1Y3QgbWFwcGVkX2RldmljZSAq bWQpOworaW50IGRtX3Jlc3VtZShzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpOworCisvKgor ICogVGhlIGRldmljZSBtdXN0IGJlIHN1c3BlbmRlZCBiZWZvcmUgY2FsbGluZyB0aGlzIG1l dGhvZC4KKyAqLworaW50IGRtX3N3YXBfdGFibGUoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1k LCBzdHJ1Y3QgZG1fdGFibGUgKnQpOworCisvKgorICogRHJvcCBhIHJlZmVyZW5jZSBvbiB0 aGUgdGFibGUgd2hlbiB5b3UndmUgZmluaXNoZWQgd2l0aCB0aGUKKyAqIHJlc3VsdC4KKyAq Lworc3RydWN0IGRtX3RhYmxlICpkbV9nZXRfdGFibGUoc3RydWN0IG1hcHBlZF9kZXZpY2Ug Km1kKTsKKworLyoKKyAqIEluZm8gZnVuY3Rpb25zLgorICovCitrZGV2X3QgZG1fa2Rldihz dHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpOworaW50IGRtX3N1c3BlbmRlZChzdHJ1Y3QgbWFw cGVkX2RldmljZSAqbWQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbnMgZm9yIG1h bmlwdWxhdGluZyBhIHRhYmxlLiAgVGFibGVzIGFyZSBhbHNvIHJlZmVyZW5jZQorICogY291 bnRlZC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBkbV90YWJsZV9jcmVhdGUoc3RydWN0IGRtX3Rh YmxlICoqcmVzdWx0LCBpbnQgbW9kZSk7CisKK3ZvaWQgZG1fdGFibGVfZ2V0KHN0cnVjdCBk bV90YWJsZSAqdCk7Cit2b2lkIGRtX3RhYmxlX3B1dChzdHJ1Y3QgZG1fdGFibGUgKnQpOwor CitpbnQgZG1fdGFibGVfYWRkX3RhcmdldChzdHJ1Y3QgZG1fdGFibGUgKnQsIGNvbnN0IGNo YXIgKnR5cGUsCisJCQlzZWN0b3JfdCBzdGFydCwJc2VjdG9yX3QgbGVuLCBjaGFyICpwYXJh bXMpOworaW50IGRtX3RhYmxlX2NvbXBsZXRlKHN0cnVjdCBkbV90YWJsZSAqdCk7Cit2b2lk IGRtX3RhYmxlX2V2ZW50KHN0cnVjdCBkbV90YWJsZSAqdCk7CitzZWN0b3JfdCBkbV90YWJs ZV9nZXRfc2l6ZShzdHJ1Y3QgZG1fdGFibGUgKnQpOworc3RydWN0IGRtX3RhcmdldCAqZG1f dGFibGVfZ2V0X3RhcmdldChzdHJ1Y3QgZG1fdGFibGUgKnQsIGludCBpbmRleCk7CitzdHJ1 Y3QgZG1fdGFyZ2V0ICpkbV90YWJsZV9maW5kX3RhcmdldChzdHJ1Y3QgZG1fdGFibGUgKnQs IHNlY3Rvcl90IHNlY3Rvcik7Cit1bnNpZ25lZCBpbnQgZG1fdGFibGVfZ2V0X251bV90YXJn ZXRzKHN0cnVjdCBkbV90YWJsZSAqdCk7CitzdHJ1Y3QgbGlzdF9oZWFkICpkbV90YWJsZV9n ZXRfZGV2aWNlcyhzdHJ1Y3QgZG1fdGFibGUgKnQpOworaW50IGRtX3RhYmxlX2dldF9tb2Rl KHN0cnVjdCBkbV90YWJsZSAqdCk7Cit2b2lkIGRtX3RhYmxlX2FkZF93YWl0X3F1ZXVlKHN0 cnVjdCBkbV90YWJsZSAqdCwgd2FpdF9xdWV1ZV90ICp3cSk7CisKKy8qLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyAqIEEgcmVnaXN0cnkgb2YgdGFyZ2V0IHR5cGVzLgorICotLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IGRt X3RhcmdldF9pbml0KHZvaWQpOwordm9pZCBkbV90YXJnZXRfZXhpdCh2b2lkKTsKK3N0cnVj dCB0YXJnZXRfdHlwZSAqZG1fZ2V0X3RhcmdldF90eXBlKGNvbnN0IGNoYXIgKm5hbWUpOwor dm9pZCBkbV9wdXRfdGFyZ2V0X3R5cGUoc3RydWN0IHRhcmdldF90eXBlICp0KTsKKworCisv Ki0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCisgKiBVc2VmdWwgaW5saW5lcy4KKyAqLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRp YyBpbmxpbmUgaW50IGFycmF5X3Rvb19iaWcodW5zaWduZWQgbG9uZyBmaXhlZCwgdW5zaWdu ZWQgbG9uZyBvYmosCisJCQkJdW5zaWduZWQgbG9uZyBudW0pCit7CisJcmV0dXJuIChudW0g PiAoVUxPTkdfTUFYIC0gZml4ZWQpIC8gb2JqKTsKK30KKworLyoKKyAqIGNlaWxpbmcobiAv IHNpemUpICogc2l6ZQorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZG1fcm91 bmRfdXAodW5zaWduZWQgbG9uZyBuLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdW5zaWdu ZWQgbG9uZyByID0gbiAlIHNpemU7CisJcmV0dXJuIG4gKyAociA/IChzaXplIC0gcikgOiAw KTsKK30KKworLyoKKyAqIFRoZSBkZXZpY2UtbWFwcGVyIGNhbiBiZSBkcml2ZW4gdGhyb3Vn aCBvbmUgb2YgdHdvIGludGVyZmFjZXM7CisgKiBpb2N0bCBvciBmaWxlc3lzdGVtLCBkZXBl bmRpbmcgd2hpY2ggcGF0Y2ggeW91IGhhdmUgYXBwbGllZC4KKyAqLworaW50IGRtX2ludGVy ZmFjZV9pbml0KHZvaWQpOwordm9pZCBkbV9pbnRlcmZhY2VfZXhpdCh2b2lkKTsKKworLyoK KyAqIFRhcmdldHMgZm9yIGxpbmVhciBhbmQgc3RyaXBlZCBtYXBwaW5ncworICovCitpbnQg ZG1fbGluZWFyX2luaXQodm9pZCk7Cit2b2lkIGRtX2xpbmVhcl9leGl0KHZvaWQpOworCitp bnQgZG1fc3RyaXBlX2luaXQodm9pZCk7Cit2b2lkIGRtX3N0cmlwZV9leGl0KHZvaWQpOwor CitpbnQgZG1fc25hcHNob3RfaW5pdCh2b2lkKTsKK3ZvaWQgZG1fc25hcHNob3RfZXhpdCh2 b2lkKTsKKworI2VuZGlmCi0tLSBkaWZmL2RyaXZlcnMvbWQva2NvcHlkLmMJMTk3MC0wMS0w MSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKKysrIHNvdXJjZS9kcml2ZXJzL21kL2tjb3B5 ZC5jCTIwMDItMTEtMjkgMDk6NDQ6NTkuMDAwMDAwMDAwICswMDAwCkBAIC0wLDAgKzEsODQz IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFNpc3RpbmEgU29mdHdhcmUgKFVLKSBM aW1pdGVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgor ICovCisKKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisKKyNpbmNsdWRlIDxsaW51eC9ibGtk ZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZp Y2UtbWFwcGVyLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9p bml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tz Lmg+CisjaW5jbHVkZSA8bGludXgvbWVtcG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVs ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFi Lmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorCisjaW5jbHVkZSAia2NvcHlkLmgi CisKKy8qIEZJWE1FOiB0aGlzIGlzIG9ubHkgbmVlZGVkIGZvciB0aGUgRE1FUlIgbWFjcm9z ICovCisjaW5jbHVkZSAiZG0uaCIKKworLyoKKyAqIEhhcmQgc2VjdG9yIHNpemUgdXNlZCBh bGwgb3ZlciB0aGUga2VybmVsLgorICovCisjZGVmaW5lIFNFQ1RPUl9TSVpFIDUxMgorI2Rl ZmluZSBTRUNUT1JfU0hJRlQgOQorCitzdGF0aWMgdm9pZCB3YWtlX2tjb3B5ZCh2b2lkKTsK KworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorICogV2UgcmVzZXJ2ZSBvdXIgb3duIHBvb2wgb2YgcHJlYWxs b2NhdGVkIHBhZ2VzIHRoYXQgYXJlCisgKiBvbmx5IHVzZWQgZm9yIGtjb3B5ZCBpby4KKyAq LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tKi8KKworLyoKKyAqIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBjb25maWd1cmFi bGUuCisgKi8KKyNkZWZpbmUgTlVNX1BBR0VTIDUxMgorCitzdGF0aWMgREVDTEFSRV9NVVRF WChfcGFnZXNfbG9jayk7CitzdGF0aWMgaW50IF9udW1fZnJlZV9wYWdlczsKK3N0YXRpYyBz dHJ1Y3QgcGFnZSAqX3BhZ2VzX2FycmF5W05VTV9QQUdFU107CitzdGF0aWMgREVDTEFSRV9N VVRFWChzdGFydF9sb2NrKTsKKworc3RhdGljIGludCBpbml0X3BhZ2VzKHZvaWQpCit7CisJ aW50IGk7CisJc3RydWN0IHBhZ2UgKnA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1BBR0VT OyBpKyspIHsKKwkJcCA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCWlmICghcCkKKwkJ CWdvdG8gYmFkOworCisJCUxvY2tQYWdlKHApOworCQlfcGFnZXNfYXJyYXlbaV0gPSBwOwor CX0KKworCV9udW1fZnJlZV9wYWdlcyA9IE5VTV9QQUdFUzsKKwlyZXR1cm4gMDsKKworICAg ICAgYmFkOgorCXdoaWxlIChpLS0pCisJCV9fZnJlZV9wYWdlKF9wYWdlc19hcnJheVtpXSk7 CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIGV4aXRfcGFnZXModm9pZCkK K3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcGFnZSAqcDsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1f UEFHRVM7IGkrKykgeworCQlwID0gX3BhZ2VzX2FycmF5W2ldOworCQlVbmxvY2tQYWdlKHAp OworCQlfX2ZyZWVfcGFnZShwKTsKKwl9CisKKwlfbnVtX2ZyZWVfcGFnZXMgPSAwOworfQor CitzdGF0aWMgaW50IGtjb3B5ZF9nZXRfcGFnZXMoaW50IG51bSwgc3RydWN0IHBhZ2UgKipy ZXN1bHQpCit7CisJaW50IGk7CisKKwlkb3duKCZfcGFnZXNfbG9jayk7CisJaWYgKF9udW1f ZnJlZV9wYWdlcyA8IG51bSkgeworCQl1cCgmX3BhZ2VzX2xvY2spOworCQlyZXR1cm4gLUVO T01FTTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJX251bV9mcmVl X3BhZ2VzLS07CisJCXJlc3VsdFtpXSA9IF9wYWdlc19hcnJheVtfbnVtX2ZyZWVfcGFnZXNd OworCX0KKwl1cCgmX3BhZ2VzX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2 b2lkIGtjb3B5ZF9mcmVlX3BhZ2VzKGludCBudW0sIHN0cnVjdCBwYWdlICoqcmVzdWx0KQor eworCWludCBpOworCisJZG93bigmX3BhZ2VzX2xvY2spOworCWZvciAoaSA9IDA7IGkgPCBu dW07IGkrKykKKwkJX3BhZ2VzX2FycmF5W19udW1fZnJlZV9wYWdlcysrXSA9IHJlc3VsdFtp XTsKKwl1cCgmX3BhZ2VzX2xvY2spOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBXZSBrZWVw IG91ciBvd24gcHJpdmF0ZSBwb29sIG9mIGJ1ZmZlcl9oZWFkcy4gIFRoZXNlIGFyZSBqdXN0 CisgKiBoZWxkIGluIGEgbGlzdCBvbiB0aGUgYl9yZXFuZXh0IGZpZWxkLgorICotLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0qLworCisvKgorICogTWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIGJ1ZmZlcnMgdG8gYWx3 YXlzIGtlZXAgdGhlIHBhZ2VzCisgKiBvY2N1cGllZC4gIFNvIHdlIGFzc3VtZSB0aGUgd29y c3QgY2FzZSBzY2VuYXJpbyB3aGVyZSBibG9ja3MKKyAqIGFyZSB0aGUgc2l6ZSBvZiBhIHNp bmdsZSBzZWN0b3IuCisgKi8KKyNkZWZpbmUgTlVNX0JVRkZFUlMgTlVNX1BBR0VTICogKFBB R0VfU0laRSAvIFNFQ1RPUl9TSVpFKQorCitzdGF0aWMgc3BpbmxvY2tfdCBfYnVmZmVyX2xv Y2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICpf YWxsX2J1ZmZlcnM7CitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICpfZnJlZV9idWZmZXJz OworCitzdGF0aWMgaW50IGluaXRfYnVmZmVycyh2b2lkKQoreworCWludCBpOworCXN0cnVj dCBidWZmZXJfaGVhZCAqYnVmZmVyczsKKworCWJ1ZmZlcnMgPSB2Y2FsbG9jKE5VTV9CVUZG RVJTLCBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkKSk7CisJaWYgKCFidWZmZXJzKSB7CisJ CURNV0FSTigiQ291bGRuJ3QgYWxsb2NhdGUgYnVmZmVyIGhlYWRzLiIpOworCQlyZXR1cm4g LUVOT01FTTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0JVRkZFUlM7IGkrKykgewor CQlpZiAoaSA8IE5VTV9CVUZGRVJTIC0gMSkKKwkJCWJ1ZmZlcnNbaV0uYl9yZXFuZXh0ID0g JmJ1ZmZlcnNbaSArIDFdOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZidWZmZXJzW2ldLmJf d2FpdCk7CisJCUlOSVRfTElTVF9IRUFEKCZidWZmZXJzW2ldLmJfaW5vZGVfYnVmZmVycyk7 CisJfQorCisJX2FsbF9idWZmZXJzID0gX2ZyZWVfYnVmZmVycyA9IGJ1ZmZlcnM7CisJcmV0 dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGV4aXRfYnVmZmVycyh2b2lkKQoreworCXZmcmVl KF9hbGxfYnVmZmVycyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmFsbG9j X2J1ZmZlcih2b2lkKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqcjsKKwlpbnQgZmxhZ3M7 CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmX2J1ZmZlcl9sb2NrLCBmbGFncyk7CisKKwlpZiAo IV9mcmVlX2J1ZmZlcnMpCisJCXIgPSBOVUxMOworCWVsc2UgeworCQlyID0gX2ZyZWVfYnVm ZmVyczsKKwkJX2ZyZWVfYnVmZmVycyA9IF9mcmVlX2J1ZmZlcnMtPmJfcmVxbmV4dDsKKwkJ ci0+Yl9yZXFuZXh0ID0gTlVMTDsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZf YnVmZmVyX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByOworfQorCisvKgorICogT25seSBj YWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dC4KKyAqLworc3RhdGljIHZvaWQgZnJlZV9i dWZmZXIoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpbnQgZmxhZ3MsIHdhc19lbXB0 eTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZfYnVmZmVyX2xvY2ssIGZsYWdzKTsKKwl3YXNf ZW1wdHkgPSAoX2ZyZWVfYnVmZmVycyA9PSBOVUxMKSA/IDEgOiAwOworCWJoLT5iX3JlcW5l eHQgPSBfZnJlZV9idWZmZXJzOworCV9mcmVlX2J1ZmZlcnMgPSBiaDsKKwlzcGluX3VubG9j a19pcnFyZXN0b3JlKCZfYnVmZmVyX2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogSWYgdGhl IGJ1ZmZlciBsaXN0IHdhcyBlbXB0eSB0aGVuIGtjb3B5ZCBwcm9iYWJseSB3ZW50CisJICog dG8gc2xlZXAgYmVjYXVzZSBpdCByYW4gb3V0IG9mIGJ1ZmZlciBoZWFkcywgc28gbGV0J3MK KwkgKiB3YWtlIGl0IHVwLgorCSAqLworCWlmICh3YXNfZW1wdHkpCisJCXdha2Vfa2NvcHlk KCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGtjb3B5ZF9qb2JzIG5lZWQgdG8gYmUgYWxs b2NhdGVkIGJ5IHRoZSAqY2xpZW50cyogb2Yga2NvcHlkLAorICogZm9yIHRoaXMgcmVhc29u IHdlIHVzZSBhIG1lbXBvb2wgdG8gcHJldmVudCB0aGUgY2xpZW50IGZyb20KKyAqIGV2ZXIg aGF2aW5nIHRvIGRvIGlvICh3aGljaCBjb3VsZCBjYXVzZSBhCisgKiBkZWFkbG9jaykuCisg Ki0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLSovCisjZGVmaW5lIE1JTl9KT0JTIE5VTV9QQUdFUworCitzdGF0aWMga21l bV9jYWNoZV90ICpfam9iX2NhY2hlID0gTlVMTDsKK3N0YXRpYyBtZW1wb29sX3QgKl9qb2Jf cG9vbCA9IE5VTEw7CisKKy8qCisgKiBXZSBtYWludGFpbiB0aHJlZSBsaXN0cyBvZiBqb2Jz OgorICoKKyAqIGkpICAgam9icyB3YWl0aW5nIGZvciBwYWdlcworICogaWkpICBqb2JzIHRo YXQgaGF2ZSBwYWdlcywgYW5kIGFyZSB3YWl0aW5nIGZvciB0aGUgaW8gdG8gYmUgaXNzdWVk LgorICogaWlpKSBqb2JzIHRoYXQgaGF2ZSBjb21wbGV0ZWQuCisgKgorICogQWxsIHRocmVl IG9mIHRoZXNlIGFyZSBwcm90ZWN0ZWQgYnkgam9iX2xvY2suCisgKi8KKworc3RhdGljIHNw aW5sb2NrX3QgX2pvYl9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworCitzdGF0aWMgTElT VF9IRUFEKF9jb21wbGV0ZV9qb2JzKTsKK3N0YXRpYyBMSVNUX0hFQUQoX2lvX2pvYnMpOwor c3RhdGljIExJU1RfSEVBRChfcGFnZXNfam9icyk7CisKK3N0YXRpYyBpbnQgaW5pdF9qb2Jz KHZvaWQpCit7CisJSU5JVF9MSVNUX0hFQUQoJl9jb21wbGV0ZV9qb2JzKTsKKwlJTklUX0xJ U1RfSEVBRCgmX2lvX2pvYnMpOworCUlOSVRfTElTVF9IRUFEKCZfcGFnZXNfam9icyk7CisK Kwlfam9iX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImtjb3B5ZC1qb2JzIiwgc2l6ZW9m KHN0cnVjdCBrY29weWRfam9iKSwKKwkJCQkgICAgICAgX19hbGlnbm9mX18oc3RydWN0IGtj b3B5ZF9qb2IpLAorCQkJCSAgICAgICAwLCBOVUxMLCBOVUxMKTsKKwlpZiAoIV9qb2JfY2Fj aGUpCisJCXJldHVybiAtRU5PTUVNOworCisJX2pvYl9wb29sID0gbWVtcG9vbF9jcmVhdGUo TUlOX0pPQlMsIG1lbXBvb2xfYWxsb2Nfc2xhYiwKKwkJCQkgICBtZW1wb29sX2ZyZWVfc2xh YiwgX2pvYl9jYWNoZSk7CisJaWYgKCFfam9iX3Bvb2wpIHsKKwkJa21lbV9jYWNoZV9kZXN0 cm95KF9qb2JfY2FjaGUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsK K30KKworc3RhdGljIHZvaWQgZXhpdF9qb2JzKHZvaWQpCit7CisJbWVtcG9vbF9kZXN0cm95 KF9qb2JfcG9vbCk7CisJa21lbV9jYWNoZV9kZXN0cm95KF9qb2JfY2FjaGUpOworfQorCitz dHJ1Y3Qga2NvcHlkX2pvYiAqa2NvcHlkX2FsbG9jX2pvYih2b2lkKQoreworCXN0cnVjdCBr Y29weWRfam9iICpqb2I7CisKKwlqb2IgPSBtZW1wb29sX2FsbG9jKF9qb2JfcG9vbCwgR0ZQ X05PSU8pOworCWlmICgham9iKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbXNldChqb2IsIDAs IHNpemVvZigqam9iKSk7CisJcmV0dXJuIGpvYjsKK30KKwordm9pZCBrY29weWRfZnJlZV9q b2Ioc3RydWN0IGtjb3B5ZF9qb2IgKmpvYikKK3sKKwltZW1wb29sX2ZyZWUoam9iLCBfam9i X3Bvb2wpOworfQorCisvKgorICogRnVuY3Rpb25zIHRvIHB1c2ggYW5kIHBvcCBhIGpvYiBv bnRvIHRoZSBoZWFkIG9mIGEgZ2l2ZW4gam9iCisgKiBsaXN0LgorICovCitzdGF0aWMgaW5s aW5lIHN0cnVjdCBrY29weWRfam9iICpwb3Aoc3RydWN0IGxpc3RfaGVhZCAqam9icykKK3sK KwlzdHJ1Y3Qga2NvcHlkX2pvYiAqam9iID0gTlVMTDsKKwlpbnQgZmxhZ3M7CisKKwlzcGlu X2xvY2tfaXJxc2F2ZSgmX2pvYl9sb2NrLCBmbGFncyk7CisKKwlpZiAoIWxpc3RfZW1wdHko am9icykpIHsKKwkJam9iID0gbGlzdF9lbnRyeShqb2JzLT5uZXh0LCBzdHJ1Y3Qga2NvcHlk X2pvYiwgbGlzdCk7CisJCWxpc3RfZGVsKCZqb2ItPmxpc3QpOworCX0KKwlzcGluX3VubG9j a19pcnFyZXN0b3JlKCZfam9iX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBqb2I7Cit9CisK K3N0YXRpYyBpbmxpbmUgdm9pZCBwdXNoKHN0cnVjdCBsaXN0X2hlYWQgKmpvYnMsIHN0cnVj dCBrY29weWRfam9iICpqb2IpCit7CisJaW50IGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNh dmUoJl9qb2JfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkKCZqb2ItPmxpc3QsIGpvYnMpOwor CXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJl9qb2JfbG9jaywgZmxhZ3MpOworfQorCisvKgor ICogQ29tcGxldGlvbiBmdW5jdGlvbiBmb3Igb25lIG9mIG91ciBidWZmZXJzLgorICovCitz dGF0aWMgdm9pZCBlbmRfYmgoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHVwdG9kYXRl KQoreworCXN0cnVjdCBrY29weWRfam9iICpqb2IgPSBiaC0+Yl9wcml2YXRlOworCisJbWFy a19idWZmZXJfdXB0b2RhdGUoYmgsIHVwdG9kYXRlKTsKKwl1bmxvY2tfYnVmZmVyKGJoKTsK KworCWlmICghdXB0b2RhdGUpCisJCWpvYi0+ZXJyID0gLUVJTzsKKworCS8qIGFyZSB3ZSB0 aGUgbGFzdCA/ICovCisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmpvYi0+bnJfaW5jb21w bGV0ZSkpIHsKKwkJcHVzaCgmX2NvbXBsZXRlX2pvYnMsIGpvYik7CisJCXdha2Vfa2NvcHlk KCk7CisJfQorCisJZnJlZV9idWZmZXIoYmgpOworfQorCitzdGF0aWMgdm9pZCBkaXNwYXRj aF9iaChzdHJ1Y3Qga2NvcHlkX2pvYiAqam9iLAorCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpi aCwgaW50IGJsb2NrKQoreworCWludCBwOworCisJLyoKKwkgKiBBZGQgaW4gdGhlIGpvYiBv ZmZzZXQKKwkgKi8KKwliaC0+Yl9ibG9ja25yID0gKGpvYi0+ZGlzay5zZWN0b3IgPj4gam9i LT5ibG9ja19zaGlmdCkgKyBibG9jazsKKworCXAgPSBibG9jayA+PiBqb2ItPmJwcF9zaGlm dDsKKwlibG9jayAmPSBqb2ItPmJwcF9tYXNrOworCisJYmgtPmJfZGV2ID0gQl9GUkVFOwor CWJoLT5iX3NpemUgPSBqb2ItPmJsb2NrX3NpemU7CisJc2V0X2JoX3BhZ2UoYmgsIGpvYi0+ cGFnZXNbcF0sICgoYmxvY2sgPDwgam9iLT5ibG9ja19zaGlmdCkgKworCQkJCQlqb2ItPm9m ZnNldCkgPDwgU0VDVE9SX1NISUZUKTsKKwliaC0+Yl90aGlzX3BhZ2UgPSBiaDsKKworCWlu aXRfYnVmZmVyKGJoLCBlbmRfYmgsIGpvYik7CisKKwliaC0+Yl9kZXYgPSBqb2ItPmRpc2su ZGV2OworCWJoLT5iX3N0YXRlID0gKCgxIDw8IEJIX01hcHBlZCkgfCAoMSA8PCBCSF9Mb2Nr KSB8ICgxIDw8IEJIX1JlcSkpOworCisJc2V0X2JpdChCSF9VcHRvZGF0ZSwgJmJoLT5iX3N0 YXRlKTsKKwlpZiAoam9iLT5ydyA9PSBXUklURSkKKwkJY2xlYXJfYml0KEJIX0RpcnR5LCAm YmgtPmJfc3RhdGUpOworCisJc3VibWl0X2JoKGpvYi0+cncsIGJoKTsKK30KKworLyoKKyAq IFRoZXNlIHRocmVlIGZ1bmN0aW9ucyBwcm9jZXNzIDEgaXRlbSBmcm9tIHRoZSBjb3JyZXNw b25kaW5nCisgKiBqb2IgbGlzdC4KKyAqCisgKiBUaGV5IHJldHVybjoKKyAqIDwgMDogZXJy b3IKKyAqICAgMDogc3VjY2VzcworICogPiAwOiBjYW4ndCBwcm9jZXNzIHlldC4KKyAqLwor c3RhdGljIGludCBydW5fY29tcGxldGVfam9iKHN0cnVjdCBrY29weWRfam9iICpqb2IpCit7 CisJam9iLT5jYWxsYmFjayhqb2IpOworCXJldHVybiAwOworfQorCisvKgorICogUmVxdWVz dCBpbyBvbiBhcyBtYW55IGJ1ZmZlciBoZWFkcyBhcyB3ZSBjYW4gY3VycmVudGx5IGdldCBm b3IKKyAqIGEgcGFydGljdWxhciBqb2IuCisgKi8KK3N0YXRpYyBpbnQgcnVuX2lvX2pvYihz dHJ1Y3Qga2NvcHlkX2pvYiAqam9iKQoreworCXVuc2lnbmVkIGludCBibG9jazsKKwlzdHJ1 Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJZm9yIChibG9jayA9IGF0b21pY19yZWFkKCZqb2It Pm5yX3JlcXVlc3RlZCk7CisJICAgICBibG9jayA8IGpvYi0+bnJfYmxvY2tzOyBibG9jaysr KSB7CisJCWJoID0gYWxsb2NfYnVmZmVyKCk7CisJCWlmICghYmgpCisJCQlicmVhazsKKwor CQlhdG9taWNfaW5jKCZqb2ItPm5yX3JlcXVlc3RlZCk7CisJCWRpc3BhdGNoX2JoKGpvYiwg YmgsIGJsb2NrKTsKKwl9CisKKwlyZXR1cm4gKGJsb2NrID09IGpvYi0+bnJfYmxvY2tzKSA/ IDAgOiAxOworfQorCitzdGF0aWMgaW50IHJ1bl9wYWdlc19qb2Ioc3RydWN0IGtjb3B5ZF9q b2IgKmpvYikKK3sKKwlpbnQgcjsKKworCWpvYi0+bnJfcGFnZXMgPSAoam9iLT5kaXNrLmNv dW50ICsgam9iLT5vZmZzZXQpIC8KKwkgICAgKFBBR0VfU0laRSAvIFNFQ1RPUl9TSVpFKTsK KwlyID0ga2NvcHlkX2dldF9wYWdlcyhqb2ItPm5yX3BhZ2VzLCBqb2ItPnBhZ2VzKTsKKwor CWlmICghcikgeworCQkvKiB0aGlzIGpvYiBpcyByZWFkeSBmb3IgaW8gKi8KKwkJcHVzaCgm X2lvX2pvYnMsIGpvYik7CisJCXJldHVybiAwOworCX0KKworCWlmIChyID09IC1FTk9NRU0p CisJCS8qIGNhbiBjb21wbGV0ZSBub3cgKi8KKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gcjsK K30KKworLyoKKyAqIFJ1biB0aHJvdWdoIGEgbGlzdCBmb3IgYXMgbG9uZyBhcyBwb3NzaWJs ZS4gIFJldHVybnMgdGhlIGNvdW50CisgKiBvZiBzdWNjZXNzZnVsIGpvYnMuCisgKi8KK3N0 YXRpYyBpbnQgcHJvY2Vzc19qb2JzKHN0cnVjdCBsaXN0X2hlYWQgKmpvYnMsIGludCAoKmZu KSAoc3RydWN0IGtjb3B5ZF9qb2IgKikpCit7CisJc3RydWN0IGtjb3B5ZF9qb2IgKmpvYjsK KwlpbnQgciwgY291bnQgPSAwOworCisJd2hpbGUgKChqb2IgPSBwb3Aoam9icykpKSB7CisK KwkJciA9IGZuKGpvYik7CisKKwkJaWYgKHIgPCAwKSB7CisJCQkvKiBlcnJvciB0aGlzIHJv Z3VlIGpvYiAqLworCQkJam9iLT5lcnIgPSByOworCQkJcHVzaCgmX2NvbXBsZXRlX2pvYnMs IGpvYik7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChyID4gMCkgeworCQkJLyoKKwkJCSAq IFdlIGNvdWxkbid0IHNlcnZpY2UgdGhpcyBqb2IgQVRNLCBzbworCQkJICogcHVzaCB0aGlz IGpvYiBiYWNrIG9udG8gdGhlIGxpc3QuCisJCQkgKi8KKwkJCXB1c2goam9icywgam9iKTsK KwkJCWJyZWFrOworCQl9CisKKwkJY291bnQrKzsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9 CisKKy8qCisgKiBrY29weWQgZG9lcyB0aGlzIGV2ZXJ5IHRpbWUgaXQncyB3b2tlbiB1cC4K KyAqLworc3RhdGljIHZvaWQgZG9fd29yayh2b2lkKQoreworCWludCBjb3VudDsKKworCS8q CisJICogV2UgbG9vcCByb3VuZCB1bnRpbCB0aGVyZSBpcyBubyBtb3JlIHdvcmsgdG8gZG8u CisJICovCisJZG8geworCQljb3VudCA9IHByb2Nlc3Nfam9icygmX2NvbXBsZXRlX2pvYnMs IHJ1bl9jb21wbGV0ZV9qb2IpOworCQljb3VudCArPSBwcm9jZXNzX2pvYnMoJl9pb19qb2Jz LCBydW5faW9fam9iKTsKKwkJY291bnQgKz0gcHJvY2Vzc19qb2JzKCZfcGFnZXNfam9icywg cnVuX3BhZ2VzX2pvYik7CisKKwl9IHdoaWxlIChjb3VudCk7CisKKwlydW5fdGFza19xdWV1 ZSgmdHFfZGlzayk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoZSBkYWVtb24KKyAqLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tKi8KK3N0YXRpYyBhdG9taWNfdCBfa2NvcHlkX211c3RfZGllOworc3RhdGljIERF Q0xBUkVfTVVURVgoX3J1bl9sb2NrKTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVB RChfam9iX3F1ZXVlKTsKKworc3RhdGljIGludCBrY29weWQodm9pZCAqYXJnKQoreworCURF Q0xBUkVfV0FJVFFVRVVFKHdxLCBjdXJyZW50KTsKKworCWRhZW1vbml6ZSgpOworCXN0cmNw eShjdXJyZW50LT5jb21tLCAia2NvcHlkIik7CisJYXRvbWljX3NldCgmX2tjb3B5ZF9tdXN0 X2RpZSwgMCk7CisKKwlhZGRfd2FpdF9xdWV1ZSgmX2pvYl9xdWV1ZSwgJndxKTsKKworCWRv d24oJl9ydW5fbG9jayk7CisJdXAoJnN0YXJ0X2xvY2spOworCisJd2hpbGUgKDEpIHsKKwkJ c2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCQlpZiAoYXRvbWlj X3JlYWQoJl9rY29weWRfbXVzdF9kaWUpKQorCQkJYnJlYWs7CisKKwkJZG9fd29yaygpOwor CQlzY2hlZHVsZSgpOworCX0KKworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7 CisJcmVtb3ZlX3dhaXRfcXVldWUoJl9qb2JfcXVldWUsICZ3cSk7CisKKwl1cCgmX3J1bl9s b2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0YXJ0X2RhZW1vbih2b2lk KQoreworCXN0YXRpYyBwaWRfdCBwaWQgPSAwOworCisJZG93bigmc3RhcnRfbG9jayk7CisK KwlwaWQgPSBrZXJuZWxfdGhyZWFkKGtjb3B5ZCwgTlVMTCwgMCk7CisJaWYgKHBpZCA8PSAw KSB7CisJCURNRVJSKCJGYWlsZWQgdG8gc3RhcnQga2NvcHlkIHRocmVhZCIpOworCQlyZXR1 cm4gLUVBR0FJTjsKKwl9CisKKwkvKgorCSAqIHdhaXQgZm9yIHRoZSBkYWVtb24gdG8gdXAg dGhpcyBtdXRleC4KKwkgKi8KKwlkb3duKCZzdGFydF9sb2NrKTsKKwl1cCgmc3RhcnRfbG9j ayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdG9wX2RhZW1vbih2b2lkKQor eworCWF0b21pY19zZXQoJl9rY29weWRfbXVzdF9kaWUsIDEpOworCXdha2Vfa2NvcHlkKCk7 CisJZG93bigmX3J1bl9sb2NrKTsKKwl1cCgmX3J1bl9sb2NrKTsKKworCXJldHVybiAwOwor fQorCitzdGF0aWMgdm9pZCB3YWtlX2tjb3B5ZCh2b2lkKQoreworCXdha2VfdXBfaW50ZXJy dXB0aWJsZSgmX2pvYl9xdWV1ZSk7Cit9CisKK3N0YXRpYyBpbnQgY2FsY19zaGlmdCh1bnNp Z25lZCBpbnQgbikKK3sKKwlpbnQgczsKKworCWZvciAocyA9IDA7IG47IHMrKywgbiA+Pj0g MSkKKwkJOworCisJcmV0dXJuIC0tczsKK30KKworc3RhdGljIHZvaWQgY2FsY19ibG9ja19z aXplcyhzdHJ1Y3Qga2NvcHlkX2pvYiAqam9iKQoreworCWpvYi0+YmxvY2tfc2l6ZSA9IGdl dF9oYXJkc2VjdF9zaXplKGpvYi0+ZGlzay5kZXYpOworCWpvYi0+YmxvY2tfc2hpZnQgPSBj YWxjX3NoaWZ0KGpvYi0+YmxvY2tfc2l6ZSAvIFNFQ1RPUl9TSVpFKTsKKwlqb2ItPmJwcF9z aGlmdCA9IFBBR0VfU0hJRlQgLSBqb2ItPmJsb2NrX3NoaWZ0IC0gU0VDVE9SX1NISUZUOwor CWpvYi0+YnBwX21hc2sgPSAoMSA8PCBqb2ItPmJwcF9zaGlmdCkgLSAxOworCWpvYi0+bnJf YmxvY2tzID0gam9iLT5kaXNrLmNvdW50ID4+IGpvYi0+YmxvY2tfc2hpZnQ7CisJYXRvbWlj X3NldCgmam9iLT5ucl9yZXF1ZXN0ZWQsIDApOworCWF0b21pY19zZXQoJmpvYi0+bnJfaW5j b21wbGV0ZSwgam9iLT5ucl9ibG9ja3MpOworfQorCitpbnQga2NvcHlkX2lvKHN0cnVjdCBr Y29weWRfam9iICpqb2IpCit7CisJY2FsY19ibG9ja19zaXplcyhqb2IpOworCXB1c2goam9i LT5wYWdlc1swXSA/ICZfaW9fam9icyA6ICZfcGFnZXNfam9icywgam9iKTsKKwl3YWtlX2tj b3B5ZCgpOworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGUgY29waWVy IGlzIGltcGxlbWVudGVkIG9uIHRvcCBvZiB0aGUgc2ltcGxlciBhc3luYyBpbworICogZGFl bW9uIGFib3ZlLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RydWN0IGNvcHlfaW5mbyB7CisJa2NvcHlk X25vdGlmeV9mbiBub3RpZnk7CisJdm9pZCAqbm90aWZ5X2NvbnRleHQ7CisKKwlzdHJ1Y3Qg a2NvcHlkX3JlZ2lvbiB0bzsKK307CisKKyNkZWZpbmUgTUlOX0lORk9TIDEyOAorc3RhdGlj IGttZW1fY2FjaGVfdCAqX2NvcHlfY2FjaGUgPSBOVUxMOworc3RhdGljIG1lbXBvb2xfdCAq X2NvcHlfcG9vbCA9IE5VTEw7CisKK3N0YXRpYyBpbnQgaW5pdF9jb3BpZXIodm9pZCkKK3sK KwlfY29weV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJrY29weWQtaW5mbyIsCisJCQkJ CXNpemVvZihzdHJ1Y3QgY29weV9pbmZvKSwKKwkJCQkJX19hbGlnbm9mX18oc3RydWN0IGNv cHlfaW5mbyksCisJCQkJCTAsIE5VTEwsIE5VTEwpOworCWlmICghX2NvcHlfY2FjaGUpCisJ CXJldHVybiAtRU5PTUVNOworCisJX2NvcHlfcG9vbCA9IG1lbXBvb2xfY3JlYXRlKE1JTl9J TkZPUywgbWVtcG9vbF9hbGxvY19zbGFiLAorCQkJCSAgICBtZW1wb29sX2ZyZWVfc2xhYiwg X2NvcHlfY2FjaGUpOworCWlmICghX2NvcHlfcG9vbCkgeworCQlrbWVtX2NhY2hlX2Rlc3Ry b3koX2NvcHlfY2FjaGUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsK K30KKworc3RhdGljIHZvaWQgZXhpdF9jb3BpZXIodm9pZCkKK3sKKwlpZiAoX2NvcHlfcG9v bCkKKwkJbWVtcG9vbF9kZXN0cm95KF9jb3B5X3Bvb2wpOworCisJaWYgKF9jb3B5X2NhY2hl KQorCQlrbWVtX2NhY2hlX2Rlc3Ryb3koX2NvcHlfY2FjaGUpOworfQorCitzdGF0aWMgaW5s aW5lIHN0cnVjdCBjb3B5X2luZm8gKmFsbG9jX2NvcHlfaW5mbyh2b2lkKQoreworCXJldHVy biBtZW1wb29sX2FsbG9jKF9jb3B5X3Bvb2wsIEdGUF9OT0lPKTsKK30KKworc3RhdGljIGlu bGluZSB2b2lkIGZyZWVfY29weV9pbmZvKHN0cnVjdCBjb3B5X2luZm8gKmluZm8pCit7CisJ bWVtcG9vbF9mcmVlKGluZm8sIF9jb3B5X3Bvb2wpOworfQorCit2b2lkIGNvcHlfY29tcGxl dGUoc3RydWN0IGtjb3B5ZF9qb2IgKmpvYikKK3sKKwlzdHJ1Y3QgY29weV9pbmZvICppbmZv ID0gKHN0cnVjdCBjb3B5X2luZm8gKikgam9iLT5jb250ZXh0OworCisJaWYgKGluZm8tPm5v dGlmeSkKKwkJaW5mby0+bm90aWZ5KGpvYi0+ZXJyLCBpbmZvLT5ub3RpZnlfY29udGV4dCk7 CisKKwlmcmVlX2NvcHlfaW5mbyhpbmZvKTsKKworCWtjb3B5ZF9mcmVlX3BhZ2VzKGpvYi0+ bnJfcGFnZXMsIGpvYi0+cGFnZXMpOworCisJa2NvcHlkX2ZyZWVfam9iKGpvYik7Cit9CisK K3N0YXRpYyB2b2lkIHBhZ2Vfd3JpdGVfY29tcGxldGUoc3RydWN0IGtjb3B5ZF9qb2IgKmpv YikKK3sKKwlzdHJ1Y3QgY29weV9pbmZvICppbmZvID0gKHN0cnVjdCBjb3B5X2luZm8gKikg am9iLT5jb250ZXh0OworCWludCBpOworCisJaWYgKGluZm8tPm5vdGlmeSkKKwkJaW5mby0+ bm90aWZ5KGpvYi0+ZXJyLCBpbmZvLT5ub3RpZnlfY29udGV4dCk7CisKKwlmcmVlX2NvcHlf aW5mbyhpbmZvKTsKKwlmb3IgKGkgPSAwOyBpIDwgam9iLT5ucl9wYWdlczsgaSsrKQorCQlw dXRfcGFnZShqb2ItPnBhZ2VzW2ldKTsKKworCWtjb3B5ZF9mcmVlX2pvYihqb2IpOworfQor CisvKgorICogVGhlc2UgY2FsbGJhY2sgZnVuY3Rpb25zIGltcGxlbWVudCB0aGUgc3RhdGUg bWFjaGluZSB0aGF0IGNvcGllcyByZWdpb25zLgorICovCit2b2lkIGNvcHlfd3JpdGUoc3Ry dWN0IGtjb3B5ZF9qb2IgKmpvYikKK3sKKwlzdHJ1Y3QgY29weV9pbmZvICppbmZvID0gKHN0 cnVjdCBjb3B5X2luZm8gKikgam9iLT5jb250ZXh0OworCisJaWYgKGpvYi0+ZXJyICYmIGlu Zm8tPm5vdGlmeSkgeworCQlpbmZvLT5ub3RpZnkoam9iLT5lcnIsIGpvYi0+Y29udGV4dCk7 CisJCWtjb3B5ZF9mcmVlX2pvYihqb2IpOworCQlmcmVlX2NvcHlfaW5mbyhpbmZvKTsKKwkJ cmV0dXJuOworCX0KKworCWpvYi0+cncgPSBXUklURTsKKwltZW1jcHkoJmpvYi0+ZGlzaywg JmluZm8tPnRvLCBzaXplb2Yoam9iLT5kaXNrKSk7CisJam9iLT5jYWxsYmFjayA9IGNvcHlf Y29tcGxldGU7CisJam9iLT5jb250ZXh0ID0gaW5mbzsKKworCS8qCisJICogUXVldWUgdGhl IHdyaXRlLgorCSAqLworCWtjb3B5ZF9pbyhqb2IpOworfQorCitpbnQga2NvcHlkX3dyaXRl X3BhZ2VzKHN0cnVjdCBrY29weWRfcmVnaW9uICp0bywgaW50IG5yX3BhZ2VzLAorCQkgICAg ICAgc3RydWN0IHBhZ2UgKipwYWdlcywgaW50IG9mZnNldCwga2NvcHlkX25vdGlmeV9mbiBm biwKKwkJICAgICAgIHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IGNvcHlfaW5mbyAqaW5m bzsKKwlzdHJ1Y3Qga2NvcHlkX2pvYiAqam9iOworCWludCBpOworCisJLyoKKwkgKiBBbGxv Y2F0ZSBhIG5ldyBjb3B5X2luZm8uCisJICovCisJaW5mbyA9IGFsbG9jX2NvcHlfaW5mbygp OworCWlmICghaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlqb2IgPSBrY29weWRfYWxs b2Nfam9iKCk7CisJaWYgKCFqb2IpIHsKKwkJZnJlZV9jb3B5X2luZm8oaW5mbyk7CisJCXJl dHVybiAtRU5PTUVNOworCX0KKworCS8qCisJICogc2V0IHVwIGZvciB0aGUgd3JpdGUuCisJ ICovCisJaW5mby0+bm90aWZ5ID0gZm47CisJaW5mby0+bm90aWZ5X2NvbnRleHQgPSBjb250 ZXh0OworCW1lbWNweSgmaW5mby0+dG8sIHRvLCBzaXplb2YoKnRvKSk7CisKKwkvKiBHZXQg dGhlIHBhZ2VzICovCisJam9iLT5ucl9wYWdlcyA9IG5yX3BhZ2VzOworCWZvciAoaSA9IDA7 IGkgPCBucl9wYWdlczsgaSsrKSB7CisJCWdldF9wYWdlKHBhZ2VzW2ldKTsKKwkJam9iLT5w YWdlc1tpXSA9IHBhZ2VzW2ldOworCX0KKworCWpvYi0+cncgPSBXUklURTsKKworCW1lbWNw eSgmam9iLT5kaXNrLCAmaW5mby0+dG8sIHNpemVvZihqb2ItPmRpc2spKTsKKwlqb2ItPm9m ZnNldCA9IG9mZnNldDsKKwljYWxjX2Jsb2NrX3NpemVzKGpvYik7CisJam9iLT5jYWxsYmFj ayA9IHBhZ2Vfd3JpdGVfY29tcGxldGU7CisJam9iLT5jb250ZXh0ID0gaW5mbzsKKworCS8q CisJICogVHJpZ2dlciBqb2IuCisJICovCisJa2NvcHlkX2lvKGpvYik7CisJcmV0dXJuIDA7 Cit9CisKK2ludCBrY29weWRfY29weShzdHJ1Y3Qga2NvcHlkX3JlZ2lvbiAqZnJvbSwgc3Ry dWN0IGtjb3B5ZF9yZWdpb24gKnRvLAorCQlrY29weWRfbm90aWZ5X2ZuIGZuLCB2b2lkICpj b250ZXh0KQoreworCXN0cnVjdCBjb3B5X2luZm8gKmluZm87CisJc3RydWN0IGtjb3B5ZF9q b2IgKmpvYjsKKworCS8qCisJICogQWxsb2NhdGUgYSBuZXcgY29weV9pbmZvLgorCSAqLwor CWluZm8gPSBhbGxvY19jb3B5X2luZm8oKTsKKwlpZiAoIWluZm8pCisJCXJldHVybiAtRU5P TUVNOworCisJam9iID0ga2NvcHlkX2FsbG9jX2pvYigpOworCWlmICgham9iKSB7CisJCWZy ZWVfY29weV9pbmZvKGluZm8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKgorCSAq IHNldCB1cCBmb3IgdGhlIHJlYWQuCisJICovCisJaW5mby0+bm90aWZ5ID0gZm47CisJaW5m by0+bm90aWZ5X2NvbnRleHQgPSBjb250ZXh0OworCW1lbWNweSgmaW5mby0+dG8sIHRvLCBz aXplb2YoKnRvKSk7CisKKwlqb2ItPnJ3ID0gUkVBRDsKKwltZW1jcHkoJmpvYi0+ZGlzaywg ZnJvbSwgc2l6ZW9mKCpmcm9tKSk7CisKKwlqb2ItPm9mZnNldCA9IDA7CisJY2FsY19ibG9j a19zaXplcyhqb2IpOworCWpvYi0+Y2FsbGJhY2sgPSBjb3B5X3dyaXRlOworCWpvYi0+Y29u dGV4dCA9IGluZm87CisKKwkvKgorCSAqIFRyaWdnZXIgam9iLgorCSAqLworCWtjb3B5ZF9p byhqb2IpOworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBVbml0IHNldHVw CisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLSovCitzdGF0aWMgc3RydWN0IHsKKwlpbnQgKCppbml0KSAodm9pZCk7 CisJdm9pZCAoKmV4aXQpICh2b2lkKTsKKworfSBfaW5pdHNbXSA9IHsKKyNkZWZpbmUgeHgo bikgeyBpbml0XyAjIyBuLCBleGl0XyAjIyBufQorCXh4KHBhZ2VzKSwKKwl4eChidWZmZXJz KSwKKwl4eChqb2JzKSwKKwl4eChjb3BpZXIpCisjdW5kZWYgeHgKK307CisKK3N0YXRpYyBp bnQgX2NsaWVudF9jb3VudCA9IDA7CitzdGF0aWMgREVDTEFSRV9NVVRFWChfY2xpZW50X2Nv dW50X3NlbSk7CisKK3N0YXRpYyBpbnQga2NvcHlkX2luaXQodm9pZCkKK3sKKwljb25zdCBp bnQgY291bnQgPSBzaXplb2YoX2luaXRzKSAvIHNpemVvZigqX2luaXRzKTsKKworCWludCBy LCBpOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJciA9IF9pbml0c1tp XS5pbml0KCk7CisJCWlmIChyKQorCQkJZ290byBiYWQ7CisJfQorCisJc3RhcnRfZGFlbW9u KCk7CisJcmV0dXJuIDA7CisKKyAgICAgIGJhZDoKKwl3aGlsZSAoaS0tKQorCQlfaW5pdHNb aV0uZXhpdCgpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIGtjb3B5ZF9leGl0 KHZvaWQpCit7CisJaW50IGkgPSBzaXplb2YoX2luaXRzKSAvIHNpemVvZigqX2luaXRzKTsK KworCWlmIChzdG9wX2RhZW1vbigpKQorCQlETVdBUk4oIkNvdWxkbid0IHN0b3Aga2NvcHlk LiIpOworCisJd2hpbGUgKGktLSkKKwkJX2luaXRzW2ldLmV4aXQoKTsKK30KKwordm9pZCBr Y29weWRfaW5jX2NsaWVudF9jb3VudCh2b2lkKQoreworCS8qCisJICogV2hhdCBJIG5lZWQg aGVyZSBpcyBhbiBhdG9taWNfdGVzdF9hbmRfaW5jIHRoYXQgcmV0dXJucworCSAqIHRoZSBw cmV2aW91cyB2YWx1ZSBvZiB0aGUgYXRvbWljLi4uICBJbiBpdHMgYWJzZW5jZSBJIGxvY2sK KwkgKiBhbiBpbnQgd2l0aCBhIHNlbWFwaG9yZS4gOi0oCisJICovCisJZG93bigmX2NsaWVu dF9jb3VudF9zZW0pOworCWlmIChfY2xpZW50X2NvdW50ID09IDApCisJCWtjb3B5ZF9pbml0 KCk7CisJX2NsaWVudF9jb3VudCsrOworCisJdXAoJl9jbGllbnRfY291bnRfc2VtKTsKK30K Kwordm9pZCBrY29weWRfZGVjX2NsaWVudF9jb3VudCh2b2lkKQoreworCWRvd24oJl9jbGll bnRfY291bnRfc2VtKTsKKwlpZiAoLS1fY2xpZW50X2NvdW50ID09IDApCisJCWtjb3B5ZF9l eGl0KCk7CisKKwl1cCgmX2NsaWVudF9jb3VudF9zZW0pOworfQotLS0gZGlmZi9kcml2ZXJz L21kL2tjb3B5ZC5oCTE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCisrKyBz b3VyY2UvZHJpdmVycy9tZC9rY29weWQuaAkyMDAyLTExLTI5IDA5OjQ0OjU5LjAwMDAwMDAw MCArMDAwMApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBT aXN0aW5hIFNvZnR3YXJlCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRo ZSBHUEwuCisgKi8KKworI2lmbmRlZiBETV9LQ09QWURfSAorI2RlZmluZSBETV9LQ09QWURf SAorCisvKgorICogTmVlZGVkIGZvciB0aGUgZGVmaW5pdGlvbiBvZiBvZmZzZXRfdC4KKyAq LworI2luY2x1ZGUgPGxpbnV4L2RldmljZS1tYXBwZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9p b2J1Zi5oPgorCitzdHJ1Y3Qga2NvcHlkX3JlZ2lvbiB7CisJa2Rldl90IGRldjsKKwlzZWN0 b3JfdCBzZWN0b3I7CisJc2VjdG9yX3QgY291bnQ7Cit9OworCisjZGVmaW5lIE1BWF9LQ09Q WURfUEFHRVMgMTI4CisKK3N0cnVjdCBrY29weWRfam9iIHsKKwlzdHJ1Y3QgbGlzdF9oZWFk IGxpc3Q7CisKKwkvKgorCSAqIEVycm9yIHN0YXRlIG9mIHRoZSBqb2IuCisJICovCisJaW50 IGVycjsKKworCS8qCisJICogRWl0aGVyIFJFQUQgb3IgV1JJVEUKKwkgKi8KKwlpbnQgcnc7 CisKKwkvKgorCSAqIFRoZSBzb3VyY2Ugb3IgZGVzdGluYXRpb24gZm9yIHRoZSB0cmFuc2Zl ci4KKwkgKi8KKwlzdHJ1Y3Qga2NvcHlkX3JlZ2lvbiBkaXNrOworCisJaW50IG5yX3BhZ2Vz OworCXN0cnVjdCBwYWdlICpwYWdlc1tNQVhfS0NPUFlEX1BBR0VTXTsKKworCS8qCisJICog U2hpZnRzIGFuZCBtYXNrcyB0aGF0IHdpbGwgYmUgdXNlZnVsIHdoZW4gZGlzcGF0Y2hpbmcK KwkgKiBlYWNoIGJ1ZmZlcl9oZWFkLgorCSAqLworCXNlY3Rvcl90IG9mZnNldDsKKwlzZWN0 b3JfdCBibG9ja19zaXplOworCXNlY3Rvcl90IGJsb2NrX3NoaWZ0OworCXNlY3Rvcl90IGJw cF9zaGlmdDsJLyogYmxvY2tzIHBlciBwYWdlICovCisJc2VjdG9yX3QgYnBwX21hc2s7CisK KwkvKgorCSAqIG5yX2Jsb2NrcyBpcyBob3cgbWFueSBidWZmZXIgaGVhZHMgd2lsbCBoYXZl IHRvIGJlCisJICogZGlzcGxhdGNoZWQgdG8gc2VydmljZSB0aGlzIGpvYiwgbnJfcmVxdWVz dGVkIGlzIGhvdworCSAqIG1hbnkgaGF2ZSBiZWVuIGRpc3BhdGNoZWQgYW5kIG5yX2NvbXBs ZXRlIGlzIGhvdyBtYW55CisJICogaGF2ZSBjb21lIGJhY2suCisJICovCisJdW5zaWduZWQg aW50IG5yX2Jsb2NrczsKKwlhdG9taWNfdCBucl9yZXF1ZXN0ZWQ7CisJYXRvbWljX3QgbnJf aW5jb21wbGV0ZTsKKworCS8qCisJICogU2V0IHRoaXMgdG8gZW5zdXJlIHlvdSBhcmUgbm90 aWZpZWQgd2hlbiB0aGUgam9iIGhhcworCSAqIGNvbXBsZXRlZC4gICdjb250ZXh0JyBpcyBm b3IgY2FsbGJhY2sgdG8gdXNlLgorCSAqLworCXZvaWQgKCpjYWxsYmFjaykoc3RydWN0IGtj b3B5ZF9qb2IgKmpvYik7CisJdm9pZCAqY29udGV4dDsKK307CisKKy8qCisgKiBMb3cgbGV2 ZWwgYXN5bmMgaW8gcm91dGluZXMuCisgKi8KK3N0cnVjdCBrY29weWRfam9iICprY29weWRf YWxsb2Nfam9iKHZvaWQpOwordm9pZCBrY29weWRfZnJlZV9qb2Ioc3RydWN0IGtjb3B5ZF9q b2IgKmpvYik7CisKK2ludCBrY29weWRfcXVldWVfam9iKHN0cnVjdCBrY29weWRfam9iICpq b2IpOworCisvKgorICogU3VibWl0IGEgY29weSBqb2IgdG8ga2NvcHlkLiAgVGhpcyBpcyBi dWlsdCBvbiB0b3Agb2YgdGhlCisgKiBwcmV2aW91cyB0aHJlZSBmbnMuCisgKi8KK3R5cGVk ZWYgdm9pZCAoKmtjb3B5ZF9ub3RpZnlfZm4pKGludCBlcnIsIHZvaWQgKmNvbnRleHQpOwor CitpbnQga2NvcHlkX2NvcHkoc3RydWN0IGtjb3B5ZF9yZWdpb24gKmZyb20sIHN0cnVjdCBr Y29weWRfcmVnaW9uICp0bywKKwkJa2NvcHlkX25vdGlmeV9mbiBmbiwgdm9pZCAqY29udGV4 dCk7CisKK2ludCBrY29weWRfd3JpdGVfcGFnZXMoc3RydWN0IGtjb3B5ZF9yZWdpb24gKnRv LCBpbnQgbnJfcGFnZXMsCisJCSAgICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBpbnQgb2Zm c2V0LCBrY29weWRfbm90aWZ5X2ZuIGZuLAorCQkgICAgICAgdm9pZCAqY29udGV4dCk7CisK Ky8qCisgKiBXZSBvbmx5IHdhbnQga2NvcHlkIHRvIHJlc2VydmUgcmVzb3VyY2VzIGlmIHNv bWVvbmUgaXMKKyAqIGFjdHVhbGx5IHVzaW5nIGl0LgorICovCit2b2lkIGtjb3B5ZF9pbmNf Y2xpZW50X2NvdW50KHZvaWQpOwordm9pZCBrY29weWRfZGVjX2NsaWVudF9jb3VudCh2b2lk KTsKKworI2VuZGlmCi0tLSBkaWZmL2luY2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oCTE5 NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCisrKyBzb3VyY2UvaW5jbHVkZS9s aW51eC9kZXZpY2UtbWFwcGVyLmgJMjAwMi0xMS0yOSAwOTo0NDo1OS4wMDAwMDAwMDAgKzAw MDAKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBTaXN0aW5h IFNvZnR3YXJlIChVSykgTGltaXRlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQg dW5kZXIgdGhlIExHUEwuCisgKi8KKworI2lmbmRlZiBfTElOVVhfREVWSUNFX01BUFBFUl9I CisjZGVmaW5lIF9MSU5VWF9ERVZJQ0VfTUFQUEVSX0gKKworI2RlZmluZSBETV9ESVIgIm1h cHBlciIJLyogU2xhc2hlcyBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIERNX01BWF9UWVBF X05BTUUgMTYKKyNkZWZpbmUgRE1fTkFNRV9MRU4gMTI4CisjZGVmaW5lIERNX1VVSURfTEVO IDEyOQorCisjaWZkZWYgX19LRVJORUxfXworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgc2Vj dG9yX3Q7CisKK3N0cnVjdCBkbV90YXJnZXQ7CitzdHJ1Y3QgZG1fdGFibGU7CitzdHJ1Y3Qg ZG1fZGV2OworCit0eXBlZGVmIGVudW0geyBTVEFUVVNUWVBFX0lORk8sIFNUQVRVU1RZUEVf VEFCTEUgfSBzdGF0dXNfdHlwZV90OworCisvKgorICogSW4gdGhlIGNvbnN0cnVjdG9yIHRo ZSB0YXJnZXQgcGFyYW1ldGVyIHdpbGwgYWxyZWFkeSBoYXZlIHRoZQorICogdGFibGUsIHR5 cGUsIGJlZ2luIGFuZCBsZW4gZmllbGRzIGZpbGxlZCBpbi4KKyAqLwordHlwZWRlZiBpbnQg KCpkbV9jdHJfZm4pIChzdHJ1Y3QgZG1fdGFyZ2V0ICp0YXJnZXQsIGludCBhcmdjLCBjaGFy ICoqYXJndik7CisKKy8qCisgKiBUaGUgZGVzdHJ1Y3RvciBkb2Vzbid0IG5lZWQgdG8gZnJl ZSB0aGUgZG1fdGFyZ2V0LCBqdXN0CisgKiBhbnl0aGluZyBoaWRkZW4gdGktPnByaXZhdGUu CisgKi8KK3R5cGVkZWYgdm9pZCAoKmRtX2R0cl9mbikgKHN0cnVjdCBkbV90YXJnZXQgKnRp KTsKKworLyoKKyAqIFRoZSBtYXAgZnVuY3Rpb24gbXVzdCByZXR1cm46CisgKiA8IDA6IGVy cm9yCisgKiA9IDA6IFRoZSB0YXJnZXQgd2lsbCBoYW5kbGUgdGhlIGlvIGJ5IHJlc3VibWl0 dGluZyBpdCBsYXRlcgorICogPiAwOiBzaW1wbGUgcmVtYXAgY29tcGxldGUKKyAqLwordHlw ZWRlZiBpbnQgKCpkbV9tYXBfZm4pIChzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IGJ1 ZmZlcl9oZWFkICpiaCwgaW50IHJ3KTsKK3R5cGVkZWYgaW50ICgqZG1fc3RhdHVzX2ZuKSAo c3RydWN0IGRtX3RhcmdldCAqdGksIHN0YXR1c190eXBlX3Qgc3RhdHVzX3R5cGUsCisJCQkg ICAgIGNoYXIgKnJlc3VsdCwgaW50IG1heGxlbik7CisKK3ZvaWQgZG1fZXJyb3IoY29uc3Qg Y2hhciAqbWVzc2FnZSk7CisKKy8qCisgKiBDb25zdHJ1Y3RvcnMgc2hvdWxkIGNhbGwgdGhl c2UgZnVuY3Rpb25zIHRvIGVuc3VyZSBkZXN0aW5hdGlvbiBkZXZpY2VzCisgKiBhcmUgb3Bl bmVkL2Nsb3NlZCBjb3JyZWN0bHkuCisgKiBGSVhNRTogdG9vIG1hbnkgYXJndW1lbnRzLgor ICovCitpbnQgZG1fZ2V0X2RldmljZShzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgY29uc3QgY2hh ciAqcGF0aCwgc2VjdG9yX3Qgc3RhcnQsCisJCSAgc2VjdG9yX3QgbGVuLCBpbnQgbW9kZSwg c3RydWN0IGRtX2RldiAqKnJlc3VsdCk7Cit2b2lkIGRtX3B1dF9kZXZpY2Uoc3RydWN0IGRt X3RhcmdldCAqdGksIHN0cnVjdCBkbV9kZXYgKmQpOworCisvKgorICogSW5mb3JtYXRpb24g YWJvdXQgYSB0YXJnZXQgdHlwZQorICovCitzdHJ1Y3QgdGFyZ2V0X3R5cGUgeworCWNvbnN0 IGNoYXIgKm5hbWU7CisJc3RydWN0IG1vZHVsZSAqbW9kdWxlOworCWRtX2N0cl9mbiBjdHI7 CisJZG1fZHRyX2ZuIGR0cjsKKwlkbV9tYXBfZm4gbWFwOworCWRtX3N0YXR1c19mbiBzdGF0 dXM7Cit9OworCitzdHJ1Y3QgZG1fdGFyZ2V0IHsKKwlzdHJ1Y3QgZG1fdGFibGUgKnRhYmxl OworCXN0cnVjdCB0YXJnZXRfdHlwZSAqdHlwZTsKKworCS8qIHRhcmdldCBsaW1pdHMgKi8K KwlzZWN0b3JfdCBiZWdpbjsKKwlzZWN0b3JfdCBsZW47CisKKwkvKiB0YXJnZXQgc3BlY2lm aWMgZGF0YSAqLworCXZvaWQgKnByaXZhdGU7CisKKwkvKiBVc2VkIHRvIHByb3ZpZGUgYW4g ZXJyb3Igc3RyaW5nIGZyb20gdGhlIGN0ciAqLworCWNoYXIgKmVycm9yOworfTsKKworaW50 IGRtX3JlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgdGFyZ2V0X3R5cGUgKnQpOworaW50IGRtX3Vu cmVnaXN0ZXJfdGFyZ2V0KHN0cnVjdCB0YXJnZXRfdHlwZSAqdCk7CisKKyNlbmRpZgkJCQkv KiBfX0tFUk5FTF9fICovCisKKyNlbmRpZgkJCQkvKiBfTElOVVhfREVWSUNFX01BUFBFUl9I ICovCi0tLSBkaWZmL2luY2x1ZGUvbGludXgvZG0taW9jdGwuaAkxOTcwLTAxLTAxIDAxOjAw OjAwLjAwMDAwMDAwMCArMDEwMAorKysgc291cmNlL2luY2x1ZGUvbGludXgvZG0taW9jdGwu aAkyMDAyLTExLTI5IDA5OjQ0OjU5LjAwMDAwMDAwMCArMDAwMApAQCAtMCwwICsxLDE0NSBA QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBTaXN0aW5hIFNvZnR3YXJlIChVSykgTGlt aXRlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIExHUEwuCisg Ki8KKworI2lmbmRlZiBfTElOVVhfRE1fSU9DVExfSAorI2RlZmluZSBfTElOVVhfRE1fSU9D VExfSAorCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLW1hcHBlci5oPgorI2luY2x1ZGUgPGxp bnV4L3R5cGVzLmg+CisKKy8qCisgKiBJbXBsZW1lbnRzIGEgdHJhZGl0aW9uYWwgaW9jdGwg aW50ZXJmYWNlIHRvIHRoZSBkZXZpY2UgbWFwcGVyLgorICovCisKKy8qCisgKiBBbGwgaW9j dGwgYXJndW1lbnRzIGNvbnNpc3Qgb2YgYSBzaW5nbGUgY2h1bmsgb2YgbWVtb3J5LCB3aXRo CisgKiB0aGlzIHN0cnVjdHVyZSBhdCB0aGUgc3RhcnQuICBJZiBhIHV1aWQgaXMgc3BlY2lm aWVkIGFueQorICogbG9va3VwIChlZy4gZm9yIGEgRE1fSU5GTykgd2lsbCBiZSBkb25lIG9u IHRoYXQsICpub3QqIHRoZQorICogbmFtZS4KKyAqLworc3RydWN0IGRtX2lvY3RsIHsKKwkv KgorCSAqIFRoZSB2ZXJzaW9uIG51bWJlciBpcyBtYWRlIHVwIG9mIHRocmVlIHBhcnRzOgor CSAqIG1ham9yIC0gbm8gYmFja3dhcmQgb3IgZm9yd2FyZCBjb21wYXRpYmlsaXR5LAorCSAq IG1pbm9yIC0gb25seSBiYWNrd2FyZHMgY29tcGF0aWJsZSwKKwkgKiBwYXRjaCAtIGJvdGgg YmFja3dhcmRzIGFuZCBmb3J3YXJkcyBjb21wYXRpYmxlLgorCSAqCisJICogQWxsIGNsaWVu dHMgb2YgdGhlIGlvY3RsIGludGVyZmFjZSBzaG91bGQgZmlsbCBpbiB0aGUKKwkgKiB2ZXJz aW9uIG51bWJlciBvZiB0aGUgaW50ZXJmYWNlIHRoYXQgdGhleSB3ZXJlCisJICogY29tcGls ZWQgd2l0aC4KKwkgKgorCSAqIEFsbCByZWNvZ25pc2VkIGlvY3RsIGNvbW1hbmRzIChpZS4g dGhvc2UgdGhhdCBkb24ndAorCSAqIHJldHVybiAtRU5PVFRZKSBmaWxsIG91dCB0aGlzIGZp ZWxkLCBldmVuIGlmIHRoZQorCSAqIGNvbW1hbmQgZmFpbGVkLgorCSAqLworCXVpbnQzMl90 IHZlcnNpb25bM107CS8qIGluL291dCAqLworCXVpbnQzMl90IGRhdGFfc2l6ZTsJLyogdG90 YWwgc2l6ZSBvZiBkYXRhIHBhc3NlZCBpbgorCQkJCSAqIGluY2x1ZGluZyB0aGlzIHN0cnVj dCAqLworCisJdWludDMyX3QgZGF0YV9zdGFydDsJLyogb2Zmc2V0IHRvIHN0YXJ0IG9mIGRh dGEKKwkJCQkgKiByZWxhdGl2ZSB0byBzdGFydCBvZiB0aGlzIHN0cnVjdCAqLworCisJdWlu dDMyX3QgdGFyZ2V0X2NvdW50OwkvKiBpbi9vdXQgKi8KKwl1aW50MzJfdCBvcGVuX2NvdW50 OwkvKiBvdXQgKi8KKwl1aW50MzJfdCBmbGFnczsJCS8qIGluL291dCAqLworCisJX19rZXJu ZWxfZGV2X3QgZGV2OwkvKiBpbi9vdXQgKi8KKworCWNoYXIgbmFtZVtETV9OQU1FX0xFTl07 CS8qIGRldmljZSBuYW1lICovCisJY2hhciB1dWlkW0RNX1VVSURfTEVOXTsJLyogdW5pcXVl IGlkZW50aWZpZXIgZm9yCisJCQkJICogdGhlIGJsb2NrIGRldmljZSAqLworfTsKKworLyoK KyAqIFVzZWQgdG8gc3BlY2lmeSB0YWJsZXMuICBUaGVzZSBzdHJ1Y3R1cmVzIGFwcGVhciBh ZnRlciB0aGUKKyAqIGRtX2lvY3RsLgorICovCitzdHJ1Y3QgZG1fdGFyZ2V0X3NwZWMgewor CWludDMyX3Qgc3RhdHVzOwkJLyogdXNlZCB3aGVuIHJlYWRpbmcgZnJvbSBrZXJuZWwgb25s eSAqLworCXVpbnQ2NF90IHNlY3Rvcl9zdGFydDsKKwl1aW50MzJfdCBsZW5ndGg7CisKKwkv KgorCSAqIE9mZnNldCBpbiBieXRlcyAoZnJvbSB0aGUgc3RhcnQgb2YgdGhpcyBzdHJ1Y3Qp IHRvCisJICogbmV4dCB0YXJnZXRfc3BlYy4KKwkgKi8KKwl1aW50MzJfdCBuZXh0OworCisJ Y2hhciB0YXJnZXRfdHlwZVtETV9NQVhfVFlQRV9OQU1FXTsKKworCS8qCisJICogUGFyYW1l dGVyIHN0cmluZyBzdGFydHMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyBvYmplY3QuCisJICog QmUgY2FyZWZ1bCB0byBhZGQgcGFkZGluZyBhZnRlciBzdHJpbmcgdG8gZW5zdXJlIGNvcnJl Y3QKKwkgKiBhbGlnbm1lbnQgb2Ygc3Vic2VxdWVudCBkbV90YXJnZXRfc3BlYy4KKwkgKi8K K307CisKKy8qCisgKiBVc2VkIHRvIHJldHJpZXZlIHRoZSB0YXJnZXQgZGVwZW5kZW5jaWVz LgorICovCitzdHJ1Y3QgZG1fdGFyZ2V0X2RlcHMgeworCXVpbnQzMl90IGNvdW50OworCisJ X19rZXJuZWxfZGV2X3QgZGV2WzBdOwkvKiBvdXQgKi8KK307CisKKy8qCisgKiBJZiB5b3Ug Y2hhbmdlIHRoaXMgbWFrZSBzdXJlIHlvdSBtYWtlIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5n ZQorICogdG8gZG0taW9jdGwuYzpsb29rdXBfaW9jdGwoKQorICovCitlbnVtIHsKKwkvKiBU b3AgbGV2ZWwgY21kcyAqLworCURNX1ZFUlNJT05fQ01EID0gMCwKKwlETV9SRU1PVkVfQUxM X0NNRCwKKworCS8qIGRldmljZSBsZXZlbCBjbWRzICovCisJRE1fREVWX0NSRUFURV9DTUQs CisJRE1fREVWX1JFTU9WRV9DTUQsCisJRE1fREVWX1JFTE9BRF9DTUQsCisJRE1fREVWX1JF TkFNRV9DTUQsCisJRE1fREVWX1NVU1BFTkRfQ01ELAorCURNX0RFVl9ERVBTX0NNRCwKKwlE TV9ERVZfU1RBVFVTX0NNRCwKKworCS8qIHRhcmdldCBsZXZlbCBjbWRzICovCisJRE1fVEFS R0VUX1NUQVRVU19DTUQsCisJRE1fVEFSR0VUX1dBSVRfQ01ECit9OworCisjZGVmaW5lIERN X0lPQ1RMIDB4ZmQKKworI2RlZmluZSBETV9WRVJTSU9OICAgICAgIF9JT1dSKERNX0lPQ1RM LCBETV9WRVJTSU9OX0NNRCwgc3RydWN0IGRtX2lvY3RsKQorI2RlZmluZSBETV9SRU1PVkVf QUxMICAgIF9JT1dSKERNX0lPQ1RMLCBETV9SRU1PVkVfQUxMX0NNRCwgc3RydWN0IGRtX2lv Y3RsKQorCisjZGVmaW5lIERNX0RFVl9DUkVBVEUgICAgX0lPV1IoRE1fSU9DVEwsIERNX0RF Vl9DUkVBVEVfQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCisjZGVmaW5lIERNX0RFVl9SRU1PVkUg ICAgX0lPV1IoRE1fSU9DVEwsIERNX0RFVl9SRU1PVkVfQ01ELCBzdHJ1Y3QgZG1faW9jdGwp CisjZGVmaW5lIERNX0RFVl9SRUxPQUQgICAgX0lPV1IoRE1fSU9DVEwsIERNX0RFVl9SRUxP QURfQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCisjZGVmaW5lIERNX0RFVl9TVVNQRU5EICAgX0lP V1IoRE1fSU9DVEwsIERNX0RFVl9TVVNQRU5EX0NNRCwgc3RydWN0IGRtX2lvY3RsKQorI2Rl ZmluZSBETV9ERVZfUkVOQU1FICAgIF9JT1dSKERNX0lPQ1RMLCBETV9ERVZfUkVOQU1FX0NN RCwgc3RydWN0IGRtX2lvY3RsKQorI2RlZmluZSBETV9ERVZfREVQUyAgICAgIF9JT1dSKERN X0lPQ1RMLCBETV9ERVZfREVQU19DTUQsIHN0cnVjdCBkbV9pb2N0bCkKKyNkZWZpbmUgRE1f REVWX1NUQVRVUyAgICBfSU9XUihETV9JT0NUTCwgRE1fREVWX1NUQVRVU19DTUQsIHN0cnVj dCBkbV9pb2N0bCkKKworI2RlZmluZSBETV9UQVJHRVRfU1RBVFVTIF9JT1dSKERNX0lPQ1RM LCBETV9UQVJHRVRfU1RBVFVTX0NNRCwgc3RydWN0IGRtX2lvY3RsKQorI2RlZmluZSBETV9U QVJHRVRfV0FJVCAgIF9JT1dSKERNX0lPQ1RMLCBETV9UQVJHRVRfV0FJVF9DTUQsIHN0cnVj dCBkbV9pb2N0bCkKKworI2RlZmluZSBETV9WRVJTSU9OX01BSk9SCTEKKyNkZWZpbmUgRE1f VkVSU0lPTl9NSU5PUgkwCisjZGVmaW5lIERNX1ZFUlNJT05fUEFUQ0hMRVZFTAk2CisjZGVm aW5lIERNX1ZFUlNJT05fRVhUUkEJIi1pb2N0bCAoMjAwMi0xMC0xNSkiCisKKy8qIFN0YXR1 cyBiaXRzICovCisjZGVmaW5lIERNX1JFQURPTkxZX0ZMQUcJMHgwMDAwMDAwMQorI2RlZmlu ZSBETV9TVVNQRU5EX0ZMQUcJCTB4MDAwMDAwMDIKKyNkZWZpbmUgRE1fRVhJU1RTX0ZMQUcJ CTB4MDAwMDAwMDQKKyNkZWZpbmUgRE1fUEVSU0lTVEVOVF9ERVZfRkxBRwkweDAwMDAwMDA4 CisKKy8qCisgKiBGbGFnIHBhc3NlZCBpbnRvIGlvY3RsIFNUQVRVUyBjb21tYW5kIHRvIGdl dCB0YWJsZSBpbmZvcm1hdGlvbgorICogcmF0aGVyIHRoYW4gY3VycmVudCBzdGF0dXMuCisg Ki8KKyNkZWZpbmUgRE1fU1RBVFVTX1RBQkxFX0ZMQUcJMHgwMDAwMDAxMAorCisjZW5kaWYJ CQkJLyogX0xJTlVYX0RNX0lPQ1RMX0ggKi8KLS0tIGRpZmYvaW5jbHVkZS9saW51eC9tZW1w b29sLmgJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKKysrIHNvdXJjZS9p bmNsdWRlL2xpbnV4L21lbXBvb2wuaAkyMDAyLTExLTI5IDA5OjQ0OjU5LjAwMDAwMDAwMCAr MDAwMApAQCAtMCwwICsxLDQxIEBACisvKgorICogbWVtb3J5IGJ1ZmZlciBwb29sIHN1cHBv cnQKKyAqLworI2lmbmRlZiBfTElOVVhfTUVNUE9PTF9ICisjZGVmaW5lIF9MSU5VWF9NRU1Q T09MX0gKKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0 Lmg+CisKK3N0cnVjdCBtZW1wb29sX3M7Cit0eXBlZGVmIHN0cnVjdCBtZW1wb29sX3MgbWVt cG9vbF90OworCit0eXBlZGVmIHZvaWQgKiAobWVtcG9vbF9hbGxvY190KShpbnQgZ2ZwX21h c2ssIHZvaWQgKnBvb2xfZGF0YSk7Cit0eXBlZGVmIHZvaWQgKG1lbXBvb2xfZnJlZV90KSh2 b2lkICplbGVtZW50LCB2b2lkICpwb29sX2RhdGEpOworCitzdHJ1Y3QgbWVtcG9vbF9zIHsK KwlzcGlubG9ja190IGxvY2s7CisJaW50IG1pbl9uciwgY3Vycl9ucjsKKwlzdHJ1Y3QgbGlz dF9oZWFkIGVsZW1lbnRzOworCisJdm9pZCAqcG9vbF9kYXRhOworCW1lbXBvb2xfYWxsb2Nf dCAqYWxsb2M7CisJbWVtcG9vbF9mcmVlX3QgKmZyZWU7CisJd2FpdF9xdWV1ZV9oZWFkX3Qg d2FpdDsKK307CitleHRlcm4gbWVtcG9vbF90ICogbWVtcG9vbF9jcmVhdGUoaW50IG1pbl9u ciwgbWVtcG9vbF9hbGxvY190ICphbGxvY19mbiwKKwkJCQkgbWVtcG9vbF9mcmVlX3QgKmZy ZWVfZm4sIHZvaWQgKnBvb2xfZGF0YSk7CitleHRlcm4gdm9pZCBtZW1wb29sX3Jlc2l6ZSht ZW1wb29sX3QgKnBvb2wsIGludCBuZXdfbWluX25yLCBpbnQgZ2ZwX21hc2spOworZXh0ZXJu IHZvaWQgbWVtcG9vbF9kZXN0cm95KG1lbXBvb2xfdCAqcG9vbCk7CitleHRlcm4gdm9pZCAq IG1lbXBvb2xfYWxsb2MobWVtcG9vbF90ICpwb29sLCBpbnQgZ2ZwX21hc2spOworZXh0ZXJu IHZvaWQgbWVtcG9vbF9mcmVlKHZvaWQgKmVsZW1lbnQsIG1lbXBvb2xfdCAqcG9vbCk7CisK KworLyoKKyAqIEEgbWVtcG9vbF9hbGxvY190IGFuZCBtZW1wb29sX2ZyZWVfdCB0aGF0IGdl dCB0aGUgbWVtb3J5IGZyb20KKyAqIGEgc2xhYiB0aGF0IGlzIHBhc3NlZCBpbiB0aHJvdWdo IHBvb2xfZGF0YS4KKyAqLwordm9pZCAqbWVtcG9vbF9hbGxvY19zbGFiKGludCBnZnBfbWFz aywgdm9pZCAqcG9vbF9kYXRhKTsKK3ZvaWQgbWVtcG9vbF9mcmVlX3NsYWIodm9pZCAqZWxl bWVudCwgdm9pZCAqcG9vbF9kYXRhKTsKKworI2VuZGlmIC8qIF9MSU5VWF9NRU1QT09MX0gg Ki8KLS0tIGRpZmYvbW0vbWVtcG9vbC5jCTE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAw ICswMTAwCisrKyBzb3VyY2UvbW0vbWVtcG9vbC5jCTIwMDItMTEtMjkgMDk6NDQ6NTkuMDAw MDAwMDAwICswMDAwCkBAIC0wLDAgKzEsMjk1IEBACisvKgorICogIGxpbnV4L21tL21lbXBv b2wuYworICoKKyAqICBtZW1vcnkgYnVmZmVyIHBvb2wgc3VwcG9ydC4gU3VjaCBwb29scyBh cmUgbW9zdGx5IHVzZWQKKyAqICBmb3IgZ3VhcmFudGVlZCwgZGVhZGxvY2stZnJlZSBtZW1v cnkgYWxsb2NhdGlvbnMgZHVyaW5nCisgKiAgZXh0cmVtZSBWTSBsb2FkLgorICoKKyAqICBz dGFydGVkIGJ5IEluZ28gTW9sbmFyLCBDb3B5cmlnaHQgKEMpIDIwMDEKKyAqLworCisjaW5j bHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8 bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWVtcG9vbC5oPgorI2luY2x1ZGUg PGxpbnV4L2NvbXBpbGVyLmg+CisKKy8qKgorICogbWVtcG9vbF9jcmVhdGUgLSBjcmVhdGUg YSBtZW1vcnkgcG9vbAorICogQG1pbl9ucjogICAgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGVs ZW1lbnRzIGd1YXJhbnRlZWQgdG8gYmUKKyAqICAgICAgICAgICAgIGFsbG9jYXRlZCBmb3Ig dGhpcyBwb29sLgorICogQGFsbG9jX2ZuOiAgdXNlci1kZWZpbmVkIGVsZW1lbnQtYWxsb2Nh dGlvbiBmdW5jdGlvbi4KKyAqIEBmcmVlX2ZuOiAgIHVzZXItZGVmaW5lZCBlbGVtZW50LWZy ZWVpbmcgZnVuY3Rpb24uCisgKiBAcG9vbF9kYXRhOiBvcHRpb25hbCBwcml2YXRlIGRhdGEg YXZhaWxhYmxlIHRvIHRoZSB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLgorICoKKyAqIHRoaXMg ZnVuY3Rpb24gY3JlYXRlcyBhbmQgYWxsb2NhdGVzIGEgZ3VhcmFudGVlZCBzaXplLCBwcmVh bGxvY2F0ZWQKKyAqIG1lbW9yeSBwb29sLiBUaGUgcG9vbCBjYW4gYmUgdXNlZCBmcm9tIHRo ZSBtZW1wb29sX2FsbG9jIGFuZCBtZW1wb29sX2ZyZWUKKyAqIGZ1bmN0aW9ucy4gVGhpcyBm dW5jdGlvbiBtaWdodCBzbGVlcC4gQm90aCB0aGUgYWxsb2NfZm4oKSBhbmQgdGhlIGZyZWVf Zm4oKQorICogZnVuY3Rpb25zIG1pZ2h0IHNsZWVwIC0gYXMgbG9uZyBhcyB0aGUgbWVtcG9v bF9hbGxvYyBmdW5jdGlvbiBpcyBub3QgY2FsbGVkCisgKiBmcm9tIElSUSBjb250ZXh0cy4g VGhlIGVsZW1lbnQgYWxsb2NhdGVkIGJ5IGFsbG9jX2ZuKCkgbXVzdCBiZSBhYmxlIHRvCisg KiBob2xkIGEgc3RydWN0IGxpc3RfaGVhZC4gKDggYnl0ZXMgb24geDg2LikKKyAqLworbWVt cG9vbF90ICogbWVtcG9vbF9jcmVhdGUoaW50IG1pbl9uciwgbWVtcG9vbF9hbGxvY190ICph bGxvY19mbiwKKwkJCQltZW1wb29sX2ZyZWVfdCAqZnJlZV9mbiwgdm9pZCAqcG9vbF9kYXRh KQoreworCW1lbXBvb2xfdCAqcG9vbDsKKwlpbnQgaTsKKworCXBvb2wgPSBrbWFsbG9jKHNp emVvZigqcG9vbCksIEdGUF9LRVJORUwpOworCWlmICghcG9vbCkKKwkJcmV0dXJuIE5VTEw7 CisJbWVtc2V0KHBvb2wsIDAsIHNpemVvZigqcG9vbCkpOworCisJc3Bpbl9sb2NrX2luaXQo JnBvb2wtPmxvY2spOworCXBvb2wtPm1pbl9uciA9IG1pbl9ucjsKKwlwb29sLT5wb29sX2Rh dGEgPSBwb29sX2RhdGE7CisJSU5JVF9MSVNUX0hFQUQoJnBvb2wtPmVsZW1lbnRzKTsKKwlp bml0X3dhaXRxdWV1ZV9oZWFkKCZwb29sLT53YWl0KTsKKwlwb29sLT5hbGxvYyA9IGFsbG9j X2ZuOworCXBvb2wtPmZyZWUgPSBmcmVlX2ZuOworCisJLyoKKwkgKiBGaXJzdCBwcmUtYWxs b2NhdGUgdGhlIGd1YXJhbnRlZWQgbnVtYmVyIG9mIGJ1ZmZlcnMuCisJICovCisJZm9yIChp ID0gMDsgaSA8IG1pbl9ucjsgaSsrKSB7CisJCXZvaWQgKmVsZW1lbnQ7CisJCXN0cnVjdCBs aXN0X2hlYWQgKnRtcDsKKwkJZWxlbWVudCA9IHBvb2wtPmFsbG9jKEdGUF9LRVJORUwsIHBv b2wtPnBvb2xfZGF0YSk7CisKKwkJaWYgKHVubGlrZWx5KCFlbGVtZW50KSkgeworCQkJLyoK KwkJCSAqIE5vdCBlbm91Z2ggbWVtb3J5IC0gZnJlZSB0aGUgYWxsb2NhdGVkIG9uZXMKKwkJ CSAqIGFuZCByZXR1cm46CisJCQkgKi8KKwkJCWxpc3RfZm9yX2VhY2godG1wLCAmcG9vbC0+ ZWxlbWVudHMpIHsKKwkJCQllbGVtZW50ID0gdG1wOworCQkJCXBvb2wtPmZyZWUoZWxlbWVu dCwgcG9vbC0+cG9vbF9kYXRhKTsKKwkJCX0KKwkJCWtmcmVlKHBvb2wpOworCisJCQlyZXR1 cm4gTlVMTDsKKwkJfQorCQl0bXAgPSBlbGVtZW50OworCQlsaXN0X2FkZCh0bXAsICZwb29s LT5lbGVtZW50cyk7CisJCXBvb2wtPmN1cnJfbnIrKzsKKwl9CisJcmV0dXJuIHBvb2w7Cit9 CisKKy8qKgorICogbWVtcG9vbF9yZXNpemUgLSByZXNpemUgYW4gZXhpc3RpbmcgbWVtb3J5 IHBvb2wKKyAqIEBwb29sOiAgICAgICBwb2ludGVyIHRvIHRoZSBtZW1vcnkgcG9vbCB3aGlj aCB3YXMgYWxsb2NhdGVkIHZpYQorICogICAgICAgICAgICAgIG1lbXBvb2xfY3JlYXRlKCku CisgKiBAbmV3X21pbl9ucjogdGhlIG5ldyBtaW5pbXVtIG51bWJlciBvZiBlbGVtZW50cyBn dWFyYW50ZWVkIHRvIGJlCisgKiAgICAgICAgICAgICAgYWxsb2NhdGVkIGZvciB0aGlzIHBv b2wuCisgKiBAZ2ZwX21hc2s6ICAgdGhlIHVzdWFsIGFsbG9jYXRpb24gYml0bWFzay4KKyAq CisgKiBUaGlzIGZ1bmN0aW9uIHNocmlua3MvZ3Jvd3MgdGhlIHBvb2wuIEluIHRoZSBjYXNl IG9mIGdyb3dpbmcsCisgKiBpdCBjYW5ub3QgYmUgZ3VhcmFudGVlZCB0aGF0IHRoZSBwb29s IHdpbGwgYmUgZ3Jvd24gdG8gdGhlIG5ldworICogc2l6ZSBpbW1lZGlhdGVseSwgYnV0IG5l dyBtZW1wb29sX2ZyZWUoKSBjYWxscyB3aWxsIHJlZmlsbCBpdC4KKyAqCisgKiBOb3RlLCB0 aGUgY2FsbGVyIG11c3QgZ3VhcmFudGVlIHRoYXQgbm8gbWVtcG9vbF9kZXN0cm95IGlzIGNh bGxlZAorICogd2hpbGUgdGhpcyBmdW5jdGlvbiBpcyBydW5uaW5nLiBtZW1wb29sX2FsbG9j KCkgJiBtZW1wb29sX2ZyZWUoKQorICogbWlnaHQgYmUgY2FsbGVkIChlZy4gZnJvbSBJUlEg Y29udGV4dHMpIHdoaWxlIHRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMuCisgKi8KK3ZvaWQgbWVt cG9vbF9yZXNpemUobWVtcG9vbF90ICpwb29sLCBpbnQgbmV3X21pbl9uciwgaW50IGdmcF9t YXNrKQoreworCWludCBkZWx0YTsKKwl2b2lkICplbGVtZW50OworCXVuc2lnbmVkIGxvbmcg ZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCisJaWYgKG5ld19taW5fbnIgPD0g MCkKKwkJQlVHKCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9vbC0+bG9jaywgZmxhZ3Mp OworCWlmIChuZXdfbWluX25yIDwgcG9vbC0+bWluX25yKSB7CisJCXBvb2wtPm1pbl9uciA9 IG5ld19taW5fbnI7CisJCS8qCisJCSAqIEZyZWUgcG9zc2libGUgZXhjZXNzIGVsZW1lbnRz LgorCQkgKi8KKwkJd2hpbGUgKHBvb2wtPmN1cnJfbnIgPiBwb29sLT5taW5fbnIpIHsKKwkJ CXRtcCA9IHBvb2wtPmVsZW1lbnRzLm5leHQ7CisJCQlpZiAodG1wID09ICZwb29sLT5lbGVt ZW50cykKKwkJCQlCVUcoKTsKKwkJCWxpc3RfZGVsKHRtcCk7CisJCQllbGVtZW50ID0gdG1w OworCQkJcG9vbC0+Y3Vycl9uci0tOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9v bC0+bG9jaywgZmxhZ3MpOworCisJCQlwb29sLT5mcmVlKGVsZW1lbnQsIHBvb2wtPnBvb2xf ZGF0YSk7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZwb29sLT5sb2NrLCBmbGFncyk7CisJ CX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCQly ZXR1cm47CisJfQorCWRlbHRhID0gbmV3X21pbl9uciAtIHBvb2wtPm1pbl9ucjsKKwlwb29s LT5taW5fbnIgPSBuZXdfbWluX25yOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvb2wt PmxvY2ssIGZsYWdzKTsKKworCS8qCisJICogV2UgcmVmaWxsIHRoZSBwb29sIHVwIHRvIHRo ZSBuZXcgdHJlc2hvbGQgLSBidXQgd2UgZG9udAorCSAqIChjYW5ub3QpIGd1YXJhbnRlZSB0 aGF0IHRoZSByZWZpbGwgc3VjY2VlZHMuCisJICovCisJd2hpbGUgKGRlbHRhKSB7CisJCWVs ZW1lbnQgPSBwb29sLT5hbGxvYyhnZnBfbWFzaywgcG9vbC0+cG9vbF9kYXRhKTsKKwkJaWYg KCFlbGVtZW50KQorCQkJYnJlYWs7CisJCW1lbXBvb2xfZnJlZShlbGVtZW50LCBwb29sKTsK KwkJZGVsdGEtLTsKKwl9Cit9CisKKy8qKgorICogbWVtcG9vbF9kZXN0cm95IC0gZGVhbGxv Y2F0ZSBhIG1lbW9yeSBwb29sCisgKiBAcG9vbDogICAgICBwb2ludGVyIHRvIHRoZSBtZW1v cnkgcG9vbCB3aGljaCB3YXMgYWxsb2NhdGVkIHZpYQorICogICAgICAgICAgICAgbWVtcG9v bF9jcmVhdGUoKS4KKyAqCisgKiB0aGlzIGZ1bmN0aW9uIG9ubHkgc2xlZXBzIGlmIHRoZSBm cmVlX2ZuKCkgZnVuY3Rpb24gc2xlZXBzLiBUaGUgY2FsbGVyCisgKiBoYXMgdG8gZ3VhcmFu dGVlIHRoYXQgbm8gbWVtcG9vbF9hbGxvYygpIG5vciBtZW1wb29sX2ZyZWUoKSBoYXBwZW5z IGluCisgKiB0aGlzIHBvb2wgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgKi8KK3Zv aWQgbWVtcG9vbF9kZXN0cm95KG1lbXBvb2xfdCAqcG9vbCkKK3sKKwl2b2lkICplbGVtZW50 OworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsICp0bXA7CisKKwlpZiAoIXBvb2wpCisJCXJl dHVybjsKKworCWhlYWQgPSAmcG9vbC0+ZWxlbWVudHM7CisJZm9yICh0bXAgPSBoZWFkLT5u ZXh0OyB0bXAgIT0gaGVhZDsgKSB7CisJCWVsZW1lbnQgPSB0bXA7CisJCXRtcCA9IHRtcC0+ bmV4dDsKKwkJcG9vbC0+ZnJlZShlbGVtZW50LCBwb29sLT5wb29sX2RhdGEpOworCQlwb29s LT5jdXJyX25yLS07CisJfQorCWlmIChwb29sLT5jdXJyX25yKQorCQlCVUcoKTsKKwlrZnJl ZShwb29sKTsKK30KKworLyoqCisgKiBtZW1wb29sX2FsbG9jIC0gYWxsb2NhdGUgYW4gZWxl bWVudCBmcm9tIGEgc3BlY2lmaWMgbWVtb3J5IHBvb2wKKyAqIEBwb29sOiAgICAgIHBvaW50 ZXIgdG8gdGhlIG1lbW9yeSBwb29sIHdoaWNoIHdhcyBhbGxvY2F0ZWQgdmlhCisgKiAgICAg ICAgICAgICBtZW1wb29sX2NyZWF0ZSgpLgorICogQGdmcF9tYXNrOiAgdGhlIHVzdWFsIGFs bG9jYXRpb24gYml0bWFzay4KKyAqCisgKiB0aGlzIGZ1bmN0aW9uIG9ubHkgc2xlZXBzIGlm IHRoZSBhbGxvY19mbiBmdW5jdGlvbiBzbGVlcHMgb3IKKyAqIHJldHVybnMgTlVMTC4gTm90 ZSB0aGF0IGR1ZSB0byBwcmVhbGxvY2F0aW9uLCB0aGlzIGZ1bmN0aW9uCisgKiAqbmV2ZXIq IGZhaWxzIHdoZW4gY2FsbGVkIGZyb20gcHJvY2VzcyBjb250ZXh0cy4gKGl0IG1pZ2h0Cisg KiBmYWlsIGlmIGNhbGxlZCBmcm9tIGFuIElSUSBjb250ZXh0LikKKyAqLwordm9pZCAqIG1l bXBvb2xfYWxsb2MobWVtcG9vbF90ICpwb29sLCBpbnQgZ2ZwX21hc2spCit7CisJdm9pZCAq ZWxlbWVudDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgKnRt cDsKKwlpbnQgY3Vycl9ucjsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsK KwlpbnQgZ2ZwX25vd2FpdCA9IGdmcF9tYXNrICYgfihfX0dGUF9XQUlUIHwgX19HRlBfSU8p OworCityZXBlYXRfYWxsb2M6CisJZWxlbWVudCA9IHBvb2wtPmFsbG9jKGdmcF9ub3dhaXQs IHBvb2wtPnBvb2xfZGF0YSk7CisJaWYgKGxpa2VseShlbGVtZW50ICE9IE5VTEwpKQorCQly ZXR1cm4gZWxlbWVudDsKKworCS8qCisJICogSWYgdGhlIHBvb2wgaXMgbGVzcyB0aGFuIDUw JSBmdWxsIHRoZW4gdHJ5IGhhcmRlcgorCSAqIHRvIGFsbG9jYXRlIGFuIGVsZW1lbnQ6CisJ ICovCisJaWYgKChnZnBfbWFzayAhPSBnZnBfbm93YWl0KSAmJiAocG9vbC0+Y3Vycl9uciA8 PSBwb29sLT5taW5fbnIvMikpIHsKKwkJZWxlbWVudCA9IHBvb2wtPmFsbG9jKGdmcF9tYXNr LCBwb29sLT5wb29sX2RhdGEpOworCQlpZiAobGlrZWx5KGVsZW1lbnQgIT0gTlVMTCkpCisJ CQlyZXR1cm4gZWxlbWVudDsKKwl9CisKKwkvKgorCSAqIEtpY2sgdGhlIFZNIGF0IHRoaXMg cG9pbnQuCisJICovCisJd2FrZXVwX2JkZmx1c2goKTsKKworCXNwaW5fbG9ja19pcnFzYXZl KCZwb29sLT5sb2NrLCBmbGFncyk7CisJaWYgKGxpa2VseShwb29sLT5jdXJyX25yKSkgewor CQl0bXAgPSBwb29sLT5lbGVtZW50cy5uZXh0OworCQlsaXN0X2RlbCh0bXApOworCQllbGVt ZW50ID0gdG1wOworCQlwb29sLT5jdXJyX25yLS07CisJCXNwaW5fdW5sb2NrX2lycXJlc3Rv cmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIGVsZW1lbnQ7CisJfQorCXNwaW5f dW5sb2NrX2lycXJlc3RvcmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKworCS8qIFdlIG11c3Qg bm90IHNsZWVwIGluIHRoZSBHRlBfQVRPTUlDIGNhc2UgKi8KKwlpZiAoZ2ZwX21hc2sgPT0g Z2ZwX25vd2FpdCkKKwkJcmV0dXJuIE5VTEw7CisKKwlydW5fdGFza19xdWV1ZSgmdHFfZGlz ayk7CisKKwlhZGRfd2FpdF9xdWV1ZV9leGNsdXNpdmUoJnBvb2wtPndhaXQsICZ3YWl0KTsK KwlzZXRfdGFza19zdGF0ZShjdXJyZW50LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisKKwlz cGluX2xvY2tfaXJxc2F2ZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCWN1cnJfbnIgPSBwb29s LT5jdXJyX25yOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvb2wtPmxvY2ssIGZsYWdz KTsKKworCWlmICghY3Vycl9ucikKKwkJc2NoZWR1bGUoKTsKKworCWN1cnJlbnQtPnN0YXRl ID0gVEFTS19SVU5OSU5HOworCXJlbW92ZV93YWl0X3F1ZXVlKCZwb29sLT53YWl0LCAmd2Fp dCk7CisKKwlnb3RvIHJlcGVhdF9hbGxvYzsKK30KKworLyoqCisgKiBtZW1wb29sX2ZyZWUg LSByZXR1cm4gYW4gZWxlbWVudCB0byB0aGUgcG9vbC4KKyAqIEBlbGVtZW50OiAgIHBvb2wg ZWxlbWVudCBwb2ludGVyLgorICogQHBvb2w6ICAgICAgcG9pbnRlciB0byB0aGUgbWVtb3J5 IHBvb2wgd2hpY2ggd2FzIGFsbG9jYXRlZCB2aWEKKyAqICAgICAgICAgICAgIG1lbXBvb2xf Y3JlYXRlKCkuCisgKgorICogdGhpcyBmdW5jdGlvbiBvbmx5IHNsZWVwcyBpZiB0aGUgZnJl ZV9mbigpIGZ1bmN0aW9uIHNsZWVwcy4KKyAqLwordm9pZCBtZW1wb29sX2ZyZWUodm9pZCAq ZWxlbWVudCwgbWVtcG9vbF90ICpwb29sKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisK KwlpZiAocG9vbC0+Y3Vycl9uciA8IHBvb2wtPm1pbl9ucikgeworCQlzcGluX2xvY2tfaXJx c2F2ZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCQlpZiAocG9vbC0+Y3Vycl9uciA8IHBvb2wt Pm1pbl9ucikgeworCQkJbGlzdF9hZGQoZWxlbWVudCwgJnBvb2wtPmVsZW1lbnRzKTsKKwkJ CXBvb2wtPmN1cnJfbnIrKzsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvb2wtPmxv Y2ssIGZsYWdzKTsKKwkJCXdha2VfdXAoJnBvb2wtPndhaXQpOworCQkJcmV0dXJuOworCQl9 CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKwl9CisJ cG9vbC0+ZnJlZShlbGVtZW50LCBwb29sLT5wb29sX2RhdGEpOworfQorCisvKgorICogQSBj b21tb25seSB1c2VkIGFsbG9jIGFuZCBmcmVlIGZuLgorICovCit2b2lkICptZW1wb29sX2Fs bG9jX3NsYWIoaW50IGdmcF9tYXNrLCB2b2lkICpwb29sX2RhdGEpCit7CisJa21lbV9jYWNo ZV90ICptZW0gPSAoa21lbV9jYWNoZV90ICopIHBvb2xfZGF0YTsKKwlyZXR1cm4ga21lbV9j YWNoZV9hbGxvYyhtZW0sIGdmcF9tYXNrKTsKK30KKwordm9pZCBtZW1wb29sX2ZyZWVfc2xh Yih2b2lkICplbGVtZW50LCB2b2lkICpwb29sX2RhdGEpCit7CisJa21lbV9jYWNoZV90ICpt ZW0gPSAoa21lbV9jYWNoZV90ICopIHBvb2xfZGF0YTsKKwlrbWVtX2NhY2hlX2ZyZWUobWVt LCBlbGVtZW50KTsKK30KKworCitFWFBPUlRfU1lNQk9MKG1lbXBvb2xfY3JlYXRlKTsKK0VY UE9SVF9TWU1CT0wobWVtcG9vbF9yZXNpemUpOworRVhQT1JUX1NZTUJPTChtZW1wb29sX2Rl c3Ryb3kpOworRVhQT1JUX1NZTUJPTChtZW1wb29sX2FsbG9jKTsKK0VYUE9SVF9TWU1CT0wo bWVtcG9vbF9mcmVlKTsKK0VYUE9SVF9TWU1CT0wobWVtcG9vbF9hbGxvY19zbGFiKTsKK0VY UE9SVF9TWU1CT0wobWVtcG9vbF9mcmVlX3NsYWIpOworCg== --------------080801000505030502020407--