From owner-freebsd-hackers@freebsd.org Tue Aug 18 22:48:05 2015 Return-Path: Delivered-To: freebsd-hackers@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id B5DBD9BD504 for ; Tue, 18 Aug 2015 22:48:05 +0000 (UTC) (envelope-from brianfundakowskifeldman@gmail.com) Received: from mailman.ysv.freebsd.org (mailman.ysv.freebsd.org [IPv6:2001:1900:2254:206a::50:5]) by mx1.freebsd.org (Postfix) with ESMTP id 9325A1C1D for ; Tue, 18 Aug 2015 22:48:05 +0000 (UTC) (envelope-from brianfundakowskifeldman@gmail.com) Received: by mailman.ysv.freebsd.org (Postfix) id 923179BD501; Tue, 18 Aug 2015 22:48:05 +0000 (UTC) Delivered-To: hackers@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 91B389BD500 for ; Tue, 18 Aug 2015 22:48:05 +0000 (UTC) (envelope-from brianfundakowskifeldman@gmail.com) Received: from mail-lb0-x22a.google.com (mail-lb0-x22a.google.com [IPv6:2a00:1450:4010:c04::22a]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id E91991C1A for ; Tue, 18 Aug 2015 22:48:04 +0000 (UTC) (envelope-from brianfundakowskifeldman@gmail.com) Received: by lbbtg9 with SMTP id tg9so113373759lbb.1 for ; Tue, 18 Aug 2015 15:48:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-type; bh=XgkL/VaxMGlpAtsyP5uYRuWQnscQeL9EiWWGLHjPMaM=; b=Z58JFPNVK5n/U+MRcXcHCk+ooXy3xZ+sJAbrvfiNHStTZVnGcOR23g4ZTO6zcogj+D WW5uNpunc6rsUpKkNtiivWcb8hmiDjE3OBkDpOcQmGjAzq2do9c6Em1tN+QZxzje7Eqv LsVxZYdsWox2JSDQN66gBKdTi3VJYKnUSGo3thQTSN/H7/aX+Og/QoCrPJYJaA2qD6C5 7cqMOLtolbwWx4GNgeYxPu7xMjGcjrm3e07frhIIWEA00GQfdXprS4kodlwgQm2LUp2A /Svl/KUuqfXd2yeAwn+UdGNlx6h08PnoP1sy/VjhhMhyypCt5hBXx13A0LJBUcF5e8dF DBLg== X-Received: by 10.112.137.164 with SMTP id qj4mr8311363lbb.105.1439938083046; Tue, 18 Aug 2015 15:48:03 -0700 (PDT) MIME-Version: 1.0 References: <20150817160423.GB3078@gmail.com> In-Reply-To: <20150817160423.GB3078@gmail.com> From: Brian Fundakowski Feldman Date: Tue, 18 Aug 2015 22:47:52 +0000 Message-ID: Subject: Re: spigen(4) SPI Generic IO interface -- need comments To: Tom Jones Cc: embedded@freebsd.org Content-Type: multipart/mixed; boundary=089e0115fd1cf06895051d9db585 X-Mailman-Approved-At: Tue, 18 Aug 2015 23:28:19 +0000 X-Content-Filtered-By: Mailman/MimeDel 2.1.20 X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 18 Aug 2015 22:48:05 -0000 --089e0115fd1cf06895051d9db585 Content-Type: text/plain; charset=UTF-8 On Mon, Aug 17, 2015 at 12:04 PM Tom Jones wrote: > On Mon, Aug 17, 2015 at 10:00:26AM -0400, Brian Fundakowski Feldman wrote: > > I'm woefully out-of-practice with my kernel hackery (but still pretty > > proficient in jiggery-pokery) so I would like to get comments on a little > > driver I just made for interfacing arbitrarily in userland with SPI > > components. The only thing I'm exposing is a /dev/spigenN node with a > > single transfer ioctl and I put together a test circuit and program with > an > > MCP3008 10-bit ADC IC to validate that it basically works, other than the > > limitation that the transfers must be octet-multiply-sized, but I haven't > > looked at the SoC's (I'm using a Raspberry Pi 2) data sheet to tell > whether > > that's just a limit on the spibus(4) interface or the Broadcom SPI driver > > or the Broadcom SoC itself. > > > > I hit one snag in development where I simply called the ioctl wrong and > > found copyin(9) to page fault HARD if given a bogus user address to copy > > from, and panic the kernel. I can post up the test program if anyone > wants > > but it's very trivial: I just align the start bit and the command data > into > > the least significant bits of the first octet, shift it up two positions > so > > the NULs get clocked out as part of the command field, and provide two > > octets for the data field to retrieve back the 10-bit digital value. > > Oh, cool. > > I did the same earlier this year, have you seen[1]?. > > The FreeBSD i2c api is the same/very similar the linux one[2][3]. Have you > considered adding some of the ioctls[3] or the data structures to make it > easier to port code? > > [1]: > https://lists.freebsd.org/pipermail/freebsd-embedded/2015-April/002466.html > [2]: https://www.kernel.org/doc/Documentation/i2c/dev-interface > [3]: > https://www.freebsd.org/cgi/man.cgi?query=iic&apropos=0&sektion=0&manpath=FreeBSD+10.2-RELEASE&arch=default&format=html > [4]: https://www.kernel.org/doc/Documentation/spi/spidev I've iterated a bit on this to try to make some more sensible API, behaving reasonably about being able to set the SPI clock speed. I'm going to implement an mmap handler so I can have my low-latency operation mode, as well. I don't like the Linux APIs one bit because it's just not safe to allow all those configuration changes on a per-transfer basis... Moving this to -embedded because it's more apt than -hackers. --089e0115fd1cf06895051d9db585 Content-Type: application/octet-stream; name="spigen.patch" Content-Disposition: attachment; filename="spigen.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: 14f42ff4ece7e1ec3fe1 SW5kZXg6IGFybS9icm9hZGNvbS9iY20yODM1L2JjbTI4MzVfc3BpLmMKPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g YXJtL2Jyb2FkY29tL2JjbTI4MzUvYmNtMjgzNV9zcGkuYwkocmV2aXNpb24gMjg2ODkwKQorKysg YXJtL2Jyb2FkY29tL2JjbTI4MzUvYmNtMjgzNV9zcGkuYwkod29ya2luZyBjb3B5KQpAQCAtMTA3 LDYgKzEwNywyNSBAQAogCUJDTV9TUElfV1JJVEUoc2MsIG9mZiwgcmVnKTsKIH0KIAorLyoKKyAq IFNldCB0aGUgY2xvY2sgc3BlZWQgcmVnaXN0ZXIgYW5kIHJldHVybiB0aGUgY2xvY2sgc3BlZWQg YWN0dWFsbHkgdXNlZCwKKyAqIGFmdGVyIGNvcnJlY3Rpb25zIHRvIGZpdCB3aXRoaW4gU1BJX0NP UkVfQ0xLLgorICovCitzdGF0aWMgdWludDMyX3QKK2JjbV9zcGlfc2V0X2Nsb2NrX3NwZWVkKHN0 cnVjdCBiY21fc3BpX3NvZnRjICpzYywgY29uc3QgdWludDMyX3QgY2xvY2tfc3BlZWQpCit7CisJ dWludDMyX3QgY2xrID0gU1BJX0NPUkVfQ0xLIC8gY2xvY2tfc3BlZWQ7CisKKwlpZiAoY2xrIDw9 IDEpCisJCWNsayA9IDI7CisJZWxzZSBpZiAoY2xrICUgMikKKwkJY2xrLS07CisJaWYgKGNsayA+ IDB4ZmZmZikKKwkJY2xrID0gMDsKKwlCQ01fU1BJX1dSSVRFKHNjLCBTUElfQ0xLLCBjbGspOwor CXJldHVybiAoY2xrID09IDAgPyAwIDogU1BJX0NPUkVfQ0xLIC8gY2xrKTsKK30KKwogc3RhdGlj IGludAogYmNtX3NwaV9jbG9ja19wcm9jKFNZU0NUTF9IQU5ETEVSX0FSR1MpCiB7CkBAIC0xMTcs MjYgKzEzNiwxOSBAQAogCXNjID0gKHN0cnVjdCBiY21fc3BpX3NvZnRjICopYXJnMTsKIAogCUJD TV9TUElfTE9DSyhzYyk7Ci0JY2xrID0gQkNNX1NQSV9SRUFEKHNjLCBTUElfQ0xLKTsKKwljbGsg PSBzYy0+c2NfY2xvY2tfc3BlZWQ7CiAJQkNNX1NQSV9VTkxPQ0soc2MpOwotCWNsayAmPSAweGZm ZmY7Ci0JaWYgKGNsayA9PSAwKQotCQljbGsgPSA2NTUzNjsKLQljbGsgPSBTUElfQ09SRV9DTEsg LyBjbGs7CiAKIAllcnJvciA9IHN5c2N0bF9oYW5kbGVfaW50KG9pZHAsICZjbGssIHNpemVvZihj bGspLCByZXEpOwogCWlmIChlcnJvciAhPSAwIHx8IHJlcS0+bmV3cHRyID09IE5VTEwpCiAJCXJl dHVybiAoZXJyb3IpOwogCi0JY2xrID0gU1BJX0NPUkVfQ0xLIC8gY2xrOwotCWlmIChjbGsgPD0g MSkKLQkJY2xrID0gMjsKLQllbHNlIGlmIChjbGsgJSAyKQotCQljbGstLTsKLQlpZiAoY2xrID4g MHhmZmZmKQotCQljbGsgPSAwOwogCUJDTV9TUElfTE9DSyhzYyk7Ci0JQkNNX1NQSV9XUklURShz YywgU1BJX0NMSywgY2xrKTsKKwlpZiAoc2MtPnNjX2ZsYWdzICYgQkNNX1NQSV9CVVNZKSB7CisJ CUJDTV9TUElfVU5MT0NLKHNjKTsKKwkJcmV0dXJuIChFQlVTWSk7CisJfQorCXNjLT5zY19jbG9j a19zcGVlZCA9IGJjbV9zcGlfc2V0X2Nsb2NrX3NwZWVkKHNjLCBjbGspOwogCUJDTV9TUElfVU5M T0NLKHNjKTsKIAogCXJldHVybiAoMCk7CkBAIC0zMTAsNyArMzIyLDggQEAKIAlCQ01fU1BJX1dS SVRFKHNjLCBTUElfQ1MsIFNQSV9DU19DTEVBUl9SWEZJRk8gfCBTUElfQ1NfQ0xFQVJfVFhGSUZP KTsKIAogCS8qIFNldCB0aGUgU1BJIGNsb2NrIHRvIDUwMEtoei4gKi8KLQlCQ01fU1BJX1dSSVRF KHNjLCBTUElfQ0xLLCBTUElfQ09SRV9DTEsgLyA1MDAwMDApOworCXNjLT5zY19jbG9ja19zcGVl ZCA9IDUwMDAwMDsKKwlCQ01fU1BJX1dSSVRFKHNjLCBTUElfQ0xLLCBTUElfQ09SRV9DTEsgLyBz Yy0+c2NfY2xvY2tfc3BlZWQpOwogCiAjaWZkZWYJQkNNX1NQSV9ERUJVRwogCWJjbV9zcGlfcHJp bnRyKGRldik7CkBAIC00MTgsNiArNDMxLDcgQEAKIGJjbV9zcGlfdHJhbnNmZXIoZGV2aWNlX3Qg ZGV2LCBkZXZpY2VfdCBjaGlsZCwgc3RydWN0IHNwaV9jb21tYW5kICpjbWQpCiB7CiAJc3RydWN0 IGJjbV9zcGlfc29mdGMgKnNjOworCWNvbnN0IHVpbnQzMl90IGNsb2NrX3NwZWVkX2h6ID0gY21k LT5jbG9ja19zcGVlZF9oejsKIAlpbnQgY3MsIGVycjsKIAogCXNjID0gZGV2aWNlX2dldF9zb2Z0 YyhkZXYpOwpAQCAtNDUwLDYgKzQ2NCwxMCBAQAogCSAgICBTUElfQ1NfQ0xFQVJfUlhGSUZPIHwg U1BJX0NTX0NMRUFSX1RYRklGTywKIAkgICAgU1BJX0NTX0NMRUFSX1JYRklGTyB8IFNQSV9DU19D TEVBUl9UWEZJRk8pOwogCisJLyogU3dpdGNoIGNsb2NrIHNwZWVkIGlmIG5lY2Vzc2FyeS4gKi8K KwlpZiAoY2xvY2tfc3BlZWRfaHogIT0gMCAmJiBjbG9ja19zcGVlZF9oeiAhPSBzYy0+c2NfY2xv Y2tfc3BlZWQpCisJCWJjbV9zcGlfc2V0X2Nsb2NrX3NwZWVkKHNjLCBjbG9ja19zcGVlZF9oeik7 CisKIAkvKiBTYXZlIGEgcG9pbnRlciB0byB0aGUgU1BJIGNvbW1hbmQuICovCiAJc2MtPnNjX2Nt ZCA9IGNtZDsKIAlzYy0+c2NfcmVhZCA9IDA7CkBAIC00NzAsNiArNDg4LDEwIEBACiAJLyogTWFr ZSBzdXJlIHRoZSBTUEkgZW5naW5lIGFuZCBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZC4gKi8KIAli Y21fc3BpX21vZGlmeXJlZyhzYywgU1BJX0NTLCBTUElfQ1NfVEEgfCBTUElfQ1NfSU5UUiB8IFNQ SV9DU19JTlRELCAwKTsKIAorCS8qIFN3aXRjaCB0aGUgY2xvY2sgc3BlZWQgYmFjayBpZiBuZWNl c3NhcnkuICovCisJaWYgKGNsb2NrX3NwZWVkX2h6ICE9IDAgJiYgY2xvY2tfc3BlZWRfaHogIT0g c2MtPnNjX2Nsb2NrX3NwZWVkKQorCQliY21fc3BpX3NldF9jbG9ja19zcGVlZChzYywgc2MtPnNj X2Nsb2NrX3NwZWVkKTsKKwogCS8qIFJlbGVhc2UgdGhlIGNvbnRyb2xsZXIgYW5kIHdha2V1cCB0 aGUgbmV4dCB0aHJlYWQgd2FpdGluZyBmb3IgaXQuICovCiAJc2MtPnNjX2ZsYWdzID0gMDsKIAl3 YWtldXBfb25lKGRldik7CkBAIC00ODcsNiArNTA5LDcgQEAKIAlyZXR1cm4gKGVycik7CiB9CiAK Kwogc3RhdGljIHBoYW5kbGVfdAogYmNtX3NwaV9nZXRfbm9kZShkZXZpY2VfdCBidXMsIGRldmlj ZV90IGRldikKIHsKSW5kZXg6IGFybS9icm9hZGNvbS9iY20yODM1L2JjbTI4MzVfc3BpdmFyLmgK PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PQotLS0gYXJtL2Jyb2FkY29tL2JjbTI4MzUvYmNtMjgzNV9zcGl2YXIuaAkocmV2 aXNpb24gMjg2ODkwKQorKysgYXJtL2Jyb2FkY29tL2JjbTI4MzUvYmNtMjgzNV9zcGl2YXIuaAko d29ya2luZyBjb3B5KQpAQCAtNTQsNiArNTQsNyBAQAogCXVpbnQzMl90CQlzY19yZWFkOwogCXVp bnQzMl90CQlzY19mbGFnczsKIAl1aW50MzJfdAkJc2Nfd3JpdHRlbjsKKwl1aW50MzJfdAkJc2Nf Y2xvY2tfc3BlZWQ7CiAJdm9pZCAqCQkJc2NfaW50cmhhbmQ7CiB9OwogCkluZGV4OiBhcm0vY29u Zi9SUEkyCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT0KLS0tIGFybS9jb25mL1JQSTIJKHJldmlzaW9uIDI4Njg5MCkKKysr IGFybS9jb25mL1JQSTIJKHdvcmtpbmcgY29weSkKQEAgLTI0LDcgKzI0LDcgQEAKIGluY2x1ZGUg CSIuLi9icm9hZGNvbS9iY20yODM1L3N0ZC5ycGkiCiBpbmNsdWRlIAkiLi4vYnJvYWRjb20vYmNt MjgzNS9zdGQuYmNtMjgzNiIKIAotb3B0aW9ucyAJSFo9MTAwCitvcHRpb25zIAlIWj0xMDAwCiBv cHRpb25zIAlTQ0hFRF9VTEUJCSMgVUxFIHNjaGVkdWxlcgogb3B0aW9ucyAJU01QCQkJIyBFbmFi bGUgbXVsdGlwbGUgY29yZXMKIG9wdGlvbnMgCVBMQVRGT1JNCkBAIC0zNSw3ICszNSw3IEBACiAj b3B0aW9ucyAJVkVSQk9TRV9TWVNJTklUCQkjIEVuYWJsZSB2ZXJib3NlIHN5c2luaXQgbWVzc2Fn ZXMKIG9wdGlvbnMgCUtEQgkJCSMgRW5hYmxlIGtlcm5lbCBkZWJ1Z2dlciBzdXBwb3J0CiAjIEZv ciBtaW5pbXVtIGRlYnVnZ2VyIHN1cHBvcnQgKHN0YWJsZSBicmFuY2gpIHVzZToKLSNvcHRpb25z IAlLREJfVFJBQ0UJCSMgUHJpbnQgYSBzdGFjayB0cmFjZSBmb3IgYSBwYW5pYworb3B0aW9ucyAJ S0RCX1RSQUNFCQkjIFByaW50IGEgc3RhY2sgdHJhY2UgZm9yIGEgcGFuaWMKICMgRm9yIGZ1bGwg ZGVidWdnZXIgc3VwcG9ydCB1c2UgdGhpcyBpbnN0ZWFkOgogb3B0aW9ucyAJRERCCQkJIyBFbmFi bGUgdGhlIGtlcm5lbCBkZWJ1Z2dlcgogb3B0aW9ucyAJSU5WQVJJQU5UUwkJIyBFbmFibGUgY2Fs bHMgb2YgZXh0cmEgc2FuaXR5IGNoZWNraW5nCkluZGV4OiBhcm0vbHBjL3NzZDEyODkuYwo9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09Ci0tLSBhcm0vbHBjL3NzZDEyODkuYwkocmV2aXNpb24gMjg2ODkwKQorKysgYXJtL2xw Yy9zc2QxMjg5LmMJKHdvcmtpbmcgY29weSkKQEAgLTE1Nyw3ICsxNTcsOCBAQAogc3RhdGljIF9f aW5saW5lIHZvaWQKIHNzZDEyODlfc3BpX3NlbmQoc3RydWN0IHNzZDEyODlfc29mdGMgKnNjLCB1 aW50OF90ICpkYXRhLCBpbnQgbGVuKQogewotCXN0cnVjdCBzcGlfY29tbWFuZCBjbWQ7CisJc3Ry dWN0IHNwaV9jb21tYW5kIGNtZCA9IFNQSV9DT01NQU5EX0lOSVRJQUxJWkVSOworCiAJdWludDhf dCBidWZmZXJbOF07CiAJY21kLnR4X2NtZCA9IGRhdGE7CiAJY21kLnR4X2NtZF9zeiA9IGxlbjsK SW5kZXg6IGNvbmYvZmlsZXMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gY29uZi9maWxlcwkocmV2aXNpb24gMjg2 ODkwKQorKysgY29uZi9maWxlcwkod29ya2luZyBjb3B5KQpAQCAtMjQ1Miw2ICsyNDUyLDcgQEAK IGRldi9zcGlidXMvb2Z3X3NwaWJ1cy5jCQlvcHRpb25hbCBmZHQgc3BpYnVzCiBkZXYvc3BpYnVz L3NwaWJ1cy5jCQlvcHRpb25hbCBzcGlidXMJCQkJXAogCWRlcGVuZGVuY3kJInNwaWJ1c19pZi5o IgorZGV2L3NwaWJ1cy9zcGlnZW4uYwkJb3B0aW9uYWwgc3BpYnVzCiBkZXYvc3BpYnVzL3NwaWJ1 c19pZi5tCQlvcHRpb25hbCBzcGlidXMKIGRldi9zdGUvaWZfc3RlLmMJCW9wdGlvbmFsIHN0ZSBw Y2kKIGRldi9zdGcvdG1jMThjMzAuYwkJb3B0aW9uYWwgc3RnCkluZGV4OiBkZXYvc3BpYnVzL3Nw aS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0KLS0tIGRldi9zcGlidXMvc3BpLmgJKHJldmlzaW9uIDI4Njg5MCkKKysr IGRldi9zcGlidXMvc3BpLmgJKHdvcmtpbmcgY29weSkKQEAgLTI3LDYgKzI3LDcgQEAKICAqLwog CiBzdHJ1Y3Qgc3BpX2NvbW1hbmQgeworCXVpbnQzMl90IGNsb2NrX3NwZWVkX2h6OwogCXZvaWQJ KnR4X2NtZDsKIAl1aW50MzJfdCB0eF9jbWRfc3o7CiAJdm9pZAkqcnhfY21kOwpAQCAtMzcsNCAr MzgsNiBAQAogCXVpbnQzMl90IHJ4X2RhdGFfc3o7CiB9OwogCisjZGVmaW5lCVNQSV9DT01NQU5E X0lOSVRJQUxJWkVSCXsgMCB9CisKICNkZWZpbmUJU1BJX0NISVBfU0VMRUNUX0hJR0gJMHgxCQkv KiBDaGlwIHNlbGVjdCBoaWdoIChlbHNlIGxvdykgKi8KSW5kZXg6IGRldi9zcGlidXMvc3BpZ2Vu LmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PQotLS0gZGV2L3NwaWJ1cy9zcGlnZW4uYwkocmV2aXNpb24gMCkKKysrIGRl di9zcGlidXMvc3BpZ2VuLmMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyNzkgQEAKKy8qLQor ICogQ29weXJpZ2h0IChjKSAyMDE1IEJyaWFuIEZ1bmRha293c2tpIEZlbGRtYW4uICBBbGwgcmln aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0 OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg QlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdB UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJS QU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB UiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhP UiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BF Q0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU CisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT RVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFC SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP VVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZz Lmg+CitfX0ZCU0RJRCgiJEZyZWVCU0QkIik7CisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNp bmNsdWRlIDxzeXMvc3lzdG0uaD4KKyNpbmNsdWRlIDxzeXMvYnVzLmg+CisjaW5jbHVkZSA8c3lz L2NvbmYuaD4KKyNpbmNsdWRlIDxzeXMva2VybmVsLmg+CisjaW5jbHVkZSA8c3lzL2xvY2suaD4K KyNpbmNsdWRlIDxzeXMvbWFsbG9jLmg+CisjaW5jbHVkZSA8c3lzL211dGV4Lmg+CisjaW5jbHVk ZSA8c3lzL21vZHVsZS5oPgorI2luY2x1ZGUgPHN5cy9zcGlnZW5pby5oPgorI2luY2x1ZGUgPHN5 cy9zeXNjdGwuaD4KKworI2luY2x1ZGUgPGRldi9zcGlidXMvc3BpLmg+CisKKyNpbmNsdWRlICJz cGlidXNfaWYuaCIKKworc3RydWN0IHNwaWdlbl9zb2Z0YyB7CisJZGV2aWNlX3Qgc2NfZGV2Owor CXN0cnVjdCBjZGV2ICpzY19jZGV2OworCXN0cnVjdCBtdHggc2NfbXR4OworCXVpbnQzMl90IHNj X2Nsb2NrX3NwZWVkOworCXVpbnQzMl90IHNjX2NvbW1hbmRfbGVuZ3RoX21heDsKKwl1aW50MzJf dCBzY19kYXRhX2xlbmd0aF9tYXg7CisJdm9pZCAqc2NfY29tbWFuZF9kYXRhX2FyZWE7Cit9Owor CitzdGF0aWMgaW50CitzcGlnZW5fcHJvYmUoZGV2aWNlX3QgZGV2KQoreworCWRldmljZV9zZXRf ZGVzYyhkZXYsICJTUEkgR2VuZXJpYyBJTyIpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBp bnQgc3BpZ2VuX29wZW4oc3RydWN0IGNkZXYgKiwgaW50LCBpbnQsIHN0cnVjdCB0aHJlYWQgKik7 CitzdGF0aWMgaW50IHNwaWdlbl9pb2N0bChzdHJ1Y3QgY2RldiAqLCB1X2xvbmcsIGNhZGRyX3Qs IGludCwgc3RydWN0IHRocmVhZCAqKTsKK3N0YXRpYyBpbnQgc3BpZ2VuX2Nsb3NlKHN0cnVjdCBj ZGV2ICosIGludCwgaW50LCBzdHJ1Y3QgdGhyZWFkICopOworCitzdGF0aWMgc3RydWN0IGNkZXZz dyBzcGlnZW5fY2RldnN3ID0geworCS5kX3ZlcnNpb24gPSBEX1ZFUlNJT04sCisJLmRfbmFtZSA9 ICAgICJzcGlnZW4iLAorCS5kX29wZW4gPSAgICBzcGlnZW5fb3BlbiwKKwkuZF9pb2N0bCA9ICAg c3BpZ2VuX2lvY3RsLAorCS5kX2Nsb3NlID0gICBzcGlnZW5fY2xvc2UKK307CisKK3N0YXRpYyBp bnQKK3NwaWdlbl9jb21tYW5kX2xlbmd0aF9tYXhfcHJvYyhTWVNDVExfSEFORExFUl9BUkdTKQor eworCXN0cnVjdCBzcGlnZW5fc29mdGMgKnNjID0gKHN0cnVjdCBzcGlnZW5fc29mdGMgKilhcmcx OworCXVpbnQzMl90IGNvbW1hbmRfbGVuZ3RoX21heDsKKwlpbnQgZXJyb3I7CisKKwltdHhfbG9j aygmc2MtPnNjX210eCk7CisJY29tbWFuZF9sZW5ndGhfbWF4ID0gc2MtPnNjX2NvbW1hbmRfbGVu Z3RoX21heDsKKwltdHhfdW5sb2NrKCZzYy0+c2NfbXR4KTsKKwllcnJvciA9IHN5c2N0bF9oYW5k bGVfaW50KG9pZHAsICZjb21tYW5kX2xlbmd0aF9tYXgsCisJICAgIHNpemVvZihjb21tYW5kX2xl bmd0aF9tYXgpLCByZXEpOworCWlmIChlcnJvciA9PSAwICYmIHJlcS0+bmV3cHRyICE9IE5VTEwp IHsKKwkJbXR4X2xvY2soJnNjLT5zY19tdHgpOworCQkvKiBYWFggRUJVU1kgd2hlbiBtbWFwcGVk IHRlc3QgKi8KKwkJc2MtPnNjX2NvbW1hbmRfbGVuZ3RoX21heCA9IGNvbW1hbmRfbGVuZ3RoX21h eDsKKwkJbXR4X3VubG9jaygmc2MtPnNjX210eCk7CisJfQorCXJldHVybiAoZXJyb3IpOworfQor CitzdGF0aWMgaW50CitzcGlnZW5fZGF0YV9sZW5ndGhfbWF4X3Byb2MoU1lTQ1RMX0hBTkRMRVJf QVJHUykKK3sKKwlzdHJ1Y3Qgc3BpZ2VuX3NvZnRjICpzYyA9IChzdHJ1Y3Qgc3BpZ2VuX3NvZnRj ICopYXJnMTsKKwl1aW50MzJfdCBkYXRhX2xlbmd0aF9tYXg7CisJaW50IGVycm9yOworCisJbXR4 X2xvY2soJnNjLT5zY19tdHgpOworCWRhdGFfbGVuZ3RoX21heCA9IHNjLT5zY19kYXRhX2xlbmd0 aF9tYXg7CisJbXR4X3VubG9jaygmc2MtPnNjX210eCk7CisJZXJyb3IgPSBzeXNjdGxfaGFuZGxl X2ludChvaWRwLCAmZGF0YV9sZW5ndGhfbWF4LAorCSAgICBzaXplb2YoZGF0YV9sZW5ndGhfbWF4 KSwgcmVxKTsKKwlpZiAoZXJyb3IgPT0gMCAmJiByZXEtPm5ld3B0ciAhPSBOVUxMKSB7CisJCW10 eF9sb2NrKCZzYy0+c2NfbXR4KTsKKwkJLyogWFhYIEVCVVNZIHdoZW4gbW1hcHBlZCB0ZXN0ICov CisJCXNjLT5zY19kYXRhX2xlbmd0aF9tYXggPSBkYXRhX2xlbmd0aF9tYXg7CisJCW10eF91bmxv Y2soJnNjLT5zY19tdHgpOworCX0KKwlyZXR1cm4gKGVycm9yKTsKK30KKworc3RhdGljIHZvaWQK K3NwaWdlbl9zeXNjdGxfaW5pdChzdHJ1Y3Qgc3BpZ2VuX3NvZnRjICpzYykKK3sKKwlzdHJ1Y3Qg c3lzY3RsX2N0eF9saXN0ICpjdHg7CisJc3RydWN0IHN5c2N0bF9vaWQgKnRyZWVfbm9kZTsKKwlz dHJ1Y3Qgc3lzY3RsX29pZF9saXN0ICp0cmVlOworCisJLyoKKwkgKiBBZGQgc3lzdGVtIHN5c2N0 bCB0cmVlL2hhbmRsZXJzLgorCSAqLworCWN0eCA9IGRldmljZV9nZXRfc3lzY3RsX2N0eChzYy0+ c2NfZGV2KTsKKwl0cmVlX25vZGUgPSBkZXZpY2VfZ2V0X3N5c2N0bF90cmVlKHNjLT5zY19kZXYp OworCXRyZWUgPSBTWVNDVExfQ0hJTERSRU4odHJlZV9ub2RlKTsKKwlTWVNDVExfQUREX1BST0Mo Y3R4LCB0cmVlLCBPSURfQVVUTywgImNvbW1hbmRfbGVuZ3RoX21heCIsCisJICAgIENUTEZMQUdf TVBTQUZFIHwgQ1RMRkxBR19SVyB8IENUTFRZUEVfVUlOVCwgc2MsIHNpemVvZigqc2MpLAorCSAg ICBzcGlnZW5fY29tbWFuZF9sZW5ndGhfbWF4X3Byb2MsICJJVSIsICJTUEkgY29tbWFuZCBoZWFk ZXIgcG9ydGlvbiAob2N0ZXRzKSIpOworCVNZU0NUTF9BRERfUFJPQyhjdHgsIHRyZWUsIE9JRF9B VVRPLCAiZGF0YV9sZW5ndGhfbWF4IiwKKwkgICAgQ1RMRkxBR19NUFNBRkUgfCBDVExGTEFHX1JX IHwgQ1RMVFlQRV9VSU5ULCBzYywgc2l6ZW9mKCpzYyksCisJICAgIHNwaWdlbl9kYXRhX2xlbmd0 aF9tYXhfcHJvYywgIklVIiwgIlNQSSBkYXRhIHRyYWlsZXIgcG9ydGlvbiAob2N0ZXRzKSIpOwor fQorCitzdGF0aWMgaW50CitzcGlnZW5fYXR0YWNoKGRldmljZV90IGRldikKK3sKKwlzdHJ1Y3Qg c3BpZ2VuX3NvZnRjICpzYzsKKwljb25zdCBpbnQgdW5pdCA9IGRldmljZV9nZXRfdW5pdChkZXYp OworCisJc2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7CisJc2MtPnNjX2RldiA9IGRldjsKKwlz Yy0+c2NfY2RldiA9IG1ha2VfZGV2KCZzcGlnZW5fY2RldnN3LCB1bml0LAorCSAgICBVSURfUk9P VCwgR0lEX09QRVJBVE9SLCAwNjYwLCAic3BpZ2VuJWQiLCB1bml0KTsKKwlzYy0+c2NfY2Rldi0+ c2lfZHJ2MSA9IGRldjsKKwlzYy0+c2NfY29tbWFuZF9sZW5ndGhfbWF4ID0gUEFHRV9TSVpFOwor CXNjLT5zY19kYXRhX2xlbmd0aF9tYXggPSBQQUdFX1NJWkU7CisJbXR4X2luaXQoJnNjLT5zY19t dHgsIGRldmljZV9nZXRfbmFtZXVuaXQoZGV2KSwgTlVMTCwgTVRYX0RFRik7CisJc3BpZ2VuX3N5 c2N0bF9pbml0KHNjKTsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgCitzcGlnZW5f b3BlbihzdHJ1Y3QgY2RldiAqZGV2LCBpbnQgb2ZsYWdzLCBpbnQgZGV2dHlwZSwgc3RydWN0IHRo cmVhZCAqdGQpCit7CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CitzcGlnZW5fdHJh bnNmZXIoc3RydWN0IGNkZXYgKmNkZXYsIHN0cnVjdCBzcGlnZW5fdHJhbnNmZXIgKnN0KQorewor CXN0cnVjdCBzcGlfY29tbWFuZCB0cmFuc2ZlciA9IFNQSV9DT01NQU5EX0lOSVRJQUxJWkVSOwor CWRldmljZV90IGRldiA9IGNkZXYtPnNpX2RydjE7CisJc3RydWN0IHNwaWdlbl9zb2Z0YyAqc2Mg PSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7CisJaW50IGVycm9yID0gMDsKKworCW10eF9sb2NrKCZz Yy0+c2NfbXR4KTsKKwlpZiAoc3QtPnN0X2NvbW1hbmQuaW92X2xlbiA9PSAwIHx8IHN0LT5zdF9k YXRhLmlvdl9sZW4gPT0gMCkKKwkJZXJyb3IgPSBFSU5WQUw7CisJZWxzZSBpZiAoc3QtPnN0X2Nv bW1hbmQuaW92X2xlbiA+IHNjLT5zY19jb21tYW5kX2xlbmd0aF9tYXggfHwKKwkgICAgc3QtPnN0 X2RhdGEuaW92X2xlbiA+IHNjLT5zY19kYXRhX2xlbmd0aF9tYXgpCisJCWVycm9yID0gRU5PTUVN OworCWVsc2UKKwkJdHJhbnNmZXIuY2xvY2tfc3BlZWRfaHogPSBzYy0+c2NfY2xvY2tfc3BlZWQ7 CisJbXR4X3VubG9jaygmc2MtPnNjX210eCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gKGVycm9y KTsKKwkKKyNpZiAwCisJZGV2aWNlX3ByaW50ZihkZXYsICJjbWQgJXAgJXUgZGF0YSAlcCAldVxu Iiwgc3QtPnN0X2NvbW1hbmQuaW92X2Jhc2UsCisJICAgIHN0LT5zdF9jb21tYW5kLmlvdl9sZW4s IHN0LT5zdF9kYXRhLmlvdl9iYXNlLCBzdC0+c3RfZGF0YS5pb3ZfbGVuKTsKKyNlbmRpZgorCXRy YW5zZmVyLnR4X2NtZCA9IHRyYW5zZmVyLnJ4X2NtZCA9IG1hbGxvYyhzdC0+c3RfY29tbWFuZC5p b3ZfbGVuLAorCSAgICBNX0RFVkJVRiwgTV9XQUlUT0spOworCWlmICh0cmFuc2Zlci50eF9jbWQg PT0gTlVMTCkKKwkJcmV0dXJuIChFTk9NRU0pOworCXRyYW5zZmVyLnR4X2RhdGEgPSB0cmFuc2Zl ci5yeF9kYXRhID0gbWFsbG9jKHN0LT5zdF9kYXRhLmlvdl9sZW4sCisJICAgIE1fREVWQlVGLCBN X1dBSVRPSyk7CisJaWYgKHRyYW5zZmVyLnR4X2RhdGEgPT0gTlVMTCkgeworCQlmcmVlKHRyYW5z ZmVyLnR4X2NtZCwgTV9ERVZCVUYpOworCQlyZXR1cm4gKEVOT01FTSk7CisJfQorCisJZXJyb3Ig PSBjb3B5aW4oc3QtPnN0X2NvbW1hbmQuaW92X2Jhc2UsIHRyYW5zZmVyLnR4X2NtZCwKKwkgICAg dHJhbnNmZXIudHhfY21kX3N6ID0gdHJhbnNmZXIucnhfY21kX3N6ID0gc3QtPnN0X2NvbW1hbmQu aW92X2xlbik7CQorCWlmIChlcnJvciA9PSAwKQorCQllcnJvciA9IGNvcHlpbihzdC0+c3RfZGF0 YS5pb3ZfYmFzZSwgdHJhbnNmZXIudHhfZGF0YSwKKwkJICAgIHRyYW5zZmVyLnR4X2RhdGFfc3og PSB0cmFuc2Zlci5yeF9kYXRhX3N6ID0KKwkJICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+ c3RfZGF0YS5pb3ZfbGVuKTsJCisJaWYgKGVycm9yID09IDApCisJCWVycm9yID0gU1BJQlVTX1RS QU5TRkVSKGRldmljZV9nZXRfcGFyZW50KGRldiksIGRldiwgJnRyYW5zZmVyKTsKKwlpZiAoZXJy b3IgPT0gMCkgeworCQllcnJvciA9IGNvcHlvdXQodHJhbnNmZXIucnhfY21kLCBzdC0+c3RfY29t bWFuZC5pb3ZfYmFzZSwKKwkJICAgIHRyYW5zZmVyLnJ4X2NtZF9zeik7CisJCWlmIChlcnJvciA9 PSAwKQorCQkJZXJyb3IgPSBjb3B5b3V0KHRyYW5zZmVyLnJ4X2RhdGEsIHN0LT5zdF9kYXRhLmlv dl9iYXNlLAorCQkJICAgIHRyYW5zZmVyLnJ4X2RhdGFfc3opOworCX0KKworCWZyZWUodHJhbnNm ZXIudHhfY21kLCBNX0RFVkJVRik7CisJZnJlZSh0cmFuc2Zlci50eF9kYXRhLCBNX0RFVkJVRik7 CisJcmV0dXJuIChlcnJvcik7Cit9CisKK3N0YXRpYyBpbnQKK3NwaWdlbl9pb2N0bChzdHJ1Y3Qg Y2RldiAqY2RldiwgdV9sb25nIGNtZCwgY2FkZHJfdCBkYXRhLCBpbnQgZmZsYWcsCisgICAgc3Ry dWN0IHRocmVhZCAqdGQpCit7CisJZGV2aWNlX3QgZGV2ID0gY2Rldi0+c2lfZHJ2MTsKKwlzdHJ1 Y3Qgc3BpZ2VuX3NvZnRjICpzYyA9IGRldmljZV9nZXRfc29mdGMoZGV2KTsKKwlpbnQgZXJyb3I7 CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU1BJR0VOSU9DX1RSQU5TRkVSOgorCQllcnJvciA9 IHNwaWdlbl90cmFuc2ZlcihjZGV2LCAoc3RydWN0IHNwaWdlbl90cmFuc2ZlciAqKWRhdGEpOwor CQlicmVhazsKKwljYXNlIFNQSUdFTklPQ19HRVRfQ0xPQ0tfU1BFRUQ6CisJCW10eF9sb2NrKCZz Yy0+c2NfbXR4KTsKKwkJKih1aW50MzJfdCAqKWRhdGEgPSBzYy0+c2NfY2xvY2tfc3BlZWQ7CisJ CW10eF91bmxvY2soJnNjLT5zY19tdHgpOworCQllcnJvciA9IDA7CisJCWJyZWFrOworCWNhc2Ug U1BJR0VOSU9DX1NFVF9DTE9DS19TUEVFRDoKKwkJbXR4X2xvY2soJnNjLT5zY19tdHgpOworCQlz Yy0+c2NfY2xvY2tfc3BlZWQgPSAqKHVpbnQzMl90ICopZGF0YTsKKwkJbXR4X3VubG9jaygmc2Mt PnNjX210eCk7CisJCWVycm9yID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyb3IgPSBF T1BOT1RTVVBQOworCX0KKwlyZXR1cm4gKGVycm9yKTsKK30KKworc3RhdGljIGludCAKK3NwaWdl bl9jbG9zZShzdHJ1Y3QgY2RldiAqZGV2LCBpbnQgZmZsYWcsIGludCBkZXZ0eXBlLCBzdHJ1Y3Qg dGhyZWFkICp0ZCkKK3sKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK3NwaWdlbl9k ZXRhY2goZGV2aWNlX3QgZGV2KQoreworCisJcmV0dXJuIChFSU8pOworfQorCitzdGF0aWMgZGV2 Y2xhc3NfdCBzcGlnZW5fZGV2Y2xhc3M7CisKK3N0YXRpYyBkZXZpY2VfbWV0aG9kX3Qgc3BpZ2Vu X21ldGhvZHNbXSA9IHsKKwkvKiBEZXZpY2UgaW50ZXJmYWNlICovCisJREVWTUVUSE9EKGRldmlj ZV9wcm9iZSwJCXNwaWdlbl9wcm9iZSksCisJREVWTUVUSE9EKGRldmljZV9hdHRhY2gsCXNwaWdl bl9hdHRhY2gpLAorCURFVk1FVEhPRChkZXZpY2VfZGV0YWNoLAlzcGlnZW5fZGV0YWNoKSwKKwor CXsgMCwgMCB9Cit9OworCitzdGF0aWMgZHJpdmVyX3Qgc3BpZ2VuX2RyaXZlciA9IHsKKwkic3Bp Z2VuIiwKKwlzcGlnZW5fbWV0aG9kcywKKwlzaXplb2Yoc3RydWN0IHNwaWdlbl9zb2Z0YyksCit9 OworCitEUklWRVJfTU9EVUxFKHNwaWdlbiwgc3BpYnVzLCBzcGlnZW5fZHJpdmVyLCBzcGlnZW5f ZGV2Y2xhc3MsIDAsIDApOwoKUHJvcGVydHkgY2hhbmdlcyBvbjogZGV2L3NwaWJ1cy9zcGlnZW4u YwpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fCkFkZGVkOiBzdm46ZW9sLXN0eWxlCiMjIC0wLDAgKzEgIyMKK25hdGl2ZQpc IE5vIG5ld2xpbmUgYXQgZW5kIG9mIHByb3BlcnR5CkFkZGVkOiBzdm46a2V5d29yZHMKIyMgLTAs MCArMSAjIworRnJlZUJTRD0lSApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIHByb3BlcnR5CkFkZGVk OiBzdm46bWltZS10eXBlCiMjIC0wLDAgKzEgIyMKK3RleHQvcGxhaW4KXCBObyBuZXdsaW5lIGF0 IGVuZCBvZiBwcm9wZXJ0eQpJbmRleDogc3lzL3NwaWdlbmlvLmgKPT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lz L3NwaWdlbmlvLmgJKHJldmlzaW9uIDApCisrKyBzeXMvc3BpZ2VuaW8uaAkod29ya2luZyBjb3B5 KQpAQCAtMCwwICsxLDUyIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMCBEb3VnIFJhYnNv bgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0 IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1 dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF IElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5E CisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1F RC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJM RQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN UExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNF UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP TikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElO RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0Yg VEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM SVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKgkkRnJlZUJTRCQKKyAqLworCisjaWZuZGVm IF9TWVNfU1BJR0VOSU9fSF8KKyNkZWZpbmUgX1NZU19TUElHRU5JT19IXworCisjaW5jbHVkZSA8 c3lzL19pb3ZlYy5oPgorCitzdHJ1Y3Qgc3BpZ2VuX3RyYW5zZmVyIHsKKwlzdHJ1Y3QgaW92ZWMg c3RfY29tbWFuZDsgLyogbWFzdGVyIHRvIHNsYXZlICovCisJc3RydWN0IGlvdmVjIHN0X2RhdGE7 ICAgIC8qIHNsYXZlIHRvIG1hc3RlciBhbmQvb3IgbWFzdGVyIHRvIHNsYXZlICovCit9OworCitz dHJ1Y3Qgc3BpZ2VuX3RyYW5zZmVyX21tYXBwZWQgeworCXNpemVfdCBzdG1fY29tbWFuZF9sZW5n dGg7IC8qIGF0IG9mZnNldCAwIGluIG1tYXAoMikgYXJlYSAqLworCXNpemVfdCBzdG1fZGF0YV9s ZW5ndGg7ICAgIC8qIGF0IG9mZnNldCBzdG1fY29tbWFuZF9sZW5ndGggKi8KK307CisKKyNkZWZp bmUgU1BJR0VOSU9DX0JBU0UgICAgICdTJworI2RlZmluZSBTUElHRU5JT0NfVFJBTlNGRVIgCSAg IF9JT1coU1BJR0VOSU9DX0JBU0UsIDAsIFwKKwkgICAgc3RydWN0IHNwaWdlbl90cmFuc2ZlcikK KyNkZWZpbmUgU1BJR0VOSU9DX1RSQU5TRkVSX01NQVBQRUQgX0lPVyhTUElHRU5JT0NfQkFTRSwg MSwgXAorCSAgICBzdHJ1Y3Qgc3BpZ2VuX3RyYW5zZmVyX21tYXBwZWQpCisjZGVmaW5lIFNQSUdF TklPQ19HRVRfQ0xPQ0tfU1BFRUQgIF9JT1IoU1BJR0VOSU9DX0JBU0UsIDIsIHVpbnQzMl90KQor I2RlZmluZSBTUElHRU5JT0NfU0VUX0NMT0NLX1NQRUVEICBfSU9XKFNQSUdFTklPQ19CQVNFLCAz LCB1aW50MzJfdCkKKworI2VuZGlmIC8qICFfU1lTX1NQSUdFTklPX0hfICovCgpQcm9wZXJ0eSBj aGFuZ2VzIG9uOiBzeXMvc3BpZ2VuaW8uaApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkFkZGVkOiBzdm46ZW9sLXN0eWxl CiMjIC0wLDAgKzEgIyMKK25hdGl2ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIHByb3BlcnR5CkFk ZGVkOiBzdm46a2V5d29yZHMKIyMgLTAsMCArMSAjIworRnJlZUJTRD0lSApcIE5vIG5ld2xpbmUg YXQgZW5kIG9mIHByb3BlcnR5CkFkZGVkOiBzdm46bWltZS10eXBlCiMjIC0wLDAgKzEgIyMKK3Rl eHQvcGxhaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBwcm9wZXJ0eQo= --089e0115fd1cf06895051d9db585--