From owner-freebsd-arm@freebsd.org Fri Nov 27 11:28:36 2020 Return-Path: Delivered-To: freebsd-arm@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 39D344A5817 for ; Fri, 27 Nov 2020 11:28:36 +0000 (UTC) (envelope-from freebsd@viruzzz.org) Received: from mail.viruzzz.org (mail.viruzzz.org [IPv6:2001:67c:380:124::3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 4CjC766xG7z3Ccj for ; Fri, 27 Nov 2020 11:28:34 +0000 (UTC) (envelope-from freebsd@viruzzz.org) Received: from [192.168.252.63] (helo=ohm.local) by mail.viruzzz.org with esmtpsa (TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.87 (FreeBSD)) (envelope-from ) id 1kibvM-0007qX-JP for freebsd-arm@freebsd.org; Fri, 27 Nov 2020 14:28:24 +0300 Subject: Re: User Space GPIO Interrupt programming - GSoC-2018 To: freebsd-arm@freebsd.org References: <2B01780F-D367-48A3-A827-B479030A496D@obsigna.com> <8d806302-479c-ca34-3fdb-96d27f40e212@viruzzz.org> <8655AF30-273B-48E7-98CD-007AA1D265F5@obsigna.com> From: Vladimir Goncharov Message-ID: <54ffe2d2-01a2-8b43-94fa-aee4a3f89861@viruzzz.org> Date: Fri, 27 Nov 2020 14:28:24 +0300 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:78.0) Gecko/20100101 Thunderbird/78.5.0 MIME-Version: 1.0 In-Reply-To: <8655AF30-273B-48E7-98CD-007AA1D265F5@obsigna.com> Content-Type: multipart/mixed; boundary="------------2A1AAF89C0C383B854E76A38" Content-Language: ru X-Rspamd-Queue-Id: 4CjC766xG7z3Ccj X-Spamd-Bar: + Authentication-Results: mx1.freebsd.org; dkim=none; dmarc=none; spf=none (mx1.freebsd.org: domain of freebsd@viruzzz.org has no SPF policy when checking 2001:67c:380:124::3) smtp.mailfrom=freebsd@viruzzz.org X-Spamd-Result: default: False [1.43 / 15.00]; RCVD_VIA_SMTP_AUTH(0.00)[]; HAS_ATTACHMENT(0.00)[]; TO_DN_NONE(0.00)[]; MIME_BASE64_TEXT_BOGUS(1.00)[]; MIME_BASE64_TEXT(0.10)[]; CTYPE_MIXED_BOGUS(1.00)[]; FROM_EQ_ENVFROM(0.00)[]; R_DKIM_NA(0.00)[]; RBL_DBL_DONT_QUERY_IPS(0.00)[2001:67c:380:124::3:from]; ASN(0.00)[asn:41599, ipnet:2001:67c:380::/48, country:RU]; MID_RHS_MATCH_FROM(0.00)[]; MIME_TRACE(0.00)[0:+,1:+,2:+]; ARC_NA(0.00)[]; NEURAL_HAM_MEDIUM(-1.00)[-1.000]; FROM_HAS_DN(0.00)[]; TO_MATCH_ENVRCPT_ALL(0.00)[]; NEURAL_HAM_LONG(-1.00)[-1.000]; MIME_GOOD(-0.10)[multipart/mixed,text/plain]; DMARC_NA(0.00)[viruzzz.org]; AUTH_NA(1.00)[]; RCPT_COUNT_ONE(0.00)[1]; SPAMHAUS_ZRD(0.00)[2001:67c:380:124::3:from:127.0.2.255]; NEURAL_SPAM_SHORT(0.43)[0.427]; R_SPF_NA(0.00)[no SPF record]; RCVD_COUNT_TWO(0.00)[2]; RCVD_TLS_ALL(0.00)[]; MAILMAN_DEST(0.00)[freebsd-arm] X-BeenThere: freebsd-arm@freebsd.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: "Porting FreeBSD to ARM processors." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 27 Nov 2020 11:28:36 -0000 This is a multi-part message in MIME format. --------------2A1AAF89C0C383B854E76A38 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Here it is. There is struct gpioc_event with pin number and bintime which is send to userspace. Also I'm thinking about to implementation notofication without extra reading from socket via struct kevent's extra fields (fflags/ext[4]), looks like it is possible. 2020-11-27 14:09, Dr. Rolf Jansen пишет: > Hello Vladimir, > > yes please, I am interested. Please can show us your version of the > GSoC-2018 diff file? > > Best regards > > Rolf > >> Am 27.11.2020 um 05:02 schrieb Vladimir Goncharov > >: >> >> Hello Rolf, >> >> I have implemented in kernel queue for generated GPIO interrupts with >> timestamps, so now it's possible to catch all events even on busy >> system. It's all for gpio_gsoc2018 code. In result I have no more >> warnings in dmesg. Unfortunately it requires allocating memory on each >> event to store pin number and timestamp. In case of unability allocating >> memory it falls back to gpio_gsoc2018 method. >> Does anybody interested in such patches? >> >> >> 2020-11-27 04:18, Dr. Rolf Jansen пишет: >>>> Am 26.11.2020 um 16:56 schrieb Ian Lepore >>> >: >>>> >>>> On Tue, 2020-11-24 at 17:14 -0300, Dr. Rolf Jansen wrote: >>>>> Hello >>>>> >>>>> Has anything of the GSoC-2018 efforts made it into the current code >>>>> base? >>>>> >>>>> >>>> https://wiki.freebsd.org/SummerOfCode2018Projects/UserSpaceGPIOinterrupts >>>> >>>>> >>>>> I installed the recent 13.0-CURRENT snapshot (2020-11-19) on a >>>>> BeagleBone Black which was one of the implementation targets of said >>>>> project, but when running the test tools, I either see cannot >>>>> read/kevent/poll/aio_read - Operation not supported by device or >>>>> Inappropriate ioctl for device. >>>>> >>>>> Perhaps I need to pull the project´s changes into the kernel by >>>>> myself. However, before this I would like to ask whether it is worth >>>>> the effort. >>>>> >>>>> Please, can anyone shed some light on this. >>>>> >>>>> Best regards >>>>> >>>>> Rolf >>>>> >>>> >>>> I made some time this morning to review the gsoc2018 code.  It turns >>>> out this code is very high quality, nearly ready to commit as-is.  The >>>> main thing it needs is some style cleanup in its comment blocks, and >>>> documentation.  I'd be inclined to commit the code first and write the >>>> documentation over the next little while and commit it separately. >>>> >>>> If you'd like to give it a try, here's a diff that should apply and >>>> build cleanly on freebsd 12 or 13: >>>> >>>> https://people.freebsd.org/~ian/gpio_gsoc2018.diff >>>> >>>> While there isn't any documentation yet, there is a test program (I >>>> haven't run it yet) that demonstrates all the features: >>>> >>>> https://github.com/ckraemer/gsoc2018-utils/blob/master/src/gpioc_intr_test.c >>>> >>>> Right now the code will let you block waiting for a pin-change event >>>> using select(), poll() or kevents, or to be notified via SIGIO, but >>>> after being notified that something happened, you still have to call >>>> read() to see which pin changed.  I think if the pin changes state >>>> multiple times between calls to read(), you'll lose track of some >>>> changes (I'm not positive of that, I don't understand the kevent stuff >>>> well). >>>> >>>> I'd like to add some features so that you can configure it to track pin >>>> changes in counting-mode and timestamping-mode.  In counting mode, when >>>> you do a read() you would get back a pair of values, the pin number and >>>> how many times its interrupt fired since the last read.  In >>>> timestamping mode, every read would return a pin number and an >>>> associated timespec giving the exact time the interrupt happened (there >>>> would need to be a way to configure how many events it could buffer, >>>> but I think even allowing a thousand buffered events would only use a >>>> few kbytes of memory). >>> >>> I got it working as well, please see my other post from yesterday. I >>> used gpioc_intr_test.c. >>> >>> I see hundreds of warning messages when I press the test button a few >>> times. May these warnings be safely ignored. The kernel module of >>> Oskar Holmund works quite nice as well (for what I need), and with >>> that one, I don’t see warnings. >>> >>> The counting- and timestamping-mode for sure would be very useful. >>> Perhaps by implementing this, there won’t be no unhandled interrupts >>> anymore, and hence there won’t be any warnings either. >>> >>> Best regards >>> >>> Rolf >>> >>> >> _______________________________________________ >> freebsd-arm@freebsd.org mailing list >> https://lists.freebsd.org/mailman/listinfo/freebsd-arm >> >> To unsubscribe, send any mail to "freebsd-arm-unsubscribe@freebsd.org" > > > > Dr. Rolf Jansen > - - > Rua Reginaldo de Lima, 98 > Parque São Diogo > 09732-550, São Bernardo do Campo > São Paulo - Brazil > > Phone:0055-11/4317-0974 > Mobile:0055-11/9 8141-1465 > E-Mail:rj@obsigna.com > BLog:obsigna.com > --------------2A1AAF89C0C383B854E76A38 Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="gpio.diff" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="gpio.diff" ZGlmZiAtcnUgLi9kZXYvZ3Bpby9ncGlvYnVzLmMgL3Vzci9ob21lL2J1aWxkcm9vdC91c3Iv c3JjL3N5cy9kZXYvZ3Bpby9ncGlvYnVzLmMKLS0tIC4vZGV2L2dwaW8vZ3Bpb2J1cy5jCTIw MjAtMTAtMjMgMDM6MDI6MDUuMDAwMDAwMDAwICswMzAwCisrKyAvdXNyL2hvbWUvYnVpbGRy b290L3Vzci9zcmMvc3lzL2Rldi9ncGlvL2dwaW9idXMuYwkyMDIwLTExLTI1IDEyOjE3OjMw LjQyODExOTAwMCArMDMwMApAQCAtMTQzLDcgKzE0MywxNSBAQAogCS8qIENhbm5vdCBtaXgg cHVsbC11cC9wdWxsLWRvd24gdG9nZXRoZXIuICovCiAJaWYgKGZsYWdzICYgR1BJT19QSU5f UFVMTFVQICYmIGZsYWdzICYgR1BJT19QSU5fUFVMTERPV04pCiAJCXJldHVybiAoRUlOVkFM KTsKLQorCS8qIENhbm5vdCBtaXggb3V0cHV0IGFuZCBpbnRlcnJ1cHQgZmxhZ3MgdG9nZXRo ZXIgKi8KKwlpZiAoZmxhZ3MgJiBHUElPX1BJTl9PVVRQVVQgJiYgZmxhZ3MgJiBHUElPX0lO VFJfTUFTSykKKwkJcmV0dXJuIChFSU5WQUwpOworCS8qIE9ubHkgb25lIGludGVycnVwdCBm bGFnIGNhbiBiZSBkZWZpbmVkIGF0IG9uY2UgKi8KKwlpZiAoKGZsYWdzICYgR1BJT19JTlRS X01BU0spICYgKChmbGFncyAmIEdQSU9fSU5UUl9NQVNLKSAtIDEpKQorCQlyZXR1cm4gKEVJ TlZBTCk7CisJLyogVGhlIGludGVycnVwdCBhdHRhY2hlZCBmbGFnIGNhbm5vdCBiZSBzZXQg Ki8KKwlpZiAoZmxhZ3MgJiBHUElPX0lOVFJfQVRUQUNIRUQpCisgCQlyZXR1cm4gKEVJTlZB TCk7CiAJcmV0dXJuICgwKTsKIH0KIApPbmx5IGluIC91c3IvaG9tZS9idWlsZHJvb3QvdXNy L3NyYy9zeXMvZGV2L2dwaW86IGdwaW9idXMuYy5vcmlnCmRpZmYgLXJ1IC4vZGV2L2dwaW8v Z3Bpb2MuYyAvdXNyL2hvbWUvYnVpbGRyb290L3Vzci9zcmMvc3lzL2Rldi9ncGlvL2dwaW9j LmMKLS0tIC4vZGV2L2dwaW8vZ3Bpb2MuYwkyMDIwLTEwLTIzIDAzOjAyOjA1LjAwMDAwMDAw MCArMDMwMAorKysgL3Vzci9ob21lL2J1aWxkcm9vdC91c3Ivc3JjL3N5cy9kZXYvZ3Bpby9n cGlvYy5jCTIwMjAtMTEtMjcgMDM6MTk6MDQuNjI4ODcyMDAwICswMzAwCkBAIC0zNSw4ICsz NSwxNSBAQAogI2luY2x1ZGUgPHN5cy9jb25mLmg+CiAjaW5jbHVkZSA8c3lzL2dwaW8uaD4K ICNpbmNsdWRlIDxzeXMvaW9jY29tLmg+CisjaW5jbHVkZSA8c3lzL2ZpbGlvLmg+CisjaW5j bHVkZSA8c3lzL2ZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3NpZ2lvLmg+CisjaW5jbHVkZSA8 c3lzL3NpZ25hbHZhci5oPgogI2luY2x1ZGUgPHN5cy9rZXJuZWwuaD4KICNpbmNsdWRlIDxz eXMvbWFsbG9jLmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorI2luY2x1ZGUgPHN5cy9wb2xs Lmg+CisjaW5jbHVkZSA8c3lzL3NlbGluZm8uaD4KICNpbmNsdWRlIDxzeXMvbW9kdWxlLmg+ CiAKICNpbmNsdWRlIDxkZXYvZ3Bpby9ncGlvYnVzdmFyLmg+CkBAIC00NCw0MCArNTEsNDMz IEBACiAjaW5jbHVkZSAiZ3Bpb19pZi5oIgogI2luY2x1ZGUgImdwaW9idXNfaWYuaCIKIAot I3VuZGVmIEdQSU9DX0RFQlVHCisjZGVmaW5lIEdQSU9DX0RFQlVHIDEKICNpZmRlZiBHUElP Q19ERUJVRwogI2RlZmluZSBkcHJpbnRmIHByaW50ZgogI2Vsc2UKICNkZWZpbmUgZHByaW50 Zih4LCBhcmcuLi4pCiAjZW5kaWYKIAorc3RydWN0IGdwaW9jX3NvZnRjIHsKKwlkZXZpY2Vf dAkJc2NfZGV2OwkJLyogZ3Bpb2NYIGRldiAqLworCWRldmljZV90CQlzY19wZGV2OwkvKiBn cGlvWCBkZXYgKi8KKwlzdHJ1Y3QgY2RldgkJKnNjX2N0bF9kZXY7CS8qIGNvbnRyb2xsZXIg ZGV2aWNlICovCisJaW50CQkJc2NfdW5pdDsKKwlpbnQJCQlzY19ucGluczsKKwlzdHJ1Y3Qg Z3Bpb2NfcGluX2ludHIJKnNjX3Bpbl9pbnRyOworfTsKKworc3RydWN0IGdwaW9jX3Bpbl9p bnRyIHsKKwlzdHJ1Y3QgZ3Bpb2Nfc29mdGMJCQkJKnNjOworCWdwaW9fcGluX3QJCQkJCXBp bjsKKwlib29sCQkJCQkJY29uZmlnX2xvY2tlZDsKKwlpbnQJCQkJCQlpbnRyX3JpZDsKKwlz dHJ1Y3QgcmVzb3VyY2UJCQkJCSppbnRyX3JlczsKKwl2b2lkCQkJCQkJKmludHJfY29va2ll OworCXN0cnVjdCBtdHgJCQkJCW10eDsKKwlTTElTVF9IRUFEKGdwaW9jX3ByaXZzX2xpc3Qs IGdwaW9jX3ByaXZzKQlwcml2czsKK307CisKK3N0cnVjdCBncGlvY19ldmVudCB7CisJdWlu dDMyX3QgcGluOworCXN0cnVjdCBiaW50aW1lIGJ0OworfTsKKworc3RydWN0IGdwaW9jX2V2 ZW50cyB7CisJc3RydWN0IGdwaW9jX2V2ZW50IGV2ZW50OworCVNUQUlMUV9FTlRSWShncGlv Y19ldmVudHMpIG5leHQ7Cit9OworCitzdHJ1Y3QgZ3Bpb2NfY2RldnByaXYgeworCXN0cnVj dCBncGlvY19zb2Z0YwkJCSpzYzsKKwl1aW50MzJfdAkJCQlsYXN0X2ludHJfcGluOworCXN0 cnVjdCBzZWxpbmZvCQkJCXNlbGluZm87CisJYm9vbAkJCQkJYXN5bmM7CisJc3RydWN0IHNp Z2lvCQkJCSpzaWdpbzsKKwlzdHJ1Y3QgbXR4CQkJCW10eDsKKwlTVEFJTFFfSEVBRChncGlv Y19ldmVudF9saXN0LCBncGlvY19ldmVudHMpIGV2ZW50czsKKwlTTElTVF9IRUFEKGdwaW9j X3BpbnNfbGlzdCwgZ3Bpb2NfcGlucykJcGluczsKK307CisKK3N0cnVjdCBncGlvY19wcml2 cyB7CisJc3RydWN0IGdwaW9jX2NkZXZwcml2CQkqcHJpdjsKKwlTTElTVF9FTlRSWShncGlv Y19wcml2cykJbmV4dDsKK307CisKK3N0cnVjdCBncGlvY19waW5zIHsKKwlzdHJ1Y3QgZ3Bp b2NfcGluX2ludHIJKnBpbjsKKwlTTElTVF9FTlRSWShncGlvY19waW5zKQluZXh0OworfTsK Kworc3RhdGljIE1BTExPQ19ERUZJTkUoTV9HUElPQywgImdwaW9jIiwgImdwaW9jIGRldmlj ZSBkYXRhIik7CisKK3N0YXRpYyBpbnQJZ3Bpb2NfYWxsb2NhdGVfcGluX2ludHIoc3RydWN0 IGdwaW9jX3Bpbl9pbnRyKiwgdWludDMyX3QpOworc3RhdGljIGludAlncGlvY19yZWxlYXNl X3Bpbl9pbnRyKHN0cnVjdCBncGlvY19waW5faW50ciopOworc3RhdGljIGludAlncGlvY19h dHRhY2hfcHJpdl9waW4oc3RydWN0IGdwaW9jX2NkZXZwcml2KiwKKwkJc3RydWN0IGdwaW9j X3Bpbl9pbnRyKik7CitzdGF0aWMgaW50CWdwaW9jX2RldGFjaF9wcml2X3BpbihzdHJ1Y3Qg Z3Bpb2NfY2RldnByaXYqLAorCQlzdHJ1Y3QgZ3Bpb2NfcGluX2ludHIqKTsKK3N0YXRpYyBi b29sCWdwaW9jX2ludHJfcmVjb25maWdfYWxsb3dlZChzdHJ1Y3QgZ3Bpb2NfY2RldnByaXYq LAorCQlzdHJ1Y3QgZ3Bpb2NfcGluX2ludHIgKmludHJfY29uZik7CitzdGF0aWMgdWludDMy X3QJZ3Bpb2NfZ2V0X2ludHJfY29uZmlnKHN0cnVjdCBncGlvY19zb2Z0YyosCisJCXN0cnVj dCBncGlvY19jZGV2cHJpdiosIHVpbnQzMl90IHBpbik7CitzdGF0aWMgaW50CWdwaW9jX3Nl dF9pbnRyX2NvbmZpZyhzdHJ1Y3QgZ3Bpb2Nfc29mdGMqLAorCQlzdHJ1Y3QgZ3Bpb2NfY2Rl dnByaXYqLCB1aW50MzJfdCwgdWludDMyX3QpOworc3RhdGljIHZvaWQJZ3Bpb2NfaW50ZXJy dXB0X2hhbmRsZXIodm9pZCopOworCiBzdGF0aWMgaW50IGdwaW9jX3Byb2JlKGRldmljZV90 IGRldik7CiBzdGF0aWMgaW50IGdwaW9jX2F0dGFjaChkZXZpY2VfdCBkZXYpOwogc3RhdGlj IGludCBncGlvY19kZXRhY2goZGV2aWNlX3QgZGV2KTsKIAorc3RhdGljIHZvaWQgZ3Bpb2Nf Y2RldnByaXZfZHRvcih2b2lkKik7CisKK3N0YXRpYyBkX29wZW5fdAkJZ3Bpb2Nfb3BlbjsK K3N0YXRpYyBkX3JlYWRfdAkJZ3Bpb2NfcmVhZDsKIHN0YXRpYyBkX2lvY3RsX3QJZ3Bpb2Nf aW9jdGw7CitzdGF0aWMgZF9wb2xsX3QJCWdwaW9jX3BvbGw7CitzdGF0aWMgZF9rcWZpbHRl cl90CWdwaW9jX2txZmlsdGVyOwogCitzdGF0aWMgaW50CQlncGlvY19rcXJlYWQoc3RydWN0 IGtub3RlKiwgbG9uZyk7CitzdGF0aWMgdm9pZAkJZ3Bpb2Nfa3FkZXRhY2goc3RydWN0IGtu b3RlKik7CisKKwogc3RhdGljIHN0cnVjdCBjZGV2c3cgZ3Bpb2NfY2RldnN3ID0gewogCS5k X3ZlcnNpb24JPSBEX1ZFUlNJT04sCisJLmRfb3BlbgkJPSBncGlvY19vcGVuLAorCS5kX3Jl YWQJCT0gZ3Bpb2NfcmVhZCwKIAkuZF9pb2N0bAk9IGdwaW9jX2lvY3RsLAorCS5kX3BvbGwJ CT0gZ3Bpb2NfcG9sbCwKKwkuZF9rcWZpbHRlcgk9IGdwaW9jX2txZmlsdGVyLAogCS5kX25h bWUJCT0gImdwaW9jIiwKIH07CiAKLXN0cnVjdCBncGlvY19zb2Z0YyB7Ci0JZGV2aWNlX3QJ c2NfZGV2OwkJLyogZ3Bpb2NYIGRldiAqLwotCWRldmljZV90CXNjX3BkZXY7CS8qIGdwaW9Y IGRldiAqLwotCXN0cnVjdCBjZGV2CSpzY19jdGxfZGV2OwkvKiBjb250cm9sbGVyIGRldmlj ZSAqLwotCWludAkJc2NfdW5pdDsKK3N0YXRpYyBzdHJ1Y3QgZmlsdGVyb3BzIGdwaW9jX3Jl YWRfZmlsdGVyb3BzID0geworCS5mX2lzZmQgPQl0cnVlLAorCS5mX2F0dGFjaCA9CU5VTEws CisJLmZfZGV0YWNoID0JZ3Bpb2Nfa3FkZXRhY2gsCisJLmZfZXZlbnQgPQlncGlvY19rcXJl YWQsCisJLmZfdG91Y2ggPQlOVUxMCiB9OwogCi1zdGF0aWMgaW50CisJc3RhdGljIGludAor Z3Bpb2NfYWxsb2NhdGVfcGluX2ludHIoc3RydWN0IGdwaW9jX3Bpbl9pbnRyICppbnRyX2Nv bmYsIHVpbnQzMl90IGZsYWdzKQoreworCWludCBlcnI7CisKKwlpbnRyX2NvbmYtPmNvbmZp Z19sb2NrZWQgPSB0cnVlOworCW10eF91bmxvY2soJmludHJfY29uZi0+bXR4KTsKKworCWlu dHJfY29uZi0+aW50cl9yZXMgPSBncGlvX2FsbG9jX2ludHJfcmVzb3VyY2UoaW50cl9jb25m LT5waW4tPmRldiwKKwkJCSZpbnRyX2NvbmYtPmludHJfcmlkLCBSRl9BQ1RJVkUsIGludHJf Y29uZi0+cGluLCBmbGFncyk7CisJaWYgKGludHJfY29uZi0+aW50cl9yZXMgPT0gTlVMTCkK KwkJcmV0dXJuIChFTlhJTyk7CisKKwllcnIgPSBidXNfc2V0dXBfaW50cihpbnRyX2NvbmYt PnBpbi0+ZGV2LCBpbnRyX2NvbmYtPmludHJfcmVzLAorCQkJSU5UUl9UWVBFX01JU0MgfCBJ TlRSX01QU0FGRSwgTlVMTCwgZ3Bpb2NfaW50ZXJydXB0X2hhbmRsZXIsCisJCQlpbnRyX2Nv bmYsICZpbnRyX2NvbmYtPmludHJfY29va2llKTsKKwlpZiAoZXJyICE9IDApCisJCXJldHVy biAoZXJyKTsKKworCWludHJfY29uZi0+cGluLT5mbGFncyA9IGZsYWdzOworCW10eF9sb2Nr KCZpbnRyX2NvbmYtPm10eCk7CisJaW50cl9jb25mLT5jb25maWdfbG9ja2VkID0gZmFsc2U7 CisJd2FrZXVwKCZpbnRyX2NvbmYtPmNvbmZpZ19sb2NrZWQpOworCisJcmV0dXJuICgwKTsK K30KKworCXN0YXRpYyBpbnQKK2dwaW9jX3JlbGVhc2VfcGluX2ludHIoc3RydWN0IGdwaW9j X3Bpbl9pbnRyICppbnRyX2NvbmYpCit7CisJaW50IGVycjsKKworCWludHJfY29uZi0+Y29u ZmlnX2xvY2tlZCA9IHRydWU7CisJbXR4X3VubG9jaygmaW50cl9jb25mLT5tdHgpOworCisJ aWYgKGludHJfY29uZi0+aW50cl9jb29raWUgIT0gTlVMTCkgeworCQllcnIgPSBidXNfdGVh cmRvd25faW50cihpbnRyX2NvbmYtPnBpbi0+ZGV2LAorCQkJCWludHJfY29uZi0+aW50cl9y ZXMsIGludHJfY29uZi0+aW50cl9jb29raWUpOworCQlpZiAoZXJyICE9IDApCisJCQlyZXR1 cm4gKGVycik7CisJCWVsc2UKKwkJCWludHJfY29uZi0+aW50cl9jb29raWUgPSBOVUxMOwor CX0KKworCWlmIChpbnRyX2NvbmYtPmludHJfcmVzICE9IE5VTEwpIHsKKwkJZXJyID0gYnVz X3JlbGVhc2VfcmVzb3VyY2UoaW50cl9jb25mLT5waW4tPmRldiwgU1lTX1JFU19JUlEsCisJ CQkJaW50cl9jb25mLT5pbnRyX3JpZCwgaW50cl9jb25mLT5pbnRyX3Jlcyk7CisJCWlmIChl cnIgIT0gMCkKKwkJCXJldHVybiAoZXJyKTsKKwkJZWxzZSB7CisJCQlpbnRyX2NvbmYtPmlu dHJfcmlkID0gMDsKKwkJCWludHJfY29uZi0+aW50cl9yZXMgPSBOVUxMOworCQl9CisJfQor CisJaW50cl9jb25mLT5waW4tPmZsYWdzID0gMDsKKwltdHhfbG9jaygmaW50cl9jb25mLT5t dHgpOworCWludHJfY29uZi0+Y29uZmlnX2xvY2tlZCA9IGZhbHNlOworCXdha2V1cCgmaW50 cl9jb25mLT5jb25maWdfbG9ja2VkKTsKKworCXJldHVybiAoMCk7Cit9CisKKwlzdGF0aWMg aW50CitncGlvY19hdHRhY2hfcHJpdl9waW4oc3RydWN0IGdwaW9jX2NkZXZwcml2ICpwcml2 LAorCQlzdHJ1Y3QgZ3Bpb2NfcGluX2ludHIgKmludHJfY29uZikKK3sKKwlzdHJ1Y3QgZ3Bp b2NfcHJpdnMJKnByaXZfbGluazsKKwlzdHJ1Y3QgZ3Bpb2NfcGlucwkqcGluX2xpbms7CisJ dW5zaWduZWQgaW50CQljb25zaXN0ZW5jeV9hLCBjb25zaXN0ZW5jeV9iOworCisJY29uc2lz dGVuY3lfYSA9IDA7CisJY29uc2lzdGVuY3lfYiA9IDA7CisJbXR4X2Fzc2VydCgmaW50cl9j b25mLT5tdHgsIE1BX09XTkVEKTsKKwltdHhfbG9jaygmcHJpdi0+bXR4KTsKKwlTTElTVF9G T1JFQUNIKHByaXZfbGluaywgJmludHJfY29uZi0+cHJpdnMsIG5leHQpIHsKKwkJaWYgKHBy aXZfbGluay0+cHJpdiA9PSBwcml2KQorCQkJY29uc2lzdGVuY3lfYSsrOworCX0KKwlLQVNT RVJUKGNvbnNpc3RlbmN5X2EgPD0gMSwKKwkJCSgiaW5jb25zaXN0ZW50IGxpbmtzIGJldHdl ZW4gcGluIGNvbmZpZyBhbmQgY2RldnByaXYiKSk7CisJU0xJU1RfRk9SRUFDSChwaW5fbGlu aywgJnByaXYtPnBpbnMsIG5leHQpIHsKKwkJaWYgKHBpbl9saW5rLT5waW4gPT0gaW50cl9j b25mKQorCQkJY29uc2lzdGVuY3lfYisrOworCX0KKwlLQVNTRVJUKGNvbnNpc3RlbmN5X2Eg PT0gY29uc2lzdGVuY3lfYiwKKwkJCSgiaW5jb25zaXN0ZW50IGxpbmtzIGJldHdlZW4gcGlu IGNvbmZpZyBhbmQgY2RldnByaXYiKSk7CisJaWYgKGNvbnNpc3RlbmN5X2EgPT0gMSAmJiBj b25zaXN0ZW5jeV9iID09IDEpIHsKKwkJbXR4X3VubG9jaygmcHJpdi0+bXR4KTsKKwkJbXR4 X3VubG9jaygmaW50cl9jb25mLT5tdHgpOworCQlyZXR1cm4gKEVFWElTVCk7CisJfQorCXBy aXZfbGluayA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGdwaW9jX3ByaXZzKSwgTV9HUElPQywK KwkJCU1fTk9XQUlUIHwgTV9aRVJPKTsKKwlpZiAocHJpdl9saW5rID09IE5VTEwpCisJewor CQltdHhfdW5sb2NrKCZwcml2LT5tdHgpOworCQltdHhfdW5sb2NrKCZpbnRyX2NvbmYtPm10 eCk7CisJCXJldHVybiAoRU5PTUVNKTsKKwl9CisJcGluX2xpbmsgPSBtYWxsb2Moc2l6ZW9m KHN0cnVjdCBncGlvY19waW5zKSwgTV9HUElPQywKKwkJCU1fTk9XQUlUIHwgTV9aRVJPKTsK KwlpZiAocGluX2xpbmsgPT0gTlVMTCkgeworCQltdHhfdW5sb2NrKCZwcml2LT5tdHgpOwor CQltdHhfdW5sb2NrKCZpbnRyX2NvbmYtPm10eCk7CisJCXJldHVybiAoRU5PTUVNKTsKKwl9 CisJcHJpdl9saW5rLT5wcml2ID0gcHJpdjsKKwlwaW5fbGluay0+cGluID0gaW50cl9jb25m OworCVNMSVNUX0lOU0VSVF9IRUFEKCZpbnRyX2NvbmYtPnByaXZzLCBwcml2X2xpbmssIG5l eHQpOworCVNMSVNUX0lOU0VSVF9IRUFEKCZwcml2LT5waW5zLCBwaW5fbGluaywgbmV4dCk7 CisJbXR4X3VubG9jaygmcHJpdi0+bXR4KTsKKworCXJldHVybiAoMCk7Cit9CisKKwlzdGF0 aWMgaW50CitncGlvY19kZXRhY2hfcHJpdl9waW4oc3RydWN0IGdwaW9jX2NkZXZwcml2ICpw cml2LAorCQlzdHJ1Y3QgZ3Bpb2NfcGluX2ludHIgKmludHJfY29uZikKK3sKKwlzdHJ1Y3Qg Z3Bpb2NfcHJpdnMJKnByaXZfbGluaywgKnByaXZfbGlua190ZW1wOworCXN0cnVjdCBncGlv Y19waW5zCSpwaW5fbGluaywgKnBpbl9saW5rX3RlbXA7CisJc3RydWN0IGdwaW9jX2V2ZW50 cyAgICAgKmV2c19saW5rLCAqZXZzX2xpbmtfdGVtcDsKKwl1bnNpZ25lZCBpbnQJCWNvbnNp c3RlbmN5X2EsIGNvbnNpc3RlbmN5X2I7CisKKwljb25zaXN0ZW5jeV9hID0gMDsKKwljb25z aXN0ZW5jeV9iID0gMDsKKwltdHhfYXNzZXJ0KCZpbnRyX2NvbmYtPm10eCwgTUFfT1dORUQp OworCW10eF9sb2NrKCZwcml2LT5tdHgpOworCVNMSVNUX0ZPUkVBQ0hfU0FGRShwcml2X2xp bmssICZpbnRyX2NvbmYtPnByaXZzLCBuZXh0LCBwcml2X2xpbmtfdGVtcCkgeworCQlpZiAo cHJpdl9saW5rLT5wcml2ID09IHByaXYpIHsKKwkJCVNMSVNUX1JFTU9WRSgmaW50cl9jb25m LT5wcml2cywgcHJpdl9saW5rLCBncGlvY19wcml2cywKKwkJCQkJbmV4dCk7CisJCQlmcmVl KHByaXZfbGluaywgTV9HUElPQyk7CisJCQljb25zaXN0ZW5jeV9hKys7CisJCX0KKwl9CisK KwlTVEFJTFFfRk9SRUFDSF9TQUZFKGV2c19saW5rLCAmcHJpdi0+ZXZlbnRzLCBuZXh0LCBl dnNfbGlua190ZW1wKSB7CisJCVNUQUlMUV9SRU1PVkUoJnByaXYtPmV2ZW50cyxldnNfbGlu aywgZ3Bpb2NfZXZlbnRzLCBuZXh0KTsKKwkJZnJlZShldnNfbGluaywgTV9HUElPQyk7CisJ CXByaW50ZigiZGVsZXRpbmcgdW5oYW5kbGVkIGV2ZW50XG4iKTsKKwl9CisJS0FTU0VSVChj b25zaXN0ZW5jeV9hIDw9IDEsCisJCQkoImluY29uc2lzdGVudCBsaW5rcyBiZXR3ZWVuIHBp biBjb25maWcgYW5kIGNkZXZwcml2IikpOworCVNMSVNUX0ZPUkVBQ0hfU0FGRShwaW5fbGlu aywgJnByaXYtPnBpbnMsIG5leHQsIHBpbl9saW5rX3RlbXApIHsKKwkJaWYgKHBpbl9saW5r LT5waW4gPT0gaW50cl9jb25mKSB7CisJCQlTTElTVF9SRU1PVkUoJnByaXYtPnBpbnMsIHBp bl9saW5rLCBncGlvY19waW5zLCBuZXh0KTsKKwkJCWZyZWUocGluX2xpbmssIE1fR1BJT0Mp OworCQkJY29uc2lzdGVuY3lfYisrOworCQl9CisJfQorCUtBU1NFUlQoY29uc2lzdGVuY3lf YSA9PSBjb25zaXN0ZW5jeV9iLAorCQkJKCJpbmNvbnNpc3RlbnQgbGlua3MgYmV0d2VlbiBw aW4gY29uZmlnIGFuZCBjZGV2cHJpdiIpKTsKKwltdHhfdW5sb2NrKCZwcml2LT5tdHgpOwor CisJcmV0dXJuICgwKTsKK30KKworCXN0YXRpYyBib29sCitncGlvY19pbnRyX3JlY29uZmln X2FsbG93ZWQoc3RydWN0IGdwaW9jX2NkZXZwcml2ICpwcml2LAorCQlzdHJ1Y3QgZ3Bpb2Nf cGluX2ludHIgKmludHJfY29uZikKK3sKKwlzdHJ1Y3QgZ3Bpb2NfcHJpdnMJKnByaXZfbGlu azsKKworCW10eF9hc3NlcnQoJmludHJfY29uZi0+bXR4LCBNQV9PV05FRCk7CisKKwlpZiAo U0xJU1RfRU1QVFkoJmludHJfY29uZi0+cHJpdnMpKQorCQlyZXR1cm4gKHRydWUpOworCisJ U0xJU1RfRk9SRUFDSChwcml2X2xpbmssICZpbnRyX2NvbmYtPnByaXZzLCBuZXh0KSB7CisJ CWlmIChwcml2X2xpbmstPnByaXYgIT0gcHJpdikKKwkJCXJldHVybiAoZmFsc2UpOworCX0K KworCXJldHVybiAodHJ1ZSk7Cit9CisKKworCXN0YXRpYyB1aW50MzJfdAorZ3Bpb2NfZ2V0 X2ludHJfY29uZmlnKHN0cnVjdCBncGlvY19zb2Z0YyAqc2MsIHN0cnVjdCBncGlvY19jZGV2 cHJpdiAqcHJpdiwKKwkJdWludDMyX3QgcGluKQoreworCXN0cnVjdCBncGlvY19waW5faW50 cgkqaW50cl9jb25mID0gJnNjLT5zY19waW5faW50cltwaW5dOworCXN0cnVjdCBncGlvY19w cml2cwkqcHJpdl9saW5rOworCXVpbnQzMl90CQlmbGFnczsKKworCWZsYWdzID0gaW50cl9j b25mLT5waW4tPmZsYWdzOworCisJaWYgKGZsYWdzID09IDApCisJCXJldHVybiAoMCk7CisK KwlTTElTVF9GT1JFQUNIKHByaXZfbGluaywgJmludHJfY29uZi0+cHJpdnMsIG5leHQpIHsK KwkJaWYgKHByaXZfbGluay0+cHJpdiA9PSBwcml2KSB7CisJCQlmbGFncyB8PSBHUElPX0lO VFJfQVRUQUNIRUQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAoZmxhZ3MpOwor fQorCisJc3RhdGljIGludAorZ3Bpb2Nfc2V0X2ludHJfY29uZmlnKHN0cnVjdCBncGlvY19z b2Z0YyAqc2MsIHN0cnVjdCBncGlvY19jZGV2cHJpdiAqcHJpdiwKKwkJdWludDMyX3QgcGlu LCB1aW50MzJfdCBmbGFncykKK3sKKwlzdHJ1Y3QgZ3Bpb2NfcGluX2ludHIgKmludHJfY29u ZiA9ICZzYy0+c2NfcGluX2ludHJbcGluXTsKKwlpbnQgcmVzOworCisJcmVzID0gMDsKKwlp ZiAoaW50cl9jb25mLT5waW4tPmZsYWdzID09IDAgJiYgZmxhZ3MgPT0gMCkgeworCQkvKiBO byBpbnRlcnJ1cHQgY29uZmlndXJlZCBhbmQgbm9uZSByZXF1ZXN0ZWQ6IERvIG5vdGhpbmcu ICovCisJCXJldHVybiAoMCk7CisJfQorCW10eF9sb2NrKCZpbnRyX2NvbmYtPm10eCk7CisJ d2hpbGUgKGludHJfY29uZi0+Y29uZmlnX2xvY2tlZCA9PSB0cnVlKQorCQltdHhfc2xlZXAo JmludHJfY29uZi0+Y29uZmlnX2xvY2tlZCwgJmludHJfY29uZi0+bXR4LCAwLAorCQkJCSJn cGljZmciLCAwKTsKKwlpZiAoaW50cl9jb25mLT5waW4tPmZsYWdzID09IDAgJiYgZmxhZ3Mg IT0gMCkgeworCQkvKiBObyBpbnRlcnJ1cHQgaXMgY29uZmlndXJlZCwgYnV0IG9uZSBpcyBy ZXF1ZXN0ZWQ6IEFsbG9jYXRlCisJCSAgIGFuZCBzZXR1cCBpbnRlcnJ1cHQgb24gdGhlIGFj Y29yZGluZyBwaW4uICovCisJCXJlcyA9IGdwaW9jX2FsbG9jYXRlX3Bpbl9pbnRyKGludHJf Y29uZiwgZmxhZ3MpOworCQlpZiAocmVzID09IDApCisJCQlyZXMgPSBncGlvY19hdHRhY2hf cHJpdl9waW4ocHJpdiwgaW50cl9jb25mKTsKKwkJaWYgKHJlcyA9PSBFRVhJU1QpCisJCQly ZXMgPSAwOworCX0gZWxzZSBpZiAoaW50cl9jb25mLT5waW4tPmZsYWdzID09IGZsYWdzKSB7 CisJCS8qIFNhbWUgaW50ZXJydXB0IHJlcXVlc3RlZCBhcyBhbHJlYWR5IGNvbmZpZ3VyZWQ6 IEF0dGFjaCB0aGUKKwkJICAgY2RldnByaXYgdG8gdGhlIGNvcnJlc3BvbmRpbmcgcGluLiAq LworCQlyZXMgPSBncGlvY19hdHRhY2hfcHJpdl9waW4ocHJpdiwgaW50cl9jb25mKTsKKwkJ aWYgKHJlcyA9PSBFRVhJU1QpCisJCQlyZXMgPSAwOworCX0gZWxzZSBpZiAoaW50cl9jb25m LT5waW4tPmZsYWdzICE9IDAgJiYgZmxhZ3MgPT0gMCkgeworCQkvKiBJbnRlcnJ1cHQgY29u ZmlndXJlZCwgYnV0IG5vbmUgcmVxdWVzdGVkOiBUZWFyZG93biBhbmQKKwkJICAgcmVsZWFz ZSB0aGUgcGluIHdoZW4gbm8gb3RoZXIgY2RldnByaXYgaXMgYXR0YWNoZWQuCisJCSAgIE90 aGVyd2lzZSBqdXN0IGRldGFjaCBwaW4gYW5kIGNkZXZwcml2IGZyb20gZWFjaCBvdGhlci4g Ki8KKwkJaWYgKGdwaW9jX2ludHJfcmVjb25maWdfYWxsb3dlZChwcml2LCBpbnRyX2NvbmYp KSB7CisJCQlyZXMgPSBncGlvY19yZWxlYXNlX3Bpbl9pbnRyKGludHJfY29uZik7CisJCX0K KwkJaWYgKHJlcyA9PSAwKQorCQkJcmVzID0gZ3Bpb2NfZGV0YWNoX3ByaXZfcGluKHByaXYs IGludHJfY29uZik7CisJfSBlbHNlIHsKKwkJLyogT3RoZXIgZmxhZyByZXF1ZXN0ZWQgdGhh biBjb25maWd1cmVkOiBSZWNvbmZpZ3VyZSB3aGVuIG5vCisJCSAgIG90aGVyIGNkZXZwcml2 IGlzIGFyZSBhdHRhY2hlZCB0byB0aGUgcGluLiAqLworCQlpZiAoIWdwaW9jX2ludHJfcmVj b25maWdfYWxsb3dlZChwcml2LCBpbnRyX2NvbmYpKQorCQkJcmVzID0gRUJVU1k7CisJCWVs c2UgeworCQkJcmVzID0gZ3Bpb2NfcmVsZWFzZV9waW5faW50cihpbnRyX2NvbmYpOworCQkJ aWYgKHJlcyA9PSAwKQorCQkJCXJlcyA9IGdwaW9jX2FsbG9jYXRlX3Bpbl9pbnRyKGludHJf Y29uZiwgZmxhZ3MpOworCQkJaWYgKHJlcyA9PSAwKQorCQkJCXJlcyA9IGdwaW9jX2F0dGFj aF9wcml2X3Bpbihwcml2LCBpbnRyX2NvbmYpOworCQkJaWYgKHJlcyA9PSBFRVhJU1QpCisJ CQkJcmVzID0gMDsKKwkJfQorCX0KKwltdHhfdW5sb2NrKCZpbnRyX2NvbmYtPm10eCk7CisK KwlyZXR1cm4gKHJlcyk7Cit9CisKKwlzdGF0aWMgdm9pZAorZ3Bpb2NfaW50ZXJydXB0X2hh bmRsZXIodm9pZCAqYXJnKQoreworCXN0cnVjdCBncGlvY19waW5faW50ciAqaW50cl9jb25m ID0gYXJnOworCXN0cnVjdCBncGlvY19zb2Z0YyAqc2MgPSBpbnRyX2NvbmYtPnNjOworCXN0 cnVjdCBncGlvY19wcml2cyAqcHJpdnM7CisKKwltdHhfbG9jaygmaW50cl9jb25mLT5tdHgp OworCisJaWYgKGludHJfY29uZi0+Y29uZmlnX2xvY2tlZCA9PSB0cnVlKSB7CisJCWRldmlj ZV9wcmludGYoc2MtPnNjX2RldiwgIkludGVycnVwdCBjb25maWd1cmF0aW9uIGluICIKKwkJ CQkicHJvZ3Jlc3MuIERpc2NhcmRpbmcgaW50ZXJydXB0IG9uIHBpbiAlZC5cbiIsCisJCQkJ aW50cl9jb25mLT5waW4tPnBpbik7CisJCW10eF91bmxvY2soJmludHJfY29uZi0+bXR4KTsK KwkJcmV0dXJuOworCX0KKworCWlmIChTTElTVF9FTVBUWSgmaW50cl9jb25mLT5wcml2cykp IHsKKwkJZGV2aWNlX3ByaW50ZihzYy0+c2NfZGV2LCAiTm8gZmlsZSBkZXNjcmlwdG9yIGFz c29jaWF0ZWQgd2l0aCAiCisJCQkJIm9jY3VycmVkIGludGVycnVwdCBvbiBwaW4gJWQuXG4i LCBpbnRyX2NvbmYtPnBpbi0+cGluKTsKKwkJbXR4X3VubG9jaygmaW50cl9jb25mLT5tdHgp OworCQlyZXR1cm47CisJfQorCisJU0xJU1RfRk9SRUFDSChwcml2cywgJmludHJfY29uZi0+ cHJpdnMsIG5leHQpIHsKKwkJbXR4X2xvY2soJnByaXZzLT5wcml2LT5tdHgpOworCQlzdHJ1 Y3QgZ3Bpb2NfZXZlbnRzICpldmVudD1tYWxsb2Moc2l6ZW9mKHN0cnVjdCBncGlvY19ldmVu dHMpLCBNX0dQSU9DLCBNX05PV0FJVCB8IE1fWkVSTyk7CisJCWlmKGV2ZW50KXsKKwkJCWV2 ZW50LT5ldmVudC5waW49aW50cl9jb25mLT5waW4tPnBpbjsKKwkJCWdldGJpbnRpbWUoJmV2 ZW50LT5ldmVudC5idCk7CisJCQlTVEFJTFFfSU5TRVJUX1RBSUwoJnByaXZzLT5wcml2LT5l dmVudHMsZXZlbnQsbmV4dCk7CisJCQlwcml2cy0+cHJpdi0+bGFzdF9pbnRyX3BpbiA9IGlu dHJfY29uZi0+cGluLT5waW47CisJCX1lbHNleworCQkJaWYgKHByaXZzLT5wcml2LT5sYXN0 X2ludHJfcGluICE9IC0xKQorCQkJCWRldmljZV9wcmludGYoc2MtPnNjX2RldiwgIlVuaGFu ZGxlZCBpbnRlcnJ1cHQgb24gcGluICIKKwkJCQkJCSIlZC5cbiIsIGludHJfY29uZi0+cGlu LT5waW4pOworCQkJcHJpdnMtPnByaXYtPmxhc3RfaW50cl9waW4gPSBpbnRyX2NvbmYtPnBp bi0+cGluOworCisJCX0KKwkJd2FrZXVwKHByaXZzLT5wcml2KTsKKwkJc2Vsd2FrZXVwKCZw cml2cy0+cHJpdi0+c2VsaW5mbyk7CisJCUtOT1RFX0xPQ0tFRCgmcHJpdnMtPnByaXYtPnNl bGluZm8uc2lfbm90ZSwgMCk7CisJCWlmIChwcml2cy0+cHJpdi0+YXN5bmMgPT0gdHJ1ZSAm JiBwcml2cy0+cHJpdi0+c2lnaW8gIT0gTlVMTCkKKwkJCXBnc2lnaW8oJnByaXZzLT5wcml2 LT5zaWdpbywgU0lHSU8sIDApOworCQltdHhfdW5sb2NrKCZwcml2cy0+cHJpdi0+bXR4KTsK Kwl9CisKKwltdHhfdW5sb2NrKCZpbnRyX2NvbmYtPm10eCk7Cit9CisKKwlzdGF0aWMgaW50 CiBncGlvY19wcm9iZShkZXZpY2VfdCBkZXYpCiB7CiAJZGV2aWNlX3NldF9kZXNjKGRldiwg IkdQSU8gY29udHJvbGxlciIpOwogCXJldHVybiAoMCk7CiB9CiAKLXN0YXRpYyBpbnQKKwlz dGF0aWMgaW50CiBncGlvY19hdHRhY2goZGV2aWNlX3QgZGV2KQogewogCWludCBlcnI7CkBA IC04OCw2ICs0ODgsMjIgQEAKIAlzYy0+c2NfZGV2ID0gZGV2OwogCXNjLT5zY19wZGV2ID0g ZGV2aWNlX2dldF9wYXJlbnQoZGV2KTsKIAlzYy0+c2NfdW5pdCA9IGRldmljZV9nZXRfdW5p dChkZXYpOworCisJZXJyID0gR1BJT19QSU5fTUFYKHNjLT5zY19wZGV2LCAmc2MtPnNjX25w aW5zKTsKKwlpZiAoZXJyICE9IDApCisJCXJldHVybiAoZXJyKTsKKwlzYy0+c2NfcGluX2lu dHIgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBncGlvY19waW5faW50cikgKiBzYy0+c2NfbnBp bnMsCisJCQlNX0dQSU9DLCBNX1dBSVRPSyB8IE1fWkVSTyk7CisJZm9yIChpbnQgaSA9IDA7 IGkgPD0gc2MtPnNjX25waW5zOyBpKyspIHsKKwkJc2MtPnNjX3Bpbl9pbnRyW2ldLnBpbiA9 IG1hbGxvYyhzaXplb2Yoc3RydWN0IGdwaW9idXNfcGluKSwKKwkJCQlNX0dQSU9DLCBNX1dB SVRPSyB8IE1fWkVSTyk7CisJCXNjLT5zY19waW5faW50cltpXS5zYyA9IHNjOworCQlzYy0+ c2NfcGluX2ludHJbaV0ucGluLT5waW4gPSBpOworCQlzYy0+c2NfcGluX2ludHJbaV0ucGlu LT5kZXYgPSBzYy0+c2NfcGRldjsKKwkJbXR4X2luaXQoJnNjLT5zY19waW5faW50cltpXS5t dHgsICJncGlvYyBwaW4iLCBOVUxMLCBNVFhfREVGKTsKKwkJU0xJU1RfSU5JVCgmc2MtPnNj X3Bpbl9pbnRyW2ldLnByaXZzKTsKKwl9CisKIAltYWtlX2Rldl9hcmdzX2luaXQoJmRldmFy Z3MpOwogCWRldmFyZ3MubWRhX2RldnN3ID0gJmdwaW9jX2NkZXZzdzsKIAlkZXZhcmdzLm1k YV91aWQgPSBVSURfUk9PVDsKQEAgLTEwMyw3ICs1MTksNyBAQAogCXJldHVybiAoMCk7CiB9 CiAKLXN0YXRpYyBpbnQKKwlzdGF0aWMgaW50CiBncGlvY19kZXRhY2goZGV2aWNlX3QgZGV2 KQogewogCXN0cnVjdCBncGlvY19zb2Z0YyAqc2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7 CkBAIC0xMTIsMTkgKzUyOCwxNDggQEAKIAlpZiAoc2MtPnNjX2N0bF9kZXYpCiAJCWRlc3Ry b3lfZGV2KHNjLT5zY19jdGxfZGV2KTsKIAorCWZvciAoaW50IGkgPSAwOyBpIDw9IHNjLT5z Y19ucGluczsgaSsrKSB7CisJCW10eF9kZXN0cm95KCZzYy0+c2NfcGluX2ludHJbaV0ubXR4 KTsKKwkJZnJlZSgmc2MtPnNjX3Bpbl9pbnRyW2ldLnBpbiwgTV9HUElPQyk7CisJfQorCWZy ZWUoc2MtPnNjX3Bpbl9pbnRyLCBNX0dQSU9DKTsKKwogCWlmICgoZXJyID0gYnVzX2dlbmVy aWNfZGV0YWNoKGRldikpICE9IDApCiAJCXJldHVybiAoZXJyKTsKIAogCXJldHVybiAoMCk7 CiB9CiAKLXN0YXRpYyBpbnQgCisJc3RhdGljIHZvaWQKK2dwaW9jX2NkZXZwcml2X2R0b3Io dm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ3Bpb2NfY2RldnByaXYJKnByaXY7CisJc3RydWN0 IGdwaW9jX3ByaXZzCSpwcml2X2xpbmssICpwcml2X2xpbmtfdGVtcDsKKwlzdHJ1Y3QgZ3Bp b2NfcGlucwkqcGluX2xpbmssICpwaW5fbGlua190ZW1wOworCXVuc2lnbmVkIGludAkJY29u c2lzdGVuY3k7CisKKwlwcml2ID0gZGF0YTsKKworCVNMSVNUX0ZPUkVBQ0hfU0FGRShwaW5f bGluaywgJnByaXYtPnBpbnMsIG5leHQsIHBpbl9saW5rX3RlbXApIHsKKwkJY29uc2lzdGVu Y3kgPSAwOworCQltdHhfbG9jaygmcGluX2xpbmstPnBpbi0+bXR4KTsKKwkJd2hpbGUgKHBp bl9saW5rLT5waW4tPmNvbmZpZ19sb2NrZWQgPT0gdHJ1ZSkKKwkJCW10eF9zbGVlcCgmcGlu X2xpbmstPnBpbi0+Y29uZmlnX2xvY2tlZCwKKwkJCQkJJnBpbl9saW5rLT5waW4tPm10eCwg MCwgImdwaWNmZyIsIDApOworCQlTTElTVF9GT1JFQUNIX1NBRkUocHJpdl9saW5rLCAmcGlu X2xpbmstPnBpbi0+cHJpdnMsIG5leHQsCisJCQkJcHJpdl9saW5rX3RlbXApIHsKKwkJCWlm IChwcml2X2xpbmstPnByaXYgPT0gcHJpdikgeworCQkJCVNMSVNUX1JFTU9WRSgmcGluX2xp bmstPnBpbi0+cHJpdnMsIHByaXZfbGluaywKKwkJCQkJCWdwaW9jX3ByaXZzLCBuZXh0KTsK KwkJCQlmcmVlKHByaXZfbGluaywgTV9HUElPQyk7CisJCQkJY29uc2lzdGVuY3krKzsKKwkJ CX0KKwkJfQorCQlLQVNTRVJUKGNvbnNpc3RlbmN5ID09IDEsCisJCQkJKCJpbmNvbnNpc3Rl bnQgbGlua3MgYmV0d2VlbiBwaW4gY29uZmlnIGFuZCBjZGV2cHJpdiIpKTsKKwkJaWYgKGdw aW9jX2ludHJfcmVjb25maWdfYWxsb3dlZChwcml2LCBwaW5fbGluay0+cGluKSkgeworCQkJ Z3Bpb2NfcmVsZWFzZV9waW5faW50cihwaW5fbGluay0+cGluKTsKKwkJfQorCQltdHhfdW5s b2NrKCZwaW5fbGluay0+cGluLT5tdHgpOworCQlTTElTVF9SRU1PVkUoJnByaXYtPnBpbnMs IHBpbl9saW5rLCBncGlvY19waW5zLCBuZXh0KTsKKwkJZnJlZShwaW5fbGluaywgTV9HUElP Qyk7CisJfQorCisJd2FrZXVwKCZwcml2KTsKKwlrbmxpc3RfY2xlYXIoJnByaXYtPnNlbGlu Zm8uc2lfbm90ZSwgMCk7CisJc2VsZHJhaW4oJnByaXYtPnNlbGluZm8pOworCWtubGlzdF9k ZXN0cm95KCZwcml2LT5zZWxpbmZvLnNpX25vdGUpOworCWZ1bnNldG93bigmcHJpdi0+c2ln aW8pOworCisJbXR4X2Rlc3Ryb3koJnByaXYtPm10eCk7CisJZnJlZShkYXRhLCBNX0dQSU9D KTsKK30KKworCXN0YXRpYyBpbnQKK2dwaW9jX29wZW4oc3RydWN0IGNkZXYgKmRldiwgaW50 IG9mbGFncywgaW50IGRldnR5cGUsIHN0cnVjdCB0aHJlYWQgKnRkKQoreworCXN0cnVjdCBn cGlvY19jZGV2cHJpdiAqcHJpdjsKKwlpbnQgZXJyOworCisJcHJpdiA9IG1hbGxvYyhzaXpl b2YoKnByaXYpLCBNX0dQSU9DLCBNX1dBSVRPSyB8IE1fWkVSTyk7CisJZXJyID0gZGV2ZnNf c2V0X2NkZXZwcml2KHByaXYsIGdwaW9jX2NkZXZwcml2X2R0b3IpOworCWlmIChlcnIgIT0g MCkgeworCQlncGlvY19jZGV2cHJpdl9kdG9yKHByaXYpOworCQlyZXR1cm4gKGVycik7CisJ fQorCXByaXYtPnNjID0gZGV2LT5zaV9kcnYxOworCXByaXYtPmxhc3RfaW50cl9waW4gPSAt MTsKKwlTVEFJTFFfSU5JVCgmcHJpdi0+ZXZlbnRzKTsKKwltdHhfaW5pdCgmcHJpdi0+bXR4 LCAiZ3Bpb2MgcHJpdiIsIE5VTEwsIE1UWF9ERUYpOworCWtubGlzdF9pbml0X210eCgmcHJp di0+c2VsaW5mby5zaV9ub3RlLCAmcHJpdi0+bXR4KTsKKworCXJldHVybiAoMCk7Cit9CisK KwlzdGF0aWMgaW50CitncGlvY19yZWFkKHN0cnVjdCBjZGV2ICpkZXYsIHN0cnVjdCB1aW8g KnVpbywgaW50IGlvZmxhZykKK3sKKwlzdHJ1Y3QgZ3Bpb2NfY2RldnByaXYgKnByaXY7CisJ dWludDMyX3QgbGFzdF9pbnRyX3BpbjsKKwlpbnQgZXJyOworCisJaWYgKHVpby0+dWlvX3Jl c2lkIDwgc2l6ZW9mKHByaXYtPmxhc3RfaW50cl9waW4pKQorCQlyZXR1cm4gRUlOVkFMOwor CisJZXJyID0gZGV2ZnNfZ2V0X2NkZXZwcml2KCh2b2lkICoqKSZwcml2KTsKKwlpZiAoZXJy ICE9IDApCisJCXJldHVybiBlcnI7CisKKwltdHhfbG9jaygmcHJpdi0+bXR4KTsKKwkKKwlp ZighU1RBSUxRX0VNUFRZKCZwcml2LT5ldmVudHMpKXsKKwkJc3RydWN0IGdwaW9jX2V2ZW50 cyAqZXZlbnQ9U1RBSUxRX0ZJUlNUKCZwcml2LT5ldmVudHMpOworCisJCVNUQUlMUV9SRU1P VkVfSEVBRCgmcHJpdi0+ZXZlbnRzLCBuZXh0KTsKKwkJaWYoU1RBSUxRX0VNUFRZKCZwcml2 LT5ldmVudHMpKXsKKwkJCXByaXYtPmxhc3RfaW50cl9waW4gPSAtMTsKKwkJfQorCisJCW10 eF91bmxvY2soJnByaXYtPm10eCk7CisKKwkJZXJyID0gdWlvbW92ZSgmZXZlbnQtPmV2ZW50 LCBzaXplb2Yoc3RydWN0IGdwaW9jX2V2ZW50KSwgdWlvKTsKKwkJZnJlZShldmVudCwgTV9H UElPQyk7CisJfWVsc2V7CisJCXdoaWxlIChwcml2LT5sYXN0X2ludHJfcGluID09IC0xKSB7 CisJCQlpZiAoU0xJU1RfRU1QVFkoJnByaXYtPnBpbnMpKSB7CisJCQkJZXJyID0gRU5YSU87 CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKGlvZmxhZyAmIE9fTk9OQkxPQ0spIHsKKwkJ CQllcnIgPSBFV09VTERCTE9DSzsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJZXJy ID0gbXR4X3NsZWVwKHByaXYsICZwcml2LT5tdHgsIFBDQVRDSCwgImdwaW50ciIsIDApOwor CQkJCWlmIChlcnIgIT0gMCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoZXJy ID09IDAgJiYgcHJpdi0+bGFzdF9pbnRyX3BpbiAhPSAtMSkgeworCQkJbGFzdF9pbnRyX3Bp biA9IHByaXYtPmxhc3RfaW50cl9waW47CisJCQlwcml2LT5sYXN0X2ludHJfcGluID0gLTE7 CisJCQltdHhfdW5sb2NrKCZwcml2LT5tdHgpOworCQkJZXJyID0gdWlvbW92ZSgmbGFzdF9p bnRyX3Bpbiwgc2l6ZW9mKGxhc3RfaW50cl9waW4pLCB1aW8pOworCQl9IGVsc2UgeworCQkJ bXR4X3VubG9jaygmcHJpdi0+bXR4KTsKKwkJfQorCX0KKworCXJldHVybiAoZXJyKTsKK30K KworCXN0YXRpYyBpbnQgCiBncGlvY19pb2N0bChzdHJ1Y3QgY2RldiAqY2RldiwgdV9sb25n IGNtZCwgY2FkZHJfdCBhcmcsIGludCBmZmxhZywgCi0gICAgc3RydWN0IHRocmVhZCAqdGQp CisJCXN0cnVjdCB0aHJlYWQgKnRkKQogewogCWRldmljZV90IGJ1czsKIAlpbnQgbWF4X3Bp biwgcmVzOwogCXN0cnVjdCBncGlvY19zb2Z0YyAqc2MgPSBjZGV2LT5zaV9kcnYxOworCXN0 cnVjdCBncGlvY19jZGV2cHJpdiAqcHJpdjsKIAlzdHJ1Y3QgZ3Bpb19waW4gcGluOwogCXN0 cnVjdCBncGlvX3JlcSByZXE7CiAJc3RydWN0IGdwaW9fYWNjZXNzXzMyICphMzI7CkBAIC0x NDQsMTAgKzY4OSwxNSBAQAogCQkJYmNvcHkoYXJnLCAmcGluLCBzaXplb2YocGluKSk7CiAJ CQlkcHJpbnRmKCJnZXQgY29uZmlnIHBpbiAlZFxuIiwgcGluLmdwX3Bpbik7CiAJCQlyZXMg PSBHUElPX1BJTl9HRVRGTEFHUyhzYy0+c2NfcGRldiwgcGluLmdwX3BpbiwKLQkJCSAgICAm cGluLmdwX2ZsYWdzKTsKKwkJCQkJJnBpbi5ncF9mbGFncyk7CiAJCQkvKiBGYWlsIGVhcmx5 ICovCiAJCQlpZiAocmVzKQogCQkJCWJyZWFrOworCQkJcmVzID0gZGV2ZnNfZ2V0X2NkZXZw cml2KCh2b2lkICoqKSZwcml2KTsKKwkJCWlmIChyZXMpCisJCQkJYnJlYWs7CisJCQlwaW4u Z3BfZmxhZ3MgfD0gZ3Bpb2NfZ2V0X2ludHJfY29uZmlnKHNjLCBwcml2LAorCQkJCQlwaW4u Z3BfcGluKTsKIAkJCUdQSU9fUElOX0dFVENBUFMoc2MtPnNjX3BkZXYsIHBpbi5ncF9waW4s ICZwaW4uZ3BfY2Fwcyk7CiAJCQlHUElPQlVTX1BJTl9HRVROQU1FKGJ1cywgcGluLmdwX3Bp biwgcGluLmdwX25hbWUpOwogCQkJYmNvcHkoJnBpbiwgYXJnLCBzaXplb2YocGluKSk7CkBA IC0xNTUsNTYgKzcwNSwxNzMgQEAKIAkJY2FzZSBHUElPU0VUQ09ORklHOgogCQkJYmNvcHko YXJnLCAmcGluLCBzaXplb2YocGluKSk7CiAJCQlkcHJpbnRmKCJzZXQgY29uZmlnIHBpbiAl ZFxuIiwgcGluLmdwX3Bpbik7Ci0JCQlyZXMgPSBHUElPX1BJTl9HRVRDQVBTKHNjLT5zY19w ZGV2LCBwaW4uZ3BfcGluLCAmY2Fwcyk7CisJCQlyZXMgPSBkZXZmc19nZXRfY2RldnByaXYo KHZvaWQgKiopJnByaXYpOwogCQkJaWYgKHJlcyA9PSAwKQorCQkJCXJlcyA9IEdQSU9fUElO X0dFVENBUFMoc2MtPnNjX3BkZXYsIHBpbi5ncF9waW4sCisJCQkJCQkmY2Fwcyk7CisJCQlp ZiAocmVzID09IDApCiAJCQkJcmVzID0gZ3Bpb19jaGVja19mbGFncyhjYXBzLCBwaW4uZ3Bf ZmxhZ3MpOwogCQkJaWYgKHJlcyA9PSAwKQogCQkJCXJlcyA9IEdQSU9fUElOX1NFVEZMQUdT KHNjLT5zY19wZGV2LCBwaW4uZ3BfcGluLAotCQkJCSAgICBwaW4uZ3BfZmxhZ3MpOworCQkJ CQkJKHBpbi5ncF9mbGFncyAmIH5HUElPX0lOVFJfTUFTSykpOworCQkJaWYgKHJlcyA9PSAw KQorCQkJCXJlcyA9IGdwaW9jX3NldF9pbnRyX2NvbmZpZyhzYywgcHJpdiwKKwkJCQkJCXBp bi5ncF9waW4sCisJCQkJCQkocGluLmdwX2ZsYWdzICYgR1BJT19JTlRSX01BU0spKTsKIAkJ CWJyZWFrOwogCQljYXNlIEdQSU9HRVQ6CiAJCQliY29weShhcmcsICZyZXEsIHNpemVvZihy ZXEpKTsKIAkJCXJlcyA9IEdQSU9fUElOX0dFVChzYy0+c2NfcGRldiwgcmVxLmdwX3BpbiwK LQkJCSAgICAmcmVxLmdwX3ZhbHVlKTsKKwkJCQkJJnJlcS5ncF92YWx1ZSk7CiAJCQlkcHJp bnRmKCJyZWFkIHBpbiAlZCAtPiAlZFxuIiwgCi0JCQkgICAgcmVxLmdwX3BpbiwgcmVxLmdw X3ZhbHVlKTsKKwkJCQkJcmVxLmdwX3BpbiwgcmVxLmdwX3ZhbHVlKTsKIAkJCWJjb3B5KCZy ZXEsIGFyZywgc2l6ZW9mKHJlcSkpOwogCQkJYnJlYWs7CiAJCWNhc2UgR1BJT1NFVDoKIAkJ CWJjb3B5KGFyZywgJnJlcSwgc2l6ZW9mKHJlcSkpOwogCQkJcmVzID0gR1BJT19QSU5fU0VU KHNjLT5zY19wZGV2LCByZXEuZ3BfcGluLCAKLQkJCSAgICByZXEuZ3BfdmFsdWUpOworCQkJ CQlyZXEuZ3BfdmFsdWUpOwogCQkJZHByaW50Zigid3JpdGUgcGluICVkIC0+ICVkXG4iLCAK LQkJCSAgICByZXEuZ3BfcGluLCByZXEuZ3BfdmFsdWUpOworCQkJCQlyZXEuZ3BfcGluLCBy ZXEuZ3BfdmFsdWUpOwogCQkJYnJlYWs7CiAJCWNhc2UgR1BJT1RPR0dMRToKIAkJCWJjb3B5 KGFyZywgJnJlcSwgc2l6ZW9mKHJlcSkpOwogCQkJZHByaW50ZigidG9nZ2xlIHBpbiAlZFxu IiwgCi0JCQkgICAgcmVxLmdwX3Bpbik7CisJCQkJCXJlcS5ncF9waW4pOwogCQkJcmVzID0g R1BJT19QSU5fVE9HR0xFKHNjLT5zY19wZGV2LCByZXEuZ3BfcGluKTsKIAkJCWJyZWFrOwog CQljYXNlIEdQSU9TRVROQU1FOgogCQkJYmNvcHkoYXJnLCAmcGluLCBzaXplb2YocGluKSk7 CiAJCQlkcHJpbnRmKCJzZXQgbmFtZSBvbiBwaW4gJWRcbiIsIHBpbi5ncF9waW4pOwogCQkJ cmVzID0gR1BJT0JVU19QSU5fU0VUTkFNRShidXMsIHBpbi5ncF9waW4sCi0JCQkgICAgcGlu LmdwX25hbWUpOworCQkJCQlwaW4uZ3BfbmFtZSk7CiAJCQlicmVhazsKIAkJY2FzZSBHUElP QUNDRVNTMzI6CiAJCQlhMzIgPSAoc3RydWN0IGdwaW9fYWNjZXNzXzMyICopYXJnOwogCQkJ cmVzID0gR1BJT19QSU5fQUNDRVNTXzMyKHNjLT5zY19wZGV2LCBhMzItPmZpcnN0X3BpbiwK LQkJCSAgICBhMzItPmNsZWFyX3BpbnMsIGEzMi0+Y2hhbmdlX3BpbnMsICZhMzItPm9yaWdf cGlucyk7CisJCQkJCWEzMi0+Y2xlYXJfcGlucywgYTMyLT5vcmlnX3BpbnMsICZhMzItPm9y aWdfcGlucyk7CiAJCQlicmVhazsKIAkJY2FzZSBHUElPQ09ORklHMzI6CiAJCQljMzIgPSAo c3RydWN0IGdwaW9fY29uZmlnXzMyICopYXJnOwogCQkJcmVzID0gR1BJT19QSU5fQ09ORklH XzMyKHNjLT5zY19wZGV2LCBjMzItPmZpcnN0X3BpbiwKLQkJCSAgICBjMzItPm51bV9waW5z LCBjMzItPnBpbl9mbGFncyk7CisJCQkJCWMzMi0+bnVtX3BpbnMsIGMzMi0+cGluX2ZsYWdz KTsKIAkJCWJyZWFrOworCQljYXNlIEZJT05CSU86CisJCQkvKiBUaGlzIGR1bW15IGhhbmRs ZXIgaXMgbmVjZXNzYXJ5IHRvIHByZXZlbnQgZmNudGwoKQorCQkJICAgZnJvbSBmYWlsaW5n LiBUaGUgYWN0dWFsIGhhbmRsaW5nIG9mIG5vbi1ibG9ja2luZyBJTworCQkJICAgaXMgZG9u ZSB1c2luZyB0aGUgT19OT05CTE9DSyBpb2ZsYWcgcGFzc2VkIHRvIHRoZQorCQkJICAgcmVh ZCgpIHN5c2NhbGwuICovCisJCQlyZXMgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgRklPQVNZ TkM6CisJCQlyZXMgPSBkZXZmc19nZXRfY2RldnByaXYoKHZvaWQgKiopJnByaXYpOworCQkJ aWYgKHJlcyA9PSAwKSB7CisJCQkJaWYgKCooaW50ICopYXJnID09IEZBU1lOQykKKwkJCQkJ cHJpdi0+YXN5bmMgPSB0cnVlOworCQkJCWVsc2UKKwkJCQkJcHJpdi0+YXN5bmMgPSBmYWxz ZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEZJT0dFVE9XTjoKKwkJCXJlcyA9IGRldmZz X2dldF9jZGV2cHJpdigodm9pZCAqKikmcHJpdik7CisJCQlpZiAocmVzID09IDApCisJCQkJ KihpbnQgKilhcmcgPSBmZ2V0b3duKCZwcml2LT5zaWdpbyk7CisJCQlicmVhazsKKwkJY2Fz ZSBGSU9TRVRPV046CisJCQlyZXMgPSBkZXZmc19nZXRfY2RldnByaXYoKHZvaWQgKiopJnBy aXYpOworCQkJaWYgKHJlcyA9PSAwKQorCQkJCXJlcyA9IGZzZXRvd24oKihpbnQgKilhcmcs ICZwcml2LT5zaWdpbyk7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAoRU5P VFRZKTsKIAkJCWJyZWFrOwogCX0KIAogCXJldHVybiAocmVzKTsKK30KKworCXN0YXRpYyBp bnQKK2dwaW9jX3BvbGwoc3RydWN0IGNkZXYgKmRldiwgaW50IGV2ZW50cywgc3RydWN0IHRo cmVhZCAqdGQpCit7CisJc3RydWN0IGdwaW9jX2NkZXZwcml2ICpwcml2OworCWludCBlcnI7 CisJaW50IHJldmVudHM7CisKKwlyZXZlbnRzID0gMDsKKworCWVyciA9IGRldmZzX2dldF9j ZGV2cHJpdigodm9pZCAqKikmcHJpdik7CisJaWYgKGVyciAhPSAwKSB7CisJCXJldmVudHMg PSBQT0xMRVJSOworCQlyZXR1cm4gKHJldmVudHMpOworCX0KKworCWlmIChTTElTVF9FTVBU WSgmcHJpdi0+cGlucykpIHsKKwkJcmV2ZW50cyA9IFBPTExIVVA7CisJCXJldHVybiAocmV2 ZW50cyk7CisJfQorCisJaWYgKGV2ZW50cyAmIChQT0xMSU4gfCBQT0xMUkROT1JNKSkgewor CQlpZiAocHJpdi0+bGFzdF9pbnRyX3BpbiAhPSAtMSkKKwkJCXJldmVudHMgfD0gZXZlbnRz ICYgKFBPTExJTiB8IFBPTExSRE5PUk0pOworCQllbHNlCisJCQlzZWxyZWNvcmQodGQsICZw cml2LT5zZWxpbmZvKTsKKwl9CisKKwlyZXR1cm4gKHJldmVudHMpOworfQorCisJc3RhdGlj IGludAorZ3Bpb2Nfa3FmaWx0ZXIoc3RydWN0IGNkZXYgKmRldiwgc3RydWN0IGtub3RlICpr bikKK3svL2F0dGFjaCB0byBrcXVldWUKKwlzdHJ1Y3QgZ3Bpb2NfY2RldnByaXYgKnByaXY7 CisJc3RydWN0IGtubGlzdCAqa25saXN0OworCWludCBlcnI7CisKKwllcnIgPSBkZXZmc19n ZXRfY2RldnByaXYoKHZvaWQgKiopJnByaXYpOworCWlmIChlcnIgIT0gMCkKKwkJcmV0dXJu IGVycjsKKworCWlmIChTTElTVF9FTVBUWSgmcHJpdi0+cGlucykpCisJCXJldHVybiAoRU5Y SU8pOworCisJc3dpdGNoKGtuLT5rbl9maWx0ZXIpIHsKKwljYXNlIEVWRklMVF9SRUFEOgor CQlrbi0+a25fZm9wID0gJmdwaW9jX3JlYWRfZmlsdGVyb3BzOworCQlrbi0+a25faG9vayA9 ICh2b2lkICopcHJpdjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIChFT1BOT1RT VVBQKTsKKwl9CisKKwlrbmxpc3QgPSAmcHJpdi0+c2VsaW5mby5zaV9ub3RlOworCWtubGlz dF9hZGQoa25saXN0LCBrbiwgMCk7CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50 CitncGlvY19rcXJlYWQoc3RydWN0IGtub3RlICprbiwgbG9uZyBoaW50KQoreworCXN0cnVj dCBncGlvY19jZGV2cHJpdiAqcHJpdiA9IGtuLT5rbl9ob29rOworCWlmIChTTElTVF9FTVBU WSgmcHJpdi0+cGlucykpIHsKKwkJa24tPmtuX2ZsYWdzIHw9IEVWX0VPRjsKKwkJcmV0dXJu ICgxKTsKKwl9IGVsc2UgeworCQlpZiAocHJpdi0+bGFzdF9pbnRyX3BpbiAhPSAtMSkgewor CQkJa24tPmtuX2RhdGEgPSBzaXplb2YocHJpdi0+bGFzdF9pbnRyX3Bpbik7CisJCQlyZXR1 cm4gKDEpOworCQl9CisJfQorCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB2b2lkCitncGlv Y19rcWRldGFjaChzdHJ1Y3Qga25vdGUgKmtuKQoreworCXN0cnVjdCBncGlvY19jZGV2cHJp diAqcHJpdiA9IGtuLT5rbl9ob29rOworCXN0cnVjdCBrbmxpc3QgKmtubGlzdCA9ICZwcml2 LT5zZWxpbmZvLnNpX25vdGU7CisKKwlrbmxpc3RfcmVtb3ZlKGtubGlzdCwga24sIDApOwog fQogCiBzdGF0aWMgZGV2aWNlX21ldGhvZF90IGdwaW9jX21ldGhvZHNbXSA9IHsKT25seSBp biAvdXNyL2hvbWUvYnVpbGRyb290L3Vzci9zcmMvc3lzL2Rldi9ncGlvOiBncGlvYy5jLm9y aWcKT25seSBpbiAuOiBkaWZmLmNvcmUKT25seSBpbiAuOiBncGlvLmRpZmYKZGlmZiAtcnUg Li9zeXMvZ3Bpby5oIC91c3IvaG9tZS9idWlsZHJvb3QvdXNyL3NyYy9zeXMvc3lzL2dwaW8u aAotLS0gLi9zeXMvZ3Bpby5oCTIwMjAtMTAtMjMgMDM6MDI6MTguMDAwMDAwMDAwICswMzAw CisrKyAvdXNyL2hvbWUvYnVpbGRyb290L3Vzci9zcmMvc3lzL3N5cy9ncGlvLmgJMjAyMC0x MS0yNSAxMjoyMjo0MS40NjA5NDEwMDAgKzAzMDAKQEAgLTg0LDYgKzg0LDcgQEAKICNkZWZp bmUgR1BJT19JTlRSX01BU0sJCShHUElPX0lOVFJfTEVWRUxfTE9XIHwgR1BJT19JTlRSX0xF VkVMX0hJR0ggfCBcCiAJCQkJR1BJT19JTlRSX0VER0VfUklTSU5HIHwJCQkgICAgICBcCiAJ CQkJR1BJT19JTlRSX0VER0VfRkFMTElORyB8IEdQSU9fSU5UUl9FREdFX0JPVEgpCisjZGVm aW5lIEdQSU9fSU5UUl9BVFRBQ0hFRAkweDAwMjAwMDAwICAgICAgLyogaW50ZXJydXB0IGF0 dGFjaGVkIHRvIGZpbGUgKi8KIAogc3RydWN0IGdwaW9fcGluIHsKIAl1aW50MzJfdCBncF9w aW47CQkJLyogcGluIG51bWJlciAqLwpPbmx5IGluIC91c3IvaG9tZS9idWlsZHJvb3QvdXNy L3NyYy9zeXMvc3lzOiBncGlvLmgub3JpZwo= --------------2A1AAF89C0C383B854E76A38--