Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 18 Aug 2015 22:47:52 +0000
From:      Brian Fundakowski Feldman <brianfundakowskifeldman@gmail.com>
To:        Tom Jones <jones@sdf.org>
Cc:        embedded@freebsd.org
Subject:   Re: spigen(4) SPI Generic IO interface -- need comments
Message-ID:  <CAEv1%2BOUhSAJxxWAfW2GUFVw=H-_KOs2dGg2d7uhZnFbqsHE5Qw@mail.gmail.com>
In-Reply-To: <20150817160423.GB3078@gmail.com>
References:  <CAEv1%2BOU4cFpMpeQGfnCP7L4Q_k18rOSOA9JBnKUa99DS5dFnWA@mail.gmail.com> <20150817160423.GB3078@gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
--089e0115fd1cf06895051d9db585
Content-Type: text/plain; charset=UTF-8

On Mon, Aug 17, 2015 at 12:04 PM Tom Jones <jones@sdf.org> 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--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAEv1%2BOUhSAJxxWAfW2GUFVw=H-_KOs2dGg2d7uhZnFbqsHE5Qw>