Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 15 Jan 2015 14:51:17 +0100
From:      Svatopluk Kraus <onwahe@gmail.com>
To:        freebsd-arm@freebsd.org
Subject:   interrupt framework
Message-ID:  <CAFHCsPX5kG_v-F-cjpyMQsT_b386eok=mqWW0%2BEUb_4-_1Otnw@mail.gmail.com>

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

Hi community,

I and Michal Meloun have done some work on ARM interrupt framework and
this is the result.

We've started with intrng project with Ian's WIP changes, have looked
at Andrew's ARM64 git repository, and this is how we think an
interrupt framework should look like. We've implemented it with
removable interrupt controllers in mind (PCI world). It's not finished
from this point of view, however some functions are more complex
because of it.

It's tested on pandaboard and only GIC is implemented now. There is no
problem to implement it to other controllers. We are open to questions
and can finish our work considering any comments. Whoever is waiting
for ARM interrupt framework as we were, you are welcome to test it.
Whoever is welcome. The patches are done against FreeBSD-11-current
revision 277210. There are two new files.

ARM_INTRNG option must be added to board configuration file for new framework.

There are still some things not implemented and some things which
should be discussed like PPI support. For example, how to enable PPI
interrupt on other CPUs when they are already running?

We keep in mind that an interrupt framework should be helpfull but
general enough to not dictate interrupt controlles too much. Thus we
try to keep some things as much separated as possible. Each interrupt
is represented by an interrupt source (ISRC) in the framework. An ISRC
is described by an interrupt number which is much more an unique
resource handle - totally independent on internal representation of
interrupts in any interrupt controller.

An interrupt is described by cells in FDT world. The cells can be
decoded only by associated interrupt controller and as such, they are
transparent for interrupt framework. The framework provides
arm_fdt_map_irq() function which maps this transparent cells to an
interrupt number. It creates an ISRC, saves cells on it, and once when
associated interrupt controller is registered, it provides the ISRC
with cells into the controller.

It's a controller responsibility to save an ISRC associated with
cells. An ISRC is transparent for any controller. However, an
controller can set/get its data to/from an ISRC. Further, an
controller should set a name to an ISRC according to internal
representation of associated interrupt.

An controller interrupt dispatch function can call framework only if
it has associated ISRC to received interrupt.

For legacy reason, there is arm_namespace_map_irq() function. An
interrupt is described by namespace type and a number from the
namespace. It's intented for use with no FDT drivers. Now, it's used
for mapping an IPI on a controller.

We think that it's better to call chained controllers (with filter
only) without MI interrupt framework overhead, so we implemented
shortcut. It could be utilized by INTR_SOLO flag during
bus_setup_intr().

Only an interrupt controller can really know its position in interrupt
controller's tree. So root controller must claim itself as a root. In
FDT world, according to ePAPR approved version 1.1 from 08 April 2011,
page 30:

"The root of the interrupt tree is determined when traversal of the
interrupt tree reaches an interrupt controller node without an
interrupts property and thus no explicit interrupt parent."

Thus there are no need for any non-standard things in DTS files.

Svata

--001a113ad13c76bebd050cb126db
Content-Type: text/plain; charset=US-ASCII; name="intrng_onwahe1.diff"
Content-Disposition: attachment; filename="intrng_onwahe1.diff"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_i4y6trgc0

SW5kZXg6IHN5cy9hcm0vYXJtL2dpYy5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9hcm0vYXJtL2dpYy5j
CShyZXZpc2lvbiAyNzcyMTApCisrKyBzeXMvYXJtL2FybS9naWMuYwkod29ya2luZyBjb3B5KQpA
QCAtMzQsNiArMzQsOCBAQAogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgogX19GQlNESUQoIiRGcmVl
QlNEJCIpOwogCisjaW5jbHVkZSAib3B0X3BsYXRmb3JtLmgiCisKICNpbmNsdWRlIDxzeXMvcGFy
YW0uaD4KICNpbmNsdWRlIDxzeXMvc3lzdG0uaD4KICNpbmNsdWRlIDxzeXMvYnVzLmg+CkBAIC00
MCw2ICs0Miw3IEBACiAjaW5jbHVkZSA8c3lzL2tlcm5lbC5oPgogI2luY2x1ZGUgPHN5cy9rdHIu
aD4KICNpbmNsdWRlIDxzeXMvbW9kdWxlLmg+CisjaW5jbHVkZSA8c3lzL21hbGxvYy5oPgogI2lu
Y2x1ZGUgPHN5cy9ybWFuLmg+CiAjaW5jbHVkZSA8c3lzL3BjcHUuaD4KICNpbmNsdWRlIDxzeXMv
cHJvYy5oPgpAQCAtNTUsNiArNTgsMTEgQEAKICNpbmNsdWRlIDxkZXYvb2Z3L29md19idXMuaD4K
ICNpbmNsdWRlIDxkZXYvb2Z3L29md19idXNfc3Vici5oPgogCisjaWZkZWYgQVJNX0lOVFJORwor
I2luY2x1ZGUgPHN5cy9zY2hlZC5oPgorI2luY2x1ZGUgInBpY19pZi5oIgorI2VuZGlmCisKIC8q
IFdlIGFyZSB1c2luZyBHSUN2MiByZWdpc3RlciBuYW1pbmcgKi8KIAogLyogRGlzdHJpYnV0b3Ig
UmVnaXN0ZXJzICovCkBAIC04Myw4ICs5MSw4IEBACiAjZGVmaW5lIEdJQ0NfQUJQUgkJMHgwMDFD
CQkJLyogdjEgSUNDQUJQUiAqLwogI2RlZmluZSBHSUNDX0lJRFIJCTB4MDBGQwkJCS8qIHYxIElD
Q0lJRFIqLwogCi0jZGVmaW5lCUdJQ19GSVJTVF9JUEkJCSAwCS8qIElycXMgMC0xNSBhcmUgU0dJ
cy9JUElzLiAqLwotI2RlZmluZQlHSUNfTEFTVF9JUEkJCTE1CisjZGVmaW5lCUdJQ19GSVJTVF9T
R0kJCSAwCS8qIElycXMgMC0xNSBhcmUgU0dJcy9JUElzLiAqLworI2RlZmluZQlHSUNfTEFTVF9T
R0kJCTE1CiAjZGVmaW5lCUdJQ19GSVJTVF9QUEkJCTE2CS8qIElycXMgMTYtMzEgYXJlIHByaXZh
dGUgKHBlciAqLwogI2RlZmluZQlHSUNfTEFTVF9QUEkJCTMxCS8qIGNvcmUpIHBlcmlwaGVyYWwg
aW50ZXJydXB0cy4gKi8KICNkZWZpbmUJR0lDX0ZJUlNUX1NQSQkJMzIJLyogSXJxcyAzMisgYXJl
IHNoYXJlZCBwZXJpcGhlcmFscy4gKi8KQEAgLTk4LDggKzEwNiwyMyBAQAogI2RlZmluZSBHSUNE
X0lDRkdSX1RSSUdfRURHRQkoMSA8PCAxKQogI2RlZmluZSBHSUNEX0lDRkdSX1RSSUdfTUFTSwkw
eDIKIAorI2lmZGVmIEFSTV9JTlRSTkcKKyNkZWZpbmUgR0lDX0lOVFJOQU1FX0xFTgkzMgorCitz
dHJ1Y3QgYXJtX2dpY19pcnEgeworCXN0cnVjdCBhcm1faXJxc3JjICoJZ2lfaXNyYzsKKwljaGFy
CQkJZ2lfbmFtZVtHSUNfSU5UUk5BTUVfTEVOXTsKK307CisKK3N0YXRpYyBpbnQgYXJtX2dpY19p
bnRyKHZvaWQgKiwgc3RydWN0IHRyYXBmcmFtZSAqKTsKKyNlbmRpZgorCiBzdHJ1Y3QgYXJtX2dp
Y19zb2Z0YyB7CiAJZGV2aWNlX3QJCWdpY19kZXY7CisjaWZkZWYgQVJNX0lOVFJORworCXZvaWQg
KgkJCWdpY19pbnRyaGFuZDsKKwlzdHJ1Y3QgYXJtX2dpY19pcnEgKglnaWNfaXJxczsKKyNlbmRp
ZgogCXN0cnVjdCByZXNvdXJjZSAqCWdpY19yZXNbM107CiAJYnVzX3NwYWNlX3RhZ190CQlnaWNf
Y19ic3Q7CiAJYnVzX3NwYWNlX3RhZ190CQlnaWNfZF9ic3Q7CkBAIC0xMTMsMTAgKzEzNiwxMyBA
QAogc3RhdGljIHN0cnVjdCByZXNvdXJjZV9zcGVjIGFybV9naWNfc3BlY1tdID0gewogCXsgU1lT
X1JFU19NRU1PUlksCTAsCVJGX0FDVElWRSB9LAkvKiBEaXN0cmlidXRvciByZWdpc3RlcnMgKi8K
IAl7IFNZU19SRVNfTUVNT1JZLAkxLAlSRl9BQ1RJVkUgfSwJLyogQ1BVIEludGVycnVwdCBJbnRm
LiByZWdpc3RlcnMgKi8KKyNpZmRlZiBBUk1fSU5UUk5HCisJeyBTWVNfUkVTX0lSUSwJICAwLCBS
Rl9BQ1RJVkUgfCBSRl9PUFRJT05BTCB9LCAvKiBQYXJlbnQgaW50ZXJydXB0ICovCisjZW5kaWYK
IAl7IC0xLCAwIH0KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXJtX2dpY19zb2Z0YyAqYXJtX2dpY19z
YyA9IE5VTEw7CitzdGF0aWMgc3RydWN0IGFybV9naWNfc29mdGMgKmdpY19zYyA9IE5VTEw7CiAK
ICNkZWZpbmUJZ2ljX2NfcmVhZF80KF9zYywgX3JlZykJCVwKICAgICBidXNfc3BhY2VfcmVhZF80
KChfc2MpLT5naWNfY19ic3QsIChfc2MpLT5naWNfY19ic2gsIChfcmVnKSkKQEAgLTEyNyw5ICsx
NTMsMTEgQEAKICNkZWZpbmUJZ2ljX2Rfd3JpdGVfNChfc2MsIF9yZWcsIF92YWwpCQlcCiAgICAg
YnVzX3NwYWNlX3dyaXRlXzQoKF9zYyktPmdpY19kX2JzdCwgKF9zYyktPmdpY19kX2JzaCwgKF9y
ZWcpLCAoX3ZhbCkpCiAKKyNpZm5kZWYgQVJNX0lOVFJORwogc3RhdGljIGludCBnaWNfY29uZmln
X2lycShpbnQgaXJxLCBlbnVtIGludHJfdHJpZ2dlciB0cmlnLAogICAgIGVudW0gaW50cl9wb2xh
cml0eSBwb2wpOwogc3RhdGljIHZvaWQgZ2ljX3Bvc3RfZmlsdGVyKHZvaWQgKik7CisjZW5kaWYK
IAogc3RhdGljIHN0cnVjdCBvZndfY29tcGF0X2RhdGEgY29tcGF0X2RhdGFbXSA9IHsKIAl7ImFy
bSxnaWMiLAkJdHJ1ZX0sCS8qIE5vbi1zdGFuZGFyZCwgdXNlZCBpbiBGcmVlQlNEIGR0cy4gKi8K
QEAgLTE1NSwxMCArMTgzLDU4IEBACiAJcmV0dXJuIChCVVNfUFJPQkVfREVGQVVMVCk7CiB9CiAK
KyNpZmRlZiBBUk1fSU5UUk5HCitzdGF0aWMgaW5saW5lIHZvaWQKK2dpY19pcnFfdW5tYXNrKHN0
cnVjdCBhcm1fZ2ljX3NvZnRjICpzYywgdV9pbnQgaXJxKQoreworCisJZ2ljX2Rfd3JpdGVfNChz
YywgR0lDRF9JU0VOQUJMRVIoaXJxID4+IDUpLCAoMVVMIDw8IChpcnEgJiAweDFGKSkpOworfQor
CitzdGF0aWMgaW5saW5lIHZvaWQKK2dpY19pcnFfbWFzayhzdHJ1Y3QgYXJtX2dpY19zb2Z0YyAq
c2MsIHVfaW50IGlycSkKK3sKKworCWdpY19kX3dyaXRlXzQoc2MsIEdJQ0RfSUNFTkFCTEVSKGly
cSA+PiA1KSwgKDFVTCA8PCAoaXJxICYgMHgxRikpKTsKK30KKyNlbmRpZgorCisjaWZkZWYgU01Q
CisjaWZkZWYgQVJNX0lOVFJORwogc3RhdGljIHZvaWQKIGFybV9naWNfaW5pdF9zZWNvbmRhcnko
ZGV2aWNlX3QgZGV2KQogewogCXN0cnVjdCBhcm1fZ2ljX3NvZnRjICpzYyA9IGRldmljZV9nZXRf
c29mdGMoZGV2KTsKKwl1X2ludCBpcnE7CisKKwlmb3IgKGlycSA9IDA7IGlycSA8IHNjLT5uaXJx
czsgaXJxICs9IDQpCisJCWdpY19kX3dyaXRlXzQoc2MsIEdJQ0RfSVBSSU9SSVRZUihpcnEgPj4g
MiksIDApOworCisJLyogU2V0IGFsbCB0aGUgaW50ZXJydXB0cyB0byBiZSBpbiBHcm91cCAwIChz
ZWN1cmUpICovCisJZm9yIChpcnEgPSAwOyBpcnEgPCBzYy0+bmlycXM7IGlycSArPSAzMikgewor
CQlnaWNfZF93cml0ZV80KHNjLCBHSUNEX0lHUk9VUFIoaXJxID4+IDUpLCAwKTsKKwl9CisKKwkv
KiBFbmFibGUgQ1BVIGludGVyZmFjZSAqLworCWdpY19jX3dyaXRlXzQoc2MsIEdJQ0NfQ1RMUiwg
MSk7CisKKwkvKiBTZXQgcHJpb3JpdHkgbWFzayByZWdpc3Rlci4gKi8KKwlnaWNfY193cml0ZV80
KHNjLCBHSUNDX1BNUiwgMHhmZik7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0IGRpc3RyaWJ1dGlv
biAqLworCWdpY19kX3dyaXRlXzQoc2MsIEdJQ0RfQ1RMUiwgMHgwMSk7CisKKwkvKiBVbm1hc2sg
YXR0YWNoZWQgUFBJIGludGVycnVwdHMuICovCisJZm9yIChpcnEgPSBHSUNfRklSU1RfUFBJOyBp
cnEgPD0gR0lDX0xBU1RfUFBJOyBpcnErKykgeworCQlpZiAoc2MtPmdpY19pcnFzW2lycV0uZ2lf
aXNyYyAhPSBOVUxMKQorCQkJZ2ljX2lycV91bm1hc2soc2MsIGlycSk7CisJfQorfQorI2Vsc2UK
K3N0YXRpYyB2b2lkCithcm1fZ2ljX2luaXRfc2Vjb25kYXJ5KGRldmljZV90IGRldikKK3sKKwlz
dHJ1Y3QgYXJtX2dpY19zb2Z0YyAqc2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7CiAJaW50IGk7
CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2MtPm5pcnFzOyBpICs9IDQpCkBAIC0xODUsNyArMjYxLDEw
IEBACiAJZ2ljX2Rfd3JpdGVfNChzYywgR0lDRF9JU0VOQUJMRVIoMjkgPj4gNSksICgxVUwgPDwg
KDI5ICYgMHgxRikpKTsKIAlnaWNfZF93cml0ZV80KHNjLCBHSUNEX0lTRU5BQkxFUigzMCA+PiA1
KSwgKDFVTCA8PCAoMzAgJiAweDFGKSkpOwogfQorI2VuZGlmIC8qIEFSTV9JTlRSTkcgKi8KKyNl
bmRpZiAvKiBTTVAgKi8KIAorI2lmbmRlZiBBUk1fSU5UUk5HCiBpbnQKIGdpY19kZWNvZGVfZmR0
KHVpbnQzMl90IGlwYXJlbnQsIHVpbnQzMl90ICppbnRyLCBpbnQgKmludGVycnVwdCwKICAgICBp
bnQgKnRyaWcsIGludCAqcG9sKQpAQCAtMjMwLDYgKzMwOSw3IEBACiAJfQogCXJldHVybiAoMCk7
CiB9CisjZW5kaWYKIAogc3RhdGljIGludAogYXJtX2dpY19hdHRhY2goZGV2aWNlX3QgZGV2KQpA
QCAtMjM4LDcgKzMxOCw3IEBACiAJaW50CQlpOwogCXVpbnQzMl90CWljY2lpZHI7CiAKLQlpZiAo
YXJtX2dpY19zYykKKwlpZiAoZ2ljX3NjKQogCQlyZXR1cm4gKEVOWElPKTsKIAogCXNjID0gZGV2
aWNlX2dldF9zb2Z0YyhkZXYpOwpAQCAtMjQ5LDcgKzMyOSw3IEBACiAJfQogCiAJc2MtPmdpY19k
ZXYgPSBkZXY7Ci0JYXJtX2dpY19zYyA9IHNjOworCWdpY19zYyA9IHNjOwogCiAJLyogSW5pdGlh
bGl6ZSBtdXRleCAqLwogCW10eF9pbml0KCZzYy0+bXV0ZXgsICJHSUMgbG9jayIsICIiLCBNVFhf
U1BJTik7CkBAIC0yNjksOSArMzQ5LDE0IEBACiAJc2MtPm5pcnFzID0gZ2ljX2RfcmVhZF80KHNj
LCBHSUNEX1RZUEVSKTsKIAlzYy0+bmlycXMgPSAzMiAqICgoc2MtPm5pcnFzICYgMHgxZikgKyAx
KTsKIAorI2lmZGVmIEFSTV9JTlRSTkcKKwlzYy0+Z2ljX2lycXMgPSBtYWxsb2Moc2MtPm5pcnFz
ICogc2l6ZW9mICgqc2MtPmdpY19pcnFzKSwgTV9ERVZCVUYsCisJICAgIE1fV0FJVE9LIHwgTV9a
RVJPKTsKKyNlbHNlCiAJLyogU2V0IHVwIGZ1bmN0aW9uIHBvaW50ZXJzICovCiAJYXJtX3Bvc3Rf
ZmlsdGVyID0gZ2ljX3Bvc3RfZmlsdGVyOwogCWFybV9jb25maWdfaXJxID0gZ2ljX2NvbmZpZ19p
cnE7CisjZW5kaWYKIAogCWljY2lpZHIgPSBnaWNfY19yZWFkXzQoc2MsIEdJQ0NfSUlEUik7CiAJ
ZGV2aWNlX3ByaW50ZihkZXYsInBuIDB4JXgsIGFyY2ggMHgleCwgcmV2IDB4JXgsIGltcGxlbWVu
dGVyIDB4JXggaXJxcyAldVxuIiwKQEAgLTMwNywxMSArMzkyLDQyOSBAQAogCiAJLyogRW5hYmxl
IGludGVycnVwdCBkaXN0cmlidXRpb24gKi8KIAlnaWNfZF93cml0ZV80KHNjLCBHSUNEX0NUTFIs
IDB4MDEpOworI2lmbmRlZiBBUk1fSU5UUk5HCisJcmV0dXJuICgwKTsKKyNlbHNlCisJLyoKKwkg
KiBOb3csIHdoZW4gZXZlcnl0aGluZyBpcyBpbml0aWFsaXplZCwgaXQncyByaWdodCB0aW1lIHRv
CisJICogcmVnaXN0ZXIgaW50ZXJydXB0IGNvbnRyb2xsZXIgdG8gaW50ZXJydXB0IGZyYW1lZm9y
ay4KKwkgKi8KKwlpZiAoYXJtX3JlZ2lzdGVyX3BpYyhkZXYpICE9IDApIHsKKwkJZGV2aWNlX3By
aW50ZihkZXYsICJjb3VsZCBub3QgcmVnaXN0ZXIgSUNcbiIpOworCQlnb3RvIGNsZWFudXA7CisJ
fQogCisJaWYgKHNjLT5naWNfcmVzWzJdID09IE5VTEwpIHsKKwkJaWYgKGFybV9pcnFfc2V0X3Jv
b3QoZGV2LCBhcm1fZ2ljX2ludHIsIHNjLAorCQkgICAgR0lDX0xBU1RfU0dJIC0gR0lDX0ZJUlNU
X1NHSSArIDEpICE9IDApIHsKKwkJCWRldmljZV9wcmludGYoZGV2LCAiY291bGQgbm90IHNldCBQ
SUMgYXMgYSByb290XG4iKTsKKwkJCWFybV91bnJlZ2lzdGVyX3BpYyhkZXYpOworCQkJZ290byBj
bGVhbnVwOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGJ1c19zZXR1cF9pbnRyKGRldiwgc2MtPmdp
Y19yZXNbMl0sIElOVFJfVFlQRV9NSVNDIHwKKwkJICAgIElOVFJfU09MTywgKHZvaWQqKWFybV9n
aWNfaW50ciwgTlVMTCwgc2MsCisJCSAgICAmc2MtPmdpY19pbnRyaGFuZCkpIHsKKwkJCWRldmlj
ZV9wcmludGYoZGV2LCAiY291bGQgbm90IHNldHVwIGlycSBoYW5kbGVyXG4iKTsKKwkJCWFybV91
bnJlZ2lzdGVyX3BpYyhkZXYpOworCQkJZ290byBjbGVhbnVwOworCQl9CisJfQorCiAJcmV0dXJu
ICgwKTsKKworY2xlYW51cDoKKwkvKgorCSAqIFhYWCAtIG5vdCBpbXBsZW1lbnRlZCBhcm1fZ2lj
X2RldGFjaCgpIHNob3VsZCBiZSBjYWxsZWQgIQorCSAqLworCWlmIChzYy0+Z2ljX2lycXMgIT0g
TlVMTCkKKwkJZnJlZShzYy0+Z2ljX2lycXMsIE1fREVWQlVGKTsKKwlidXNfcmVsZWFzZV9yZXNv
dXJjZXMoZGV2LCBhcm1fZ2ljX3NwZWMsIHNjLT5naWNfcmVzKTsKKwlyZXR1cm4oRU5YSU8pOwor
I2VuZGlmCiB9CiAKKyNpZmRlZiBBUk1fSU5UUk5HCiBzdGF0aWMgaW50Cithcm1fZ2ljX2ludHIo
dm9pZCAqYXJnLCBzdHJ1Y3QgdHJhcGZyYW1lICp0ZikKK3sKKwlzdHJ1Y3QgYXJtX2dpY19zb2Z0
YyAqc2MgPSAoc3RydWN0IGFybV9naWNfc29mdGMgKilhcmc7CisJc3RydWN0IGFybV9naWNfaXJx
ICpnaTsKKwl1aW50MzJfdCBpcnFfYWN0aXZlX3JlZywgaXJxOworCisJaXJxX2FjdGl2ZV9yZWcg
PSBnaWNfY19yZWFkXzQoc2MsIEdJQ0NfSUFSKTsKKwlpcnEgPSBpcnFfYWN0aXZlX3JlZyAmIDB4
M0ZGOworCisJLyoKKwkgKiAxLiBFT0kgbXVzdCBiZSBkb25lIGhlcmUgYXMgdGhlIG90aGVyIGJp
dHMgKGkuZS4gQ1BVIG51bWJlciksIG5vdAorCSAqICAgIGp1c3QgdGhlIElSUSBudW1iZXIgYXJl
IHJlcXVpcmVkLCBhbmQgd2UgZG8gbm90IGhhdmUgYSBtZXRob2QKKwkgKiAgICBob3cgdG8gcGFz
cyB0aGlzIGluZm9ybWF0aW9uIHRvIGRpc3BhdGNoIGZ1bmN0aW9uLgorCSAqIDIuIEVPSSBtdXN0
IGJlIGRvbmUgb24gc2FtZSBDUFUsIHdoZXJlIGludGVycnVwdCBoYXMgZmlyZWQuIFRodXMKKwkg
KiAgICB3ZSBtdXN0IGVuc3VyZSB0aGF0IGludGVycnVwdGVkIHRocmVhZCBkb2VzIG5vdCBtaWdy
YXRlIHRvCisJICogICAgYW5vdGhlciBDUFUuCisJICogMy4gRU9JIGNhbm5vdCBiZSBkZWxheWVk
IGJ5IGFueSBwcmVlbXB0aW9uLCB3aGljaCBjb3VsZCBoYXBwZW4gb24KKwkgKiAgICBjcml0aWNh
bF9leGl0KCkgdXNlZCBpbiBNSSBpbnRyIGNvZGUsIHdoZW4gaW50ZXJydXB0IHRocmVhZCBpcwor
CSAqICAgIHNjaGVkdWxlZC4gU2VlIG5leHQgcG9pbnQuCisJICogNC4gSVBJX1JFTkRFWlZPVVMg
YXNzdW1lcyB0aGF0IG5vIHByZWVtcHRpb24gaXMgcGVybWl0dGVkIGR1cmluZworCSAqICAgIGFu
IGFjdGlvbiBhbmQgYW55IHVzZSBvZiBjcml0aWNhbF9leGl0KCkgY291bGQgYnJlYWsgdGhpcwor
CSAqICAgIGFzc3VtcHRpb24uIFNlZSBjb21tZW50cyB3aXRoaW4gc21wX3JlbmRlenZvdXNfYWN0
aW9uKCkuCisJICovCisKKwlpZiAoaXJxID49IHNjLT5uaXJxcykgeworCQlkZXZpY2VfcHJpbnRm
KHNjLT5naWNfZGV2LCAiU3B1cmlvdXMgaW50ZXJydXB0IGRldGVjdGVkXG4iKTsKKwkJZ2ljX2Nf
d3JpdGVfNChzYywgR0lDQ19FT0lSLCBpcnFfYWN0aXZlX3JlZyk7CisJCXJldHVybiAoMCk7CisJ
fQorCisJZ2kgPSAmc2MtPmdpY19pcnFzW2lycV07CisJaWYgKGdpLT5naV9pc3JjID09IE5VTEwp
IHsKKwkJZGV2aWNlX3ByaW50ZihzYy0+Z2ljX2RldiwgIlN0cmF5IGludGVycnVwdCAldSBkZXRl
Y3RlZFxuIiwgaXJxKTsKKwkJZ2ljX2lycV9tYXNrKHNjLCBpcnEpOworCQlnaWNfY193cml0ZV80
KHNjLCBHSUNDX0VPSVIsIGlycV9hY3RpdmVfcmVnKTsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwkv
KgorCSAqIE5vdGUgdGhhdCBHSUNfRklSU1RfU0dJIGlzIHplcm8gYW5kIGlzIG5vdCB1c2VkIGlu
ICdpZicgc3RhdGVtZW50CisJICogYXMgY29tcGlsZXIgY29tcGxhaW5zIHRoYXQgY29tcGFyaW5n
IHVfaW50ID49IDAgaXMgYWx3YXlzIHRydWUuCisJICovCisJaWYgKGlycSA8PSBHSUNfTEFTVF9T
R0kpIHsKKyNpZmRlZiBTTVAKKwkJLyogQ2FsbCBFT0kgZm9yIGFsbCBJUEkgYmVmb3JlIGRpc3Bh
dGNoLiAqLworCQlnaWNfY193cml0ZV80KHNjLCBHSUNDX0VPSVIsIGlycV9hY3RpdmVfcmVnKTsK
KwkJYXJtX2Rpc3BhdGNoX3NnaShnaS0+Z2lfaXNyYywgdGYpOworCQlyZXR1cm4gKEZJTFRFUl9I
QU5ETEVEKTsKKyNlbHNlCisJCXByaW50ZigiU0dJICV1IG9uIFVQIHN5c3RlbSBkZXRlY3RlZFxu
IiwgaXJxIC0gR0lDX0ZJUlNUX1NHSSk7CisJCWdpY19jX3dyaXRlXzQoc2MsIEdJQ0NfRU9JUiwg
aXJxX2FjdGl2ZV9yZWcpOworCQlyZXR1cm4gKDApOworI2VuZGlmCisJfQorCisJY3JpdGljYWxf
ZW50ZXIoKTsKKwlpZiAoaXJxIDw9IEdJQ19MQVNUX1BQSSkKKwkJYXJtX2Rpc3BhdGNoX3BwaShn
aS0+Z2lfaXNyYywgdGYpOworCWVsc2UKKwkJYXJtX2Rpc3BhdGNoX3NwaShnaS0+Z2lfaXNyYywg
dGYpOworCWdpY19jX3dyaXRlXzQoc2MsIEdJQ0NfRU9JUiwgaXJxX2FjdGl2ZV9yZWcpOworCWNy
aXRpY2FsX2V4aXQoKTsKKwlhcm1faXJxX21lbW9yeV9iYXJyaWVyKGlycSk7CisJcmV0dXJuIChG
SUxURVJfSEFORExFRCk7Cit9CisKK3N0YXRpYyBpbnQKK2dpY19uYW1lc3BhY2VfdG9faXJxKHN0
cnVjdCBhcm1fZ2ljX3NvZnRjICpzYywgdV9pbnQgdHlwZSwgdV9pbnQgbnVtLAorICAgIHVfaW50
ICppcnFwKQoreworCXVfaW50IGlycTsKKworCWlmICh0eXBlID09IElTUkNUX1NHSSkKKwkJaXJx
ID0gR0lDX0ZJUlNUX1NHSSArIG51bTsKKwllbHNlIGlmICh0eXBlID09IElTUkNUX1BQSSkKKwkJ
aXJxID0gR0lDX0ZJUlNUX1BQSSArIG51bTsKKwllbHNlIGlmICh0eXBlID09IElTUkNUX1NQSSkK
KwkJaXJxID0gR0lDX0ZJUlNUX1NQSSArIG51bTsKKwllbHNlCisJCXJldHVybiAoRUlOVkFMKTsK
KworCWlmIChpcnEgPj0gc2MtPm5pcnFzKQorCQlyZXR1cm4gKEVJTlZBTCk7CisKKwkqaXJxcCA9
IGlycTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CitnaWNfaXJxX3RvX25hbWVzcGFj
ZShzdHJ1Y3QgYXJtX2dpY19zb2Z0YyAqc2MsIHVfaW50IGlycSwgdV9pbnQgKnR5cGVwLAordV9p
bnQgKm51bXApCit7CisKKwlpZiAoaXJxIDw9IEdJQ19MQVNUX1NHSSkgeworCQkqdHlwZXAgPSBJ
U1JDVF9TR0k7CisJCSpudW1wID0gaXJxIC0gR0lDX0ZJUlNUX1NHSTsKKwl9IGVsc2UgaWYgKGly
cSA8PSBHSUNfTEFTVF9QUEkpIHsKKwkJKnR5cGVwID0gSVNSQ1RfUFBJOworCQkqbnVtcCA9IGly
cSAtIEdJQ19GSVJTVF9QUEk7CisJfSBlbHNlIGlmIChpcnEgPCBzYy0+bmlycXMpIHsKKwkJKnR5
cGVwID0gSVNSQ1RfU1BJOworCQkqbnVtcCA9IGlycSAtIEdJQ19GSVJTVF9TUEk7CisJfSBlbHNl
CisJCXJldHVybiAoRUlOVkFMKTsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK2dp
Y19hdHRhY2hfaXNyYyhzdHJ1Y3QgYXJtX2dpY19zb2Z0YyAqc2MsIHN0cnVjdCBhcm1faXJxc3Jj
ICppc3JjLCB1X2ludCBpcnEpCit7CisJc3RydWN0IGFybV9naWNfaXJxICpnaSA9ICZzYy0+Z2lj
X2lycXNbaXJxXTsKKworCWlmIChnaS0+Z2lfaXNyYyA9PSBpc3JjKQorCQlyZXR1cm4gKDApOwor
CisJaWYgKGdpLT5naV9pc3JjICE9IE5VTEwpCisJCXJldHVybiAoRUVYSVNUKTsKKworCWlmIChp
cnEgPD0gR0lDX0xBU1RfU0dJKQorCQlzbnByaW50ZihnaS0+Z2lfbmFtZSwgR0lDX0lOVFJOQU1F
X0xFTiwgIiVzKHNnaSV1KSIsCisJCSAgICBkZXZpY2VfZ2V0X25hbWV1bml0KHNjLT5naWNfZGV2
KSwgaXJxIC0gR0lDX0ZJUlNUX1NHSSk7CisJZWxzZSBpZiAoaXJxIDw9IEdJQ19MQVNUX1BQSSkK
KwkJc25wcmludGYoZ2ktPmdpX25hbWUsIEdJQ19JTlRSTkFNRV9MRU4sICIlcyhwcGkldSkiLAor
CQkgICAgZGV2aWNlX2dldF9uYW1ldW5pdChzYy0+Z2ljX2RldiksIGlycSAtIEdJQ19GSVJTVF9Q
UEkpOworCWVsc2UKKwkJc25wcmludGYoZ2ktPmdpX25hbWUsIEdJQ19JTlRSTkFNRV9MRU4sICIl
cyhzcGkldSkiLAorCQkgICAgZGV2aWNlX2dldF9uYW1ldW5pdChzYy0+Z2ljX2RldiksIGlycSAt
IEdJQ19GSVJTVF9TUEkpOworCisJYXJtX2lycV9zZXRfZGF0YShpc3JjLCAodm9pZCAqKWlycSk7
CisJYXJtX2lycV9zZXRfbmFtZShpc3JjLCBnaS0+Z2lfbmFtZSk7CisKKwlnaS0+Z2lfaXNyYyA9
IGlzcmM7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorZ2ljX2RldGFjaF9pc3JjKHN0
cnVjdCBhcm1fZ2ljX3NvZnRjICpzYywgc3RydWN0IGFybV9pcnFzcmMgKmlzcmMsIHVfaW50IGly
cSkKK3sKKwlzdHJ1Y3QgYXJtX2dpY19pcnEgKmdpID0gJnNjLT5naWNfaXJxc1tpcnFdOworCisJ
aWYgKGlycSA+PSBzYy0+bmlycXMgfHwgZ2ktPmdpX2lzcmMgIT0gaXNyYykKKwkJcmV0dXJuIChF
SU5WQUwpOworCisJYXJtX2lycV9zZXRfZGF0YShpc3JjLCBOVUxMKTsKKwlhcm1faXJxX3NldF9u
YW1lKGlzcmMsIE5VTEwpOworCisJZ2ktPmdpX2lzcmMgPSBOVUxMOworCXJldHVybiAoMCk7Cit9
CisKK3N0YXRpYyBpbnQKK2FybV9naWNfbWFwKGRldmljZV90IGRldiwgc3RydWN0IGFybV9pcnFz
cmMgKmlzcmMsIHVfaW50IHR5cGUsIHVfaW50IG51bSkKK3sKKwlzdHJ1Y3QgYXJtX2dpY19zb2Z0
YyAqc2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7CisJdV9pbnQgaXJxOworCWludCBlcnJvcjsK
KworCWVycm9yID0gZ2ljX25hbWVzcGFjZV90b19pcnEoc2MsIHR5cGUsIG51bSwgJmlycSk7CisJ
aWYgKGVycm9yICE9IDApCisJCXJldHVybiAoZXJyb3IpOworCisJcmV0dXJuIChnaWNfYXR0YWNo
X2lzcmMoc2MsIGlzcmMsIGlycSkpOworfQorCitzdGF0aWMgdm9pZAorZ2ljX2NvbmZpZyhzdHJ1
Y3QgYXJtX2dpY19zb2Z0YyAqc2MsIHVfaW50IGlycSwgZW51bSBpbnRyX3RyaWdnZXIgdHJpZywK
KyAgICBlbnVtIGludHJfcG9sYXJpdHkgcG9sKQoreworCXVpbnQzMl90IHJlZzsKKwl1aW50MzJf
dCBtYXNrOworCisJaWYgKGlycSA8IEdJQ19GSVJTVF9TUEkpCisJCXJldHVybjsKKworCW10eF9s
b2NrX3NwaW4oJnNjLT5tdXRleCk7CisKKwlyZWcgPSBnaWNfZF9yZWFkXzQoc2MsIEdJQ0RfSUNG
R1IoaXJxID4+IDQpKTsKKwltYXNrID0gKHJlZyA+PiAyKihpcnEgJSAxNikpICYgMHgzOworCisJ
aWYgKHBvbCA9PSBJTlRSX1BPTEFSSVRZX0xPVykgeworCQltYXNrICY9IH5HSUNEX0lDRkdSX1BP
TF9NQVNLOworCQltYXNrIHw9IEdJQ0RfSUNGR1JfUE9MX0xPVzsKKwl9IGVsc2UgaWYgKHBvbCA9
PSBJTlRSX1BPTEFSSVRZX0hJR0gpIHsKKwkJbWFzayAmPSB+R0lDRF9JQ0ZHUl9QT0xfTUFTSzsK
KwkJbWFzayB8PSBHSUNEX0lDRkdSX1BPTF9ISUdIOworCX0KKworCWlmICh0cmlnID09IElOVFJf
VFJJR0dFUl9MRVZFTCkgeworCQltYXNrICY9IH5HSUNEX0lDRkdSX1RSSUdfTUFTSzsKKwkJbWFz
ayB8PSBHSUNEX0lDRkdSX1RSSUdfTFZMOworCX0gZWxzZSBpZiAodHJpZyA9PSBJTlRSX1RSSUdH
RVJfRURHRSkgeworCQltYXNrICY9IH5HSUNEX0lDRkdSX1RSSUdfTUFTSzsKKwkJbWFzayB8PSBH
SUNEX0lDRkdSX1RSSUdfRURHRTsKKwl9CisKKwkvKiBTZXQgbWFzayAqLworCXJlZyA9IHJlZyAm
IH4oMHgzIDw8IDIqKGlycSAlIDE2KSk7CisJcmVnID0gcmVnIHwgKG1hc2sgPDwgMiooaXJxICUg
MTYpKTsKKwlnaWNfZF93cml0ZV80KHNjLCBHSUNEX0lDRkdSKGlycSA+PiA0KSwgcmVnKTsKKwor
CW10eF91bmxvY2tfc3Bpbigmc2MtPm11dGV4KTsKK30KKworI2lmZGVmIEZEVAorc3RhdGljIGlu
dAorYXJtX2dpY19tYXBfZmR0KGRldmljZV90IGRldiwgc3RydWN0IGFybV9pcnFzcmMgKmlzcmMs
IHBjZWxsX3QgKmNlbGxzLAorICAgIHVfaW50IG5jZWxscykKK3sKKwlzdHJ1Y3QgYXJtX2dpY19z
b2Z0YyAqc2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7CisJdV9pbnQgaXJxLCB0eXBlLCBudW0s
IHRyaXBvbDsKKwllbnVtIGludHJfdHJpZ2dlciB0cmlnOworCWVudW0gaW50cl9wb2xhcml0eSBw
b2w7CisJaW50IGVycm9yOworCisJaWYgKG5jZWxscyA9PSAxKSB7CisJCWlycSA9IGNlbGxzWzBd
OworCisJCWVycm9yID0gZ2ljX2lycV90b19uYW1lc3BhY2Uoc2MsIGlycSwgJnR5cGUsICZudW0p
OworCQlpZiAoZXJyb3IgIT0gMCkKKwkJCXJldHVybiAoZXJyb3IpOworCisJCXBvbCA9IElOVFJf
UE9MQVJJVFlfQ09ORk9STTsKKwkJdHJpZyA9IElOVFJfVFJJR0dFUl9DT05GT1JNOworCX0gZWxz
ZSB7CisKKwkJdHlwZSA9IGNlbGxzWzBdID09IDAgPyBJU1JDVF9TUEkgOiBJU1JDVF9QUEk7CisJ
CW51bSA9IGNlbGxzWzFdOworCisJCWVycm9yID0gZ2ljX25hbWVzcGFjZV90b19pcnEoc2MsIHR5
cGUsIG51bSwgJmlycSk7CisJCWlmIChlcnJvciAhPSAwKQorCQkJcmV0dXJuIChlcnJvcik7CisK
KwkJLyoKKwkJICogSW4gaW50clsyXSwgYml0c1szOjBdIGFyZSB0cmlnZ2VyIHR5cGUgYW5kIGxl
dmVsIGZsYWdzLgorCQkgKiAgIDEgPSBsb3ctdG8taGlnaCBlZGdlIHRyaWdnZXJlZAorCQkgKiAg
IDIgPSBoaWdoLXRvLWxvdyBlZGdlIHRyaWdnZXJlZAorCQkgKiAgIDQgPSBhY3RpdmUgaGlnaCBs
ZXZlbC1zZW5zaXRpdmUKKwkJICogICA4ID0gYWN0aXZlIGxvdyBsZXZlbC1zZW5zaXRpdmUKKwkJ
ICogVGhlIGhhcmR3YXJlIG9ubHkgc3VwcG9ydHMgYWN0aXZlLWhpZ2gtbGV2ZWwgb3IgcmlzaW5n
LWVkZ2UuCisJCSAqLworCQl0cmlwb2wgPSBjZWxsc1syXTsKKwkJaWYgKHRyaXBvbCAmIDB4MGEp
IHsKKwkJCXByaW50ZigidW5zdXBwb3J0ZWQgdHJpZ2dlci9wb2xhcml0eSBjb25maWd1cmF0aW9u
ICIKKwkJCSAgICAiMHglMnhcbiIsIHRyaXBvbCAmIDB4MGYpOworCQkJcmV0dXJuIChFTk9UU1VQ
KTsKKwkJfQorCQlwb2wgID0gSU5UUl9QT0xBUklUWV9DT05GT1JNOworCQlpZiAodHJpcG9sICYg
MHgwMSkKKwkJCXRyaWcgPSBJTlRSX1RSSUdHRVJfRURHRTsKKwkJZWxzZQorCQkJdHJpZyA9IElO
VFJfVFJJR0dFUl9MRVZFTDsKKwl9CisKKwllcnJvciA9IGdpY19hdHRhY2hfaXNyYyhzYywgaXNy
YywgaXJxKTsKKwlpZiAoZXJyb3IgIT0gMCkKKwkJcmV0dXJuIChlcnJvcik7CisKKwlhcm1faXJx
X3NldF9uYW1lc3BhY2UoaXNyYywgdHlwZSwgbnVtKTsKKworCWdpY19jb25maWcoc2MsIGlycSwg
dHJpZywgcG9sKTsKKwlyZXR1cm4gKDApOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK2FybV9n
aWNfdW5tYXAoZGV2aWNlX3QgZGV2LCBzdHJ1Y3QgYXJtX2lycXNyYyAqaXNyYykKK3sKKwlzdHJ1
Y3QgYXJtX2dpY19zb2Z0YyAqc2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7CisJdV9pbnQgaXJx
OworCisJaXJxID0gKHVfaW50KWFybV9pcnFfZ2V0X2RhdGEoaXNyYyk7CisJcmV0dXJuIChnaWNf
ZGV0YWNoX2lzcmMoc2MsIGlzcmMsIGlycSkpOworfQorCitzdGF0aWMgaW50Cithcm1fZ2ljX2Jp
bmQoZGV2aWNlX3QgZGV2LCBzdHJ1Y3QgYXJtX2lycXNyYyAqaXNyYywgY3B1c2V0X3QgY3B1bWFz
aykKK3sKKworCXJldHVybiAoRU9QTk9UU1VQUCk7IC8qIGZvciBub3cgKi8KK30KKworc3RhdGlj
IGludAorYXJtX2dpY19jb25maWcoZGV2aWNlX3QgZGV2LCBzdHJ1Y3QgYXJtX2lycXNyYyAqaXNy
YywgZW51bSBpbnRyX3RyaWdnZXIgdHJpZywKKyAgICBlbnVtIGludHJfcG9sYXJpdHkgcG9sKQor
eworCXN0cnVjdCBhcm1fZ2ljX3NvZnRjICpzYyA9IGRldmljZV9nZXRfc29mdGMoZGV2KTsKKwl1
X2ludCBpcnE7CisKKwkvKiBYWFggbW92ZSB0aGVzZSBjaGVja3MgdG8gZnJhbWV3b3JrICovCisJ
aWYgKCh0cmlnICE9IElOVFJfVFJJR0dFUl9FREdFKSAmJiAodHJpZyAhPSBJTlRSX1RSSUdHRVJf
TEVWRUwpICYmCisJICAgICh0cmlnICE9IElOVFJfVFJJR0dFUl9DT05GT1JNKSkKKwkJcmV0dXJu
IChFSU5WQUwpOworCWlmICgocG9sICE9IElOVFJfUE9MQVJJVFlfSElHSCkgJiYgKHBvbCAhPSBJ
TlRSX1BPTEFSSVRZX0xPVykgJiYKKwkgICAgKHBvbCAhPSBJTlRSX1BPTEFSSVRZX0NPTkZPUk0p
KQorCQlyZXR1cm4gKEVJTlZBTCk7CisKKwlpcnEgPSAodV9pbnQpYXJtX2lycV9nZXRfZGF0YShp
c3JjKTsKKwlpZiAoaXJxID49IHNjLT5uaXJxcyB8fCBzYy0+Z2ljX2lycXNbaXJxXS5naV9pc3Jj
ICE9IGlzcmMpCisJCXJldHVybiAoRUlOVkFMKTsKKworCWdpY19jb25maWcoc2MsIGlycSwgdHJp
ZywgcG9sKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgdm9pZAorYXJtX2dpY19lbmFibGUo
ZGV2aWNlX3QgZGV2LCBzdHJ1Y3QgYXJtX2lycXNyYyAqaXNyYykKK3sKKwlzdHJ1Y3QgYXJtX2dp
Y19zb2Z0YyAqc2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7CisJdV9pbnQgaXJxOworCisJaXJx
ID0gKHVfaW50KWFybV9pcnFfZ2V0X2RhdGEoaXNyYyk7CisJaWYgKGlycSA+PSBzYy0+bmlycXMg
fHwgc2MtPmdpY19pcnFzW2lycV0uZ2lfaXNyYyAhPSBpc3JjKQorCQlyZXR1cm47CisKKwlpZiAo
aXJxIDw9IEdJQ19MQVNUX1NHSSkKKwkJcmV0dXJuOyAvKiB2MiBJTVBMRU1FTlRBVElPTiBERUZJ
TkVEICovCisKKwlhcm1faXJxX21lbW9yeV9iYXJyaWVyKGlycSk7CisJZ2ljX2lycV91bm1hc2so
c2MsIGlycSk7Cit9CisKK3N0YXRpYyB2b2lkCithcm1fZ2ljX2Rpc2FibGUoZGV2aWNlX3QgZGV2
LCBzdHJ1Y3QgYXJtX2lycXNyYyAqaXNyYykKK3sKKwlzdHJ1Y3QgYXJtX2dpY19zb2Z0YyAqc2Mg
PSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7CisJdV9pbnQgaXJxOworCisJaXJxID0gKHVfaW50KWFy
bV9pcnFfZ2V0X2RhdGEoaXNyYyk7CisJaWYgKGlycSA+PSBzYy0+bmlycXMgfHwgc2MtPmdpY19p
cnFzW2lycV0uZ2lfaXNyYyAhPSBpc3JjKQorCQlyZXR1cm47CisKKwlpZiAoaXJxIDw9IEdJQ19M
QVNUX1NHSSkKKwkJcmV0dXJuOyAvKiB2MiBJTVBMRU1FTlRBVElPTiBERUZJTkVEICovCisKKwln
aWNfaXJxX21hc2soc2MsIGlycSk7Cit9CisKK3N0YXRpYyB2b2lkCithcm1fZ2ljX3ByZV9pdGhy
ZWFkKGRldmljZV90IGRldiwgc3RydWN0IGFybV9pcnFzcmMgKmlzcmMpCit7CisKKwlhcm1fZ2lj
X2Rpc2FibGUoZGV2LCBpc3JjKTsKK30KKworc3RhdGljIHZvaWQKK2FybV9naWNfcG9zdF9pdGhy
ZWFkKGRldmljZV90IGRldiwgc3RydWN0IGFybV9pcnFzcmMgKmlzcmMpCit7CisKKwlhcm1fZ2lj
X2VuYWJsZShkZXYsIGlzcmMpOworfQorCitzdGF0aWMgdm9pZAorYXJtX2dpY19wb3N0X2ZpbHRl
cihkZXZpY2VfdCBkZXYsIHN0cnVjdCBhcm1faXJxc3JjICppc3JjKQoreworCisJLyogRU9JIG11
c3QgYmUgZG9uZSBpbiBjb250cm9sbGVyJ3MgaW50ZXJydXB0IHJvdXRpbmUuICovCit9CisKKyNp
ZmRlZiBTTVAKK3N0YXRpYyB2b2lkCithcm1fZ2ljX2lwaV9zZW5kKGRldmljZV90IGRldiwgc3Ry
dWN0IGFybV9pcnFzcmMgKmlzcmMsIGNwdXNldF90IGNwdXMpCit7CisJc3RydWN0IGFybV9naWNf
c29mdGMgKnNjID0gZGV2aWNlX2dldF9zb2Z0YyhkZXYpOworCXVpbnQzMl90IGlycSwgdmFsID0g
MCwgaTsKKworCWlycSA9ICh1X2ludClhcm1faXJxX2dldF9kYXRhKGlzcmMpOworCWlmIChpcnEg
Pj0gc2MtPm5pcnFzIHx8IHNjLT5naWNfaXJxc1tpcnFdLmdpX2lzcmMgIT0gaXNyYykKKwkJcmV0
dXJuOworCisJZm9yIChpID0gMDsgaSA8IE1BWENQVTsgaSsrKQorCQlpZiAoQ1BVX0lTU0VUKGks
ICZjcHVzKSkKKwkJCXZhbCB8PSAxIDw8ICgxNiArIGkpOworCisJZ2ljX2Rfd3JpdGVfNChzYywg
R0lDRF9TR0lSKDApLCB2YWwgfCBpcnEpOworfQorI2VuZGlmCisjZWxzZQorc3RhdGljIGludAog
YXJtX2dpY19uZXh0X2lycShzdHJ1Y3QgYXJtX2dpY19zb2Z0YyAqc2MsIGludCBsYXN0X2lycSkK
IHsKIAl1aW50MzJfdCBhY3RpdmVfaXJxOwpAQCAtMzIzLDcgKzgyNiw3IEBACiAJICogYml0cyAo
aWUgQ1BVIG51bWJlciksIG5vdCBqdXN0IHRoZSBJUlEgbnVtYmVyLCBhbmQgd2UgZG8gbm90CiAJ
ICogaGF2ZSB0aGlzIGluZm9ybWF0aW9uIGxhdGVyLgogCSAqLwotCWlmICgoYWN0aXZlX2lycSAm
IDB4M2ZmKSA8PSBHSUNfTEFTVF9JUEkpCisJaWYgKChhY3RpdmVfaXJxICYgMHgzZmYpIDw9IEdJ
Q19MQVNUX1NHSSkKIAkJZ2ljX2Nfd3JpdGVfNChzYywgR0lDQ19FT0lSLCBhY3RpdmVfaXJxKTsK
IAlhY3RpdmVfaXJxICY9IDB4M0ZGOwogCkBAIC0zOTYsNyArODk5LDcgQEAKIAlzdHJ1Y3QgYXJt
X2dpY19zb2Z0YyAqc2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7CiAKIAlnaWNfZF93cml0ZV80
KHNjLCBHSUNEX0lDRU5BQkxFUihpcnEgPj4gNSksICgxVUwgPDwgKGlycSAmIDB4MUYpKSk7Ci0J
Z2ljX2Nfd3JpdGVfNChzYywgR0lDQ19FT0lSLCBpcnEpOworCWdpY19jX3dyaXRlXzQoc2MsIEdJ
Q0NfRU9JUiwgaXJxKTsgLyogWFhYIC0gbm90IGFsbG93ZWQgKi8KIH0KIAogc3RhdGljIHZvaWQK
QEAgLTQwNCw3ICs5MDcsNyBAQAogewogCXN0cnVjdCBhcm1fZ2ljX3NvZnRjICpzYyA9IGRldmlj
ZV9nZXRfc29mdGMoZGV2KTsKIAotCWlmIChpcnEgPiBHSUNfTEFTVF9JUEkpCisJaWYgKGlycSA+
IEdJQ19MQVNUX1NHSSkKIAkJYXJtX2lycV9tZW1vcnlfYmFycmllcihpcnEpOwogCiAJZ2ljX2Rf
d3JpdGVfNChzYywgR0lDRF9JU0VOQUJMRVIoaXJxID4+IDUpLCAoMVVMIDw8IChpcnEgJiAweDFG
KSkpOwpAQCAtNDUxLDEwICs5NTQsMTAgQEAKIHN0YXRpYyB2b2lkCiBnaWNfcG9zdF9maWx0ZXIo
dm9pZCAqYXJnKQogewotCXN0cnVjdCBhcm1fZ2ljX3NvZnRjICpzYyA9IGFybV9naWNfc2M7CisJ
c3RydWN0IGFybV9naWNfc29mdGMgKnNjID0gZ2ljX3NjOwogCXVpbnRwdHJfdCBpcnEgPSAodWlu
dHB0cl90KSBhcmc7CiAKLQlpZiAoaXJxID4gR0lDX0xBU1RfSVBJKQorCWlmIChpcnEgPiBHSUNf
TEFTVF9TR0kpCiAJCWFybV9pcnFfbWVtb3J5X2JhcnJpZXIoaXJxKTsKIAlnaWNfY193cml0ZV80
KHNjLCBHSUNDX0VPSVIsIGlycSk7CiB9CkBAIC00NjMsNyArOTY2LDcgQEAKIGdpY19jb25maWdf
aXJxKGludCBpcnEsIGVudW0gaW50cl90cmlnZ2VyIHRyaWcsIGVudW0gaW50cl9wb2xhcml0eSBw
b2wpCiB7CiAKLQlyZXR1cm4gKGFybV9naWNfY29uZmlnKGFybV9naWNfc2MtPmdpY19kZXYsIGly
cSwgdHJpZywgcG9sKSk7CisJcmV0dXJuIChhcm1fZ2ljX2NvbmZpZyhnaWNfc2MtPmdpY19kZXYs
IGlycSwgdHJpZywgcG9sKSk7CiB9CiAKIHZvaWQKQEAgLTQ3MCw3ICs5NzMsNyBAQAogYXJtX21h
c2tfaXJxKHVpbnRwdHJfdCBuYikKIHsKIAotCWFybV9naWNfbWFzayhhcm1fZ2ljX3NjLT5naWNf
ZGV2LCBuYik7CisJYXJtX2dpY19tYXNrKGdpY19zYy0+Z2ljX2RldiwgbmIpOwogfQogCiB2b2lk
CkBAIC00NzcsNyArOTgwLDcgQEAKIGFybV91bm1hc2tfaXJxKHVpbnRwdHJfdCBuYikKIHsKIAot
CWFybV9naWNfdW5tYXNrKGFybV9naWNfc2MtPmdpY19kZXYsIG5iKTsKKwlhcm1fZ2ljX3VubWFz
ayhnaWNfc2MtPmdpY19kZXYsIG5iKTsKIH0KIAogaW50CkBAIC00ODQsNyArOTg3LDcgQEAKIGFy
bV9nZXRfbmV4dF9pcnEoaW50IGxhc3RfaXJxKQogewogCi0JcmV0dXJuIChhcm1fZ2ljX25leHRf
aXJxKGFybV9naWNfc2MsIGxhc3RfaXJxKSk7CisJcmV0dXJuIChhcm1fZ2ljX25leHRfaXJxKGdp
Y19zYywgbGFzdF9pcnEpKTsKIH0KIAogdm9pZApAQCAtNDkxLDcgKzk5NCw3IEBACiBhcm1faW5p
dF9zZWNvbmRhcnlfaWModm9pZCkKIHsKIAotCWFybV9naWNfaW5pdF9zZWNvbmRhcnkoYXJtX2dp
Y19zYy0+Z2ljX2Rldik7CisJYXJtX2dpY19pbml0X3NlY29uZGFyeShnaWNfc2MtPmdpY19kZXYp
OwogfQogCiAjaWZkZWYgU01QCkBAIC00OTksNyArMTAwMiw3IEBACiBwaWNfaXBpX3NlbmQoY3B1
c2V0X3QgY3B1cywgdV9pbnQgaXBpKQogewogCi0JYXJtX2dpY19pcGlfc2VuZChhcm1fZ2ljX3Nj
LT5naWNfZGV2LCBjcHVzLCBpcGkpOworCWFybV9naWNfaXBpX3NlbmQoZ2ljX3NjLT5naWNfZGV2
LCBjcHVzLCBpcGkpOwogfQogCiBpbnQKQEAgLTUwNiw3ICsxMDA5LDcgQEAKIHBpY19pcGlfcmVh
ZChpbnQgaSkKIHsKIAotCXJldHVybiAoYXJtX2dpY19pcGlfcmVhZChhcm1fZ2ljX3NjLT5naWNf
ZGV2LCBpKSk7CisJcmV0dXJuIChhcm1fZ2ljX2lwaV9yZWFkKGdpY19zYy0+Z2ljX2RldiwgaSkp
OwogfQogCiB2b2lkCkBAIC01MTMsMTQgKzEwMTYsMzQgQEAKIHBpY19pcGlfY2xlYXIoaW50IGlw
aSkKIHsKIAotCWFybV9naWNfaXBpX2NsZWFyKGFybV9naWNfc2MtPmdpY19kZXYsIGlwaSk7CisJ
YXJtX2dpY19pcGlfY2xlYXIoZ2ljX3NjLT5naWNfZGV2LCBpcGkpOwogfQogI2VuZGlmCisjZW5k
aWYgLyogQVJNX0lOVFJORyAqLwogCiBzdGF0aWMgZGV2aWNlX21ldGhvZF90IGFybV9naWNfbWV0
aG9kc1tdID0gewogCS8qIERldmljZSBpbnRlcmZhY2UgKi8KIAlERVZNRVRIT0QoZGV2aWNlX3By
b2JlLAkJYXJtX2dpY19wcm9iZSksCiAJREVWTUVUSE9EKGRldmljZV9hdHRhY2gsCWFybV9naWNf
YXR0YWNoKSwKKyNpZmRlZiBBUk1fSU5UUk5HCisJLyogSW50ZXJydXB0IGNvbnRyb2xsZXIgaW50
ZXJmYWNlICovCisJREVWTUVUSE9EKHBpY19tYXAsCQlhcm1fZ2ljX21hcCksCisjaWZkZWYgRkRU
CisJREVWTUVUSE9EKHBpY19tYXBfZmR0LAkJYXJtX2dpY19tYXBfZmR0KSwKKyNlbmRpZgorCURF
Vk1FVEhPRChwaWNfdW5tYXAsCQlhcm1fZ2ljX3VubWFwKSwKKwlERVZNRVRIT0QocGljX2JpbmQs
CQlhcm1fZ2ljX2JpbmQpLAorCURFVk1FVEhPRChwaWNfY29uZmlnLAkJYXJtX2dpY19jb25maWcp
LAorCURFVk1FVEhPRChwaWNfZGlzYWJsZSwJCWFybV9naWNfZGlzYWJsZSksCisJREVWTUVUSE9E
KHBpY19lbmFibGUsCQlhcm1fZ2ljX2VuYWJsZSksCisJREVWTUVUSE9EKHBpY19wcmVfaXRocmVh
ZCwJYXJtX2dpY19wcmVfaXRocmVhZCksCisJREVWTUVUSE9EKHBpY19wb3N0X2l0aHJlYWQsCWFy
bV9naWNfcG9zdF9pdGhyZWFkKSwKKwlERVZNRVRIT0QocGljX3Bvc3RfZmlsdGVyLAlhcm1fZ2lj
X3Bvc3RfZmlsdGVyKSwKKyNpZmRlZiBTTVAKKwlERVZNRVRIT0QocGljX2luaXRfc2Vjb25kYXJ5
LAlhcm1fZ2ljX2luaXRfc2Vjb25kYXJ5KSwKKwlERVZNRVRIT0QocGljX2lwaV9zZW5kLAkJYXJt
X2dpY19pcGlfc2VuZCksCisjZW5kaWYKKyNlbmRpZgogCXsgMCwgMCB9CiB9OwogCkluZGV4OiBz
eXMvYXJtL2FybS9tcF9tYWNoZGVwLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL2FybS9hcm0vbXBfbWFj
aGRlcC5jCShyZXZpc2lvbiAyNzcyMTApCisrKyBzeXMvYXJtL2FybS9tcF9tYWNoZGVwLmMJKHdv
cmtpbmcgY29weSkKQEAgLTczLDcgKzczLDkgQEAKIC8qIFNldCB0byAxIG9uY2Ugd2UncmUgcmVh
ZHkgdG8gbGV0IHRoZSBBUHMgb3V0IG9mIHRoZSBwZW4uICovCiB2b2xhdGlsZSBpbnQgYXBzX3Jl
YWR5ID0gMDsKIAorI2lmbmRlZiBBUk1fSU5UUk5HCiBzdGF0aWMgaW50IGlwaV9oYW5kbGVyKHZv
aWQgKmFyZyk7CisjZW5kaWYKIHZvaWQgc2V0X3N0YWNrcHRycyhpbnQgY3B1KTsKIAogLyogVGVt
cG9yYXJ5IHZhcmlhYmxlcyBmb3IgaW5pdF9zZWNvbmRhcnkoKSAgKi8KQEAgLTE0OSw3ICsxNTEs
NiBAQAogewogCXN0cnVjdCBwY3B1ICpwYzsKIAl1aW50MzJfdCBsb29wX2NvdW50ZXI7Ci0JaW50
IHN0YXJ0ID0gMCwgZW5kID0gMDsKIAogCWNwdV9zZXR1cChOVUxMKTsKIAlzZXR0dGIocG1hcF9w
YSk7CkBAIC0xOTksMTggKzIwMCw2IEBACiAKIAltdHhfdW5sb2NrX3NwaW4oJmFwX2Jvb3RfbXR4
KTsKIAotCS8qIEVuYWJsZSBpcGkgKi8KLSNpZmRlZiBJUElfSVJRX1NUQVJUCi0Jc3RhcnQgPSBJ
UElfSVJRX1NUQVJUOwotI2lmZGVmIElQSV9JUlFfRU5ECi0gIAllbmQgPSBJUElfSVJRX0VORDsK
LSNlbHNlCi0JZW5kID0gSVBJX0lSUV9TVEFSVDsKLSNlbmRpZgotI2VuZGlmCi0JCQkJCi0JZm9y
IChpbnQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKQotCQlhcm1fdW5tYXNrX2lycShpKTsKIAll
bmFibGVfaW50ZXJydXB0cyhQU1JfSSk7CiAKIAlsb29wX2NvdW50ZXIgPSAwOwpAQCAtMjMzLDYg
KzIyMiwxMDggQEAKIAkvKiBOT1RSRUFDSEVEICovCiB9CiAKKyNpZmRlZiBBUk1fSU5UUk5HCitz
dGF0aWMgdm9pZAoraXBpX3JlbmRlenZvdXModm9pZCAqZHVtbXkgX191bnVzZWQpCit7CisKKwlD
VFIwKEtUUl9TTVAsICJJUElfUkVOREVaVk9VUyIpOworCXNtcF9yZW5kZXp2b3VzX2FjdGlvbigp
OworfQorCitzdGF0aWMgdm9pZAoraXBpX2FzdCh2b2lkICpkdW1teSBfX3VudXNlZCkKK3sKKwor
CUNUUjAoS1RSX1NNUCwgIklQSV9BU1QiKTsKK30KKworc3RhdGljIHZvaWQKK2lwaV9zdG9wKHZv
aWQgKmR1bW15IF9fdW51c2VkKQoreworCXVfaW50IGNwdTsKKworCS8qCisJICogSVBJX1NUT1Bf
SEFSRCBpcyBtYXBwZWQgdG8gSVBJX1NUT1AuCisJICovCisJQ1RSMChLVFJfU01QLCAiSVBJX1NU
T1Agb3IgSVBJX1NUT1BfSEFSRCIpOworCisJY3B1ID0gUENQVV9HRVQoY3B1aWQpOworCXNhdmVj
dHgoJnN0b3BwY2JzW2NwdV0pOworCisJLyoKKwkgKiBDUFVzIGFyZSBzdG9wcGVkIHdoZW4gZW50
ZXJpbmcgdGhlIGRlYnVnZ2VyIGFuZCBhdAorCSAqIHN5c3RlbSBzaHV0ZG93biwgYm90aCBldmVu
dHMgd2hpY2ggY2FuIHByZWNlZGUgYQorCSAqIHBhbmljIGR1bXAuICBGb3IgdGhlIGR1bXAgdG8g
YmUgY29ycmVjdCwgYWxsIGNhY2hlcworCSAqIG11c3QgYmUgZmx1c2hlZCBhbmQgaW52YWxpZGF0
ZWQsIGJ1dCBvbiBBUk0gdGhlcmUncworCSAqIG5vIHdheSB0byBicm9hZGNhc3QgYSB3Ymludl9h
bGwgdG8gb3RoZXIgY29yZXMuCisJICogSW5zdGVhZCwgd2UgaGF2ZSBlYWNoIGNvcmUgZG8gdGhl
IGxvY2FsIHdiaW52X2FsbCBhcworCSAqIHBhcnQgb2Ygc3RvcHBpbmcgdGhlIGNvcmUuICBUaGUg
Y29yZSByZXF1ZXN0aW5nIHRoZQorCSAqIHN0b3Agd2lsbCBkbyB0aGUgbDIgY2FjaGUgZmx1c2gg
YWZ0ZXIgYWxsIG90aGVyIGNvcmVzCisJICogaGF2ZSBkb25lIHRoZWlyIGwxIGZsdXNoZXMgYW5k
IHN0b3BwZWQuCisJICovCisJY3B1X2lkY2FjaGVfd2JpbnZfYWxsKCk7CisKKwkvKiBJbmRpY2F0
ZSB3ZSBhcmUgc3RvcHBlZCAqLworCUNQVV9TRVRfQVRPTUlDKGNwdSwgJnN0b3BwZWRfY3B1cyk7
CisKKwkvKiBXYWl0IGZvciByZXN0YXJ0ICovCisJd2hpbGUgKCFDUFVfSVNTRVQoY3B1LCAmc3Rh
cnRlZF9jcHVzKSkKKwkJY3B1X3NwaW53YWl0KCk7CisKKwlDUFVfQ0xSX0FUT01JQyhjcHUsICZz
dGFydGVkX2NwdXMpOworCUNQVV9DTFJfQVRPTUlDKGNwdSwgJnN0b3BwZWRfY3B1cyk7CisJQ1RS
MChLVFJfU01QLCAiSVBJX1NUT1AgKHJlc3RhcnQpIik7Cit9CisKK3N0YXRpYyB2b2lkCitpcGlf
cHJlZW1wdCh2b2lkICphcmcpCit7CisJc3RydWN0IHRyYXBmcmFtZSAqb2xkZnJhbWU7CisJc3Ry
dWN0IHRocmVhZCAqdGQ7CisKKwljcml0aWNhbF9lbnRlcigpOworCXRkID0gY3VydGhyZWFkOwor
CXRkLT50ZF9pbnRyX25lc3RpbmdfbGV2ZWwrKzsKKwlvbGRmcmFtZSA9IHRkLT50ZF9pbnRyX2Zy
YW1lOworCXRkLT50ZF9pbnRyX2ZyYW1lID0gKHN0cnVjdCB0cmFwZnJhbWUgKilhcmc7CisKKwlD
VFIxKEtUUl9TTVAsICIlczogSVBJX1BSRUVNUFQiLCBfX2Z1bmNfXyk7CisJc2NoZWRfcHJlZW1w
dCh0ZCk7CisKKwl0ZC0+dGRfaW50cl9mcmFtZSA9IG9sZGZyYW1lOworCXRkLT50ZF9pbnRyX25l
c3RpbmdfbGV2ZWwtLTsKKwljcml0aWNhbF9leGl0KCk7Cit9CisKK3N0YXRpYyB2b2lkCitpcGlf
aGFyZGNsb2NrKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdHJhcGZyYW1lICpvbGRmcmFtZTsKKwlz
dHJ1Y3QgdGhyZWFkICp0ZDsKKworCWNyaXRpY2FsX2VudGVyKCk7CisJdGQgPSBjdXJ0aHJlYWQ7
CisJdGQtPnRkX2ludHJfbmVzdGluZ19sZXZlbCsrOworCW9sZGZyYW1lID0gdGQtPnRkX2ludHJf
ZnJhbWU7CisJdGQtPnRkX2ludHJfZnJhbWUgPSAoc3RydWN0IHRyYXBmcmFtZSAqKWFyZzsKKwor
CUNUUjEoS1RSX1NNUCwgIiVzOiBJUElfSEFSRENMT0NLIiwgX19mdW5jX18pOworCWhhcmRjbG9j
a2ludHIoKTsKKworCXRkLT50ZF9pbnRyX2ZyYW1lID0gb2xkZnJhbWU7CisJdGQtPnRkX2ludHJf
bmVzdGluZ19sZXZlbC0tOworCWNyaXRpY2FsX2V4aXQoKTsKK30KKworc3RhdGljIHZvaWQKK2lw
aV90bGIodm9pZCAqZHVtbXkgX191bnVzZWQpCit7CisKKwlDVFIxKEtUUl9TTVAsICIlczogSVBJ
X1RMQiIsIF9fZnVuY19fKTsKKwljcHVmdW5jcy5jZl90bGJfZmx1c2hJRCgpOworfQorI2Vsc2UK
IHN0YXRpYyBpbnQKIGlwaV9oYW5kbGVyKHZvaWQgKmFyZykKIHsKQEAgLTMwOCwxNSArMzk5LDI4
IEBACiAKIAlyZXR1cm4gKEZJTFRFUl9IQU5ETEVEKTsKIH0KKyNlbmRpZgogCiBzdGF0aWMgdm9p
ZAogcmVsZWFzZV9hcHModm9pZCAqZHVtbXkgX191bnVzZWQpCiB7CiAJdWludDMyX3QgbG9vcF9j
b3VudGVyOworI2lmbmRlZiBBUk1fSU5UUk5HCiAJaW50IHN0YXJ0ID0gMCwgZW5kID0gMDsKKyNl
bmRpZgogCiAJaWYgKG1wX25jcHVzID09IDEpCiAJCXJldHVybjsKKworI2lmZGVmIEFSTV9JTlRS
TkcKKwlhcm1fc2V0dXBfaXBpaGFuZGxlcihJUElfUkVOREVaVk9VUywgTlVMTCwgaXBpX3JlbmRl
enZvdXMsIE5VTEwsIDApOworCWFybV9zZXR1cF9pcGloYW5kbGVyKElQSV9BU1QsIE5VTEwsIGlw
aV9hc3QsIE5VTEwsIDApOworCWFybV9zZXR1cF9pcGloYW5kbGVyKElQSV9TVE9QLCBOVUxMLCBp
cGlfc3RvcCwgTlVMTCwgMCk7CisJYXJtX3NldHVwX2lwaWhhbmRsZXIoSVBJX1BSRUVNUFQsIE5V
TEwsIGlwaV9wcmVlbXB0LCBOVUxMLCAwKTsKKwlhcm1fc2V0dXBfaXBpaGFuZGxlcihJUElfSEFS
RENMT0NLLCBOVUxMLCBpcGlfaGFyZGNsb2NrLCBOVUxMLCAwKTsKKwlhcm1fc2V0dXBfaXBpaGFu
ZGxlcihJUElfVExCLCBOVUxMLCBpcGlfdGxiLCBOVUxMLCAwKTsKKworI2Vsc2UKICNpZmRlZiBJ
UElfSVJRX1NUQVJUCiAJc3RhcnQgPSBJUElfSVJRX1NUQVJUOwogI2lmZGVmIElQSV9JUlFfRU5E
CkBAIC0zNDEsNiArNDQ1LDcgQEAKIAkJLyogRW5hYmxlIGlwaSAqLwogCQlhcm1fdW5tYXNrX2ly
cShpKTsKIAl9CisjZW5kaWYKIAlhdG9taWNfc3RvcmVfcmVsX2ludCgmYXBzX3JlYWR5LCAxKTsK
IAogCXByaW50ZigiUmVsZWFzZSBBUHNcbiIpOwpJbmRleDogc3lzL2FybS9hcm0vbmV4dXMuYwo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBzeXMvYXJtL2FybS9uZXh1cy5jCShyZXZpc2lvbiAyNzcyMTApCisrKyBz
eXMvYXJtL2FybS9uZXh1cy5jCSh3b3JraW5nIGNvcHkpCkBAIC0yNTEsOSArMjUxLDEyIEBACiB7
CiAJaW50IHJldCA9IEVOT0RFVjsKIAorI2lmZGVmIEFSTV9JTlRSTkcKKwlyZXQgPSBhcm1faW50
cm5nX2NvbmZpZ19pcnEoaXJxLCB0cmlnLCBwb2wpOworI2Vsc2UKIAlpZiAoYXJtX2NvbmZpZ19p
cnEpCiAJCXJldCA9ICgqYXJtX2NvbmZpZ19pcnEpKGlycSwgdHJpZywgcG9sKTsKLQorI2VuZGlm
CiAJcmV0dXJuIChyZXQpOwogfQogCkBAIC0yNjcsOSArMjcwLDE0IEBACiAJCWZsYWdzIHw9IElO
VFJfRVhDTDsKIAogCWZvciAoaXJxID0gcm1hbl9nZXRfc3RhcnQocmVzKTsgaXJxIDw9IHJtYW5f
Z2V0X2VuZChyZXMpOyBpcnErKykgeworI2lmIGRlZmluZWQoQVJNX0lOVFJORykKKwkJYXJtX3Nl
dHVwX2lycWhhbmRsZXIoY2hpbGQsIGZpbHQsIGludHIsIGFyZywgaXJxLCBmbGFncywKKwkJICAg
IGNvb2tpZXApOworI2Vsc2UKIAkJYXJtX3NldHVwX2lycWhhbmRsZXIoZGV2aWNlX2dldF9uYW1l
dW5pdChjaGlsZCksCiAJCSAgICBmaWx0LCBpbnRyLCBhcmcsIGlycSwgZmxhZ3MsIGNvb2tpZXAp
OwogCQlhcm1fdW5tYXNrX2lycShpcnEpOworI2VuZGlmCiAJfQogCXJldHVybiAoMCk7CiB9CkBA
IC0yNzgsNyArMjg2LDExIEBACiBuZXh1c190ZWFyZG93bl9pbnRyKGRldmljZV90IGRldiwgZGV2
aWNlX3QgY2hpbGQsIHN0cnVjdCByZXNvdXJjZSAqciwgdm9pZCAqaWgpCiB7CiAKKyNpZiBkZWZp
bmVkKEFSTV9JTlRSTkcpCisJcmV0dXJuIChhcm1fcmVtb3ZlX2lycWhhbmRsZXIoY2hpbGQsIHJt
YW5fZ2V0X3N0YXJ0KHIpLCBpaCkpOworI2Vsc2UKIAlyZXR1cm4gKGFybV9yZW1vdmVfaXJxaGFu
ZGxlcihybWFuX2dldF9zdGFydChyKSwgaWgpKTsKKyNlbmRpZgogfQogCiAKSW5kZXg6IHN5cy9h
cm0vaW5jbHVkZS9mZHQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvYXJtL2luY2x1ZGUvZmR0LmgJKHJl
dmlzaW9uIDI3NzIxMCkKKysrIHN5cy9hcm0vaW5jbHVkZS9mZHQuaAkod29ya2luZyBjb3B5KQpA
QCAtMzIsNiArMzIsNyBAQAogI2lmbmRlZiBfTUFDSElORV9GRFRfSF8KICNkZWZpbmUgX01BQ0hJ
TkVfRkRUX0hfCiAKKyNpbmNsdWRlICJvcHRfcGxhdGZvcm0uaCIKICNpbmNsdWRlIDxkZXYvb2Z3
L29wZW5maXJtLmg+CiAKICNpbmNsdWRlIDx2bS92bS5oPgpAQCAtNDAsMTIgKzQxLDI1IEBACiAj
aW5jbHVkZSA8bWFjaGluZS9idXMuaD4KICNpbmNsdWRlIDxtYWNoaW5lL2ludHIuaD4KIAorI2lm
ZGVmIEFSTV9JTlRSTkcKKwogLyogTWF4IGludGVycnVwdCBudW1iZXIgKi8KKyNkZWZpbmUJRkRU
X0lOVFJfTUFYCSgweGZmZmYpCisKKy8qIE1hcCBwaGFuZGxlL2ludHBpbiBwYWlyIHRvIGdsb2Jh
bCBJUlEgbnVtYmVyICovCisjZGVmaW5lCUZEVF9NQVBfSVJRKG5vZGUsIHBpbikJKGFybV9mZHRf
bWFwX2lycShub2RlLCBwaW4pKQorI2RlZmluZQlGRFRfREVTQ1JJQkVfSVJRKGlycSkJKGFybV9k
ZXNjcmliZV9pcnEoaXJxKSkKKworI2Vsc2UKKworLyogTWF4IGludGVycnVwdCBudW1iZXIgKi8K
ICNkZWZpbmUgRkRUX0lOVFJfTUFYCU5JUlEKIAogLyogTWFwIHBoYW5kbGUvaW50cGluIHBhaXIg
dG8gZ2xvYmFsIElSUSBudW1iZXIgKi8KICNkZWZpbmUJRkRUX01BUF9JUlEobm9kZSwgcGluKQko
cGluKQogCisjZW5kaWYgLyogQVJNX0lOVFJORyAqLworCiAvKgogICogQnVzIHNwYWNlIHRhZy4g
WFhYIGVuZGlhbmVzcyBpbmZvIG5lZWRzIHRvIGJlIGRlcml2ZWQgZnJvbSB0aGUgYmxvYi4KICAq
LwpJbmRleDogc3lzL2FybS9pbmNsdWRlL2ludHIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvYXJtL2lu
Y2x1ZGUvaW50ci5oCShyZXZpc2lvbiAyNzcyMTApCisrKyBzeXMvYXJtL2luY2x1ZGUvaW50ci5o
CSh3b3JraW5nIGNvcHkpCkBAIC00Myw2ICs0Myw2OCBAQAogI2luY2x1ZGUgPGRldi9vZncvb3Bl
bmZpcm0uaD4KICNlbmRpZgogCisjaWZkZWYgQVJNX0lOVFJORworCisjaWZuZGVmIE5JUlEKKyNk
ZWZpbmUJTklSUQkJMTAyNAkvKiBYWFggLSBJdCBzaG91bGQgYmUgYW4gb3B0aW9uLiAqLworI2Vu
ZGlmCisKKyNkZWZpbmUJSU5UUl9TT0xPCUlOVFJfTUQxCisKK3N0cnVjdCBhcm1faXJxc3JjOwor
dHlwZWRlZiBpbnQgYXJtX2lycV9maWx0ZXJfdCh2b2lkICphcmcsIHN0cnVjdCB0cmFwZnJhbWUg
KnRmKTsKKworI2RlZmluZSBJU1JDVF9OT05FCTAKKyNkZWZpbmUgSVNSQ1RfU1BJCTEKKyNkZWZp
bmUgSVNSQ1RfUFBJCTIKKyNkZWZpbmUgSVNSQ1RfU0dJCTMKKworI2RlZmluZSBJU1JDRl9OQU1F
U1BBQ0UJMHgwMDAxCisjZGVmaW5lIElTUkNGX0ZEVAkweDAwMDIKKyNkZWZpbmUgSVNSQ0ZfTUFQ
UEVECTB4MDAwNAorCit2b2lkIGFybV9kaXNwYXRjaF9zcGkoc3RydWN0IGFybV9pcnFzcmMgKmlz
cmMsIHN0cnVjdCB0cmFwZnJhbWUgKnRmKTsKKyNkZWZpbmUgYXJtX2Rpc3BhdGNoX3BwaQlhcm1f
ZGlzcGF0Y2hfc3BpCisKK3VfaW50IGFybV9uYW1lc3BhY2VfbWFwX2lycShkZXZpY2VfdCBkZXYs
IHVpbnQ4X3QgdHlwZSwgdWludDE2X3QgbnVtKTsKKwordm9pZCogYXJtX2lycV9nZXRfZGF0YShz
dHJ1Y3QgYXJtX2lycXNyYyAqaXNyYyk7Cit2b2lkIGFybV9pcnFfc2V0X2RhdGEoc3RydWN0IGFy
bV9pcnFzcmMgKmlzcmMsIHZvaWQgKmRhdGEpOwordm9pZCBhcm1faXJxX3NldF9uYW1lKHN0cnVj
dCBhcm1faXJxc3JjICppc3JjLCBjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgYXJtX2lycV9zZXRf
bmFtZXNwYWNlKHN0cnVjdCBhcm1faXJxc3JjICppc3JjLCB1aW50OF90IHR5cGUsIHVpbnQxNl90
IG51bSk7CisKK2ludCBhcm1faXJxX3NldF9yb290KGRldmljZV90IGRldiwgYXJtX2lycV9maWx0
ZXJfdCAqZmlsdGVyLCB2b2lkICphcmcsCisgICAgdV9pbnQgaXBpY291bnQpOworCitpbnQgYXJt
X3JlZ2lzdGVyX3BpYyhkZXZpY2VfdCBkZXYpOworaW50IGFybV91bnJlZ2lzdGVyX3BpYyhkZXZp
Y2VfdCBkZXYpOworCitpbnQgYXJtX3NldHVwX2lycWhhbmRsZXIoZGV2aWNlX3QgZGV2LCBkcml2
ZXJfZmlsdGVyX3QsIGRyaXZlcl9pbnRyX3QsIHZvaWQgKiwKKyAgICB1X2ludCwgaW50LCB2b2lk
ICoqKTsKK2ludCBhcm1fcmVtb3ZlX2lycWhhbmRsZXIoZGV2aWNlX3QgZGV2LCB1X2ludCwgdm9p
ZCAqKTsKK2ludCBhcm1faW50cm5nX2NvbmZpZ19pcnEodV9pbnQsIGVudW0gaW50cl90cmlnZ2Vy
LCBlbnVtIGludHJfcG9sYXJpdHkpOworCitjb25zdCBjaGFyICphcm1fZGVzY3JpYmVfaXJxKHVf
aW50IGlycSk7CisKKyNpZmRlZiBGRFQKK3VfaW50IGFybV9mZHRfbWFwX2lycShwaGFuZGxlX3Qs
IHBjZWxsX3QgKiwgdV9pbnQpOworI2VuZGlmCisKKyNpZmRlZiBTTVAKK3R5cGVkZWYgdm9pZCBh
cm1faXBpX2ZpbHRlcl90KHZvaWQgKik7CisKK3ZvaWQgYXJtX2Rpc3BhdGNoX3NnaShzdHJ1Y3Qg
YXJtX2lycXNyYyAqaXNyYywgc3RydWN0IHRyYXBmcmFtZSAqdGYpOworCisjZGVmaW5lIEFTSUZf
Tk9BTExPQwkweDAwMDEKKworaW50IGFybV9zZXR1cF9pcGloYW5kbGVyKHVfaW50IGlwaSwgY2hh
ciAqbmFtZSwgYXJtX2lwaV9maWx0ZXJfdCAqZmlsdGVyLAorICAgIHZvaWQgKmFyZywgdV9pbnQg
ZmxhZ3MpOworCit2b2lkIGFybV9pbml0X3NlY29uZGFyeV9waWModm9pZCk7CisjZW5kaWYKKwor
I2Vsc2UgLyogQVJNX0lOVFJORyAqLworCiAvKiBYWFggbW92ZSB0byBzdGQuKiBmaWxlcz8gKi8K
ICNpZmRlZiBDUFVfWFNDQUxFXzgxMzQyCiAjZGVmaW5lIE5JUlEJCTEyOApAQCAtNzEsNyArMTMz
LDYgQEAKICNkZWZpbmUgTklSUQkJMzIKICNlbmRpZgogCi0KIGludCBhcm1fZ2V0X25leHRfaXJx
KGludCk7CiB2b2lkIGFybV9tYXNrX2lycSh1aW50cHRyX3QpOwogdm9pZCBhcm1fdW5tYXNrX2ly
cSh1aW50cHRyX3QpOwpAQCAtODMsOCArMTQ0LDYgQEAKIGV4dGVybiBpbnQgKCphcm1fY29uZmln
X2lycSkoaW50IGlycSwgZW51bSBpbnRyX3RyaWdnZXIgdHJpZywKICAgICBlbnVtIGludHJfcG9s
YXJpdHkgcG9sKTsKIAotdm9pZCBhcm1faXJxX21lbW9yeV9iYXJyaWVyKHVpbnRwdHJfdCk7Ci0K
IHZvaWQgYXJtX2luaXRfc2Vjb25kYXJ5X2ljKHZvaWQpOwogaW50ICBnaWNfZGVjb2RlX2ZkdCh1
aW50MzJfdCBpcGFyZW50bm9kZSwgdWludDMyX3QgKmludHJjZWxscywgaW50ICppbnRlcnJ1cHQs
CiAgICAgaW50ICp0cmlnLCBpbnQgKnBvbCk7CkBAIC05Myw0ICsxNTIsOCBAQAogaW50IGFybV9m
ZHRfbWFwX2lycShwaGFuZGxlX3QsIHBjZWxsX3QgKiwgaW50KTsKICNlbmRpZgogCisjZW5kaWYg
LyogQVJNX0lOVFJORyAqLworCit2b2lkIGFybV9pcnFfbWVtb3J5X2JhcnJpZXIodWludHB0cl90
KTsKKwogI2VuZGlmCS8qIF9NQUNISU5FX0lOVFJfSCAqLwpJbmRleDogc3lzL2FybS9pbmNsdWRl
L3NtcC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9hcm0vaW5jbHVkZS9zbXAuaAkocmV2aXNpb24gMjc3
MjEwKQorKysgc3lzL2FybS9pbmNsdWRlL3NtcC5oCSh3b3JraW5nIGNvcHkpCkBAIC02LDYgKzYs
MTggQEAKICNpbmNsdWRlIDxzeXMvX2NwdXNldC5oPgogI2luY2x1ZGUgPG1hY2hpbmUvcGNiLmg+
CiAKKyNpZmRlZiBBUk1fSU5UUk5HCitlbnVtIHsKKwlJUElfQVNULAorCUlQSV9QUkVFTVBULAor
CUlQSV9SRU5ERVpWT1VTLAorCUlQSV9TVE9QLAorCUlQSV9TVE9QX0hBUkQgPSBJUElfU1RPUCwg
LyogVGhlc2UgYXJlIHN5bm9ueW1zIG9uIGFybS4gKi8KKwlJUElfSEFSRENMT0NLLAorCUlQSV9U
TEIsCisJQVJNX0lQSV9DT1VOVAorfTsKKyNlbHNlCiAjZGVmaW5lIElQSV9BU1QJCTAKICNkZWZp
bmUgSVBJX1BSRUVNUFQJMgogI2RlZmluZSBJUElfUkVOREVaVk9VUwkzCkBAIC0xMyw2ICsyNSw3
IEBACiAjZGVmaW5lIElQSV9TVE9QX0hBUkQJNAogI2RlZmluZSBJUElfSEFSRENMT0NLCTYKICNk
ZWZpbmUgSVBJX1RMQgkJNworI2VuZGlmCiAKIHZvaWQJaW5pdF9zZWNvbmRhcnkoaW50IGNwdSk7
CiB2b2lkCW1wZW50cnkodm9pZCk7CkBAIC0yMyw4ICszNiwxMCBAQAogCiAvKiBQSUMgaW50ZXJm
YWNlICovCiB2b2lkCXBpY19pcGlfc2VuZChjcHVzZXRfdCBjcHVzLCB1X2ludCBpcGkpOworI2lm
bmRlZiBBUk1fSU5UUk5HCiB2b2lkCXBpY19pcGlfY2xlYXIoaW50IGlwaSk7CiBpbnQJcGljX2lw
aV9yZWFkKGludCBhcmcpOworI2VuZGlmCiAKIC8qIFBsYXRmb3JtIGludGVyZmFjZSAqLwogdm9p
ZAlwbGF0Zm9ybV9tcF9zZXRtYXhpZCh2b2lkKTsKSW5kZXg6IHN5cy9hcm0vdGkvb21hcDQvb21h
cDRfbXAuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvYXJtL3RpL29tYXA0L29tYXA0X21wLmMJKHJldmlz
aW9uIDI3NzIxMCkKKysrIHN5cy9hcm0vdGkvb21hcDQvb21hcDRfbXAuYwkod29ya2luZyBjb3B5
KQpAQCAtNDEsNyArNDEsMTIgQEAKIHZvaWQKIHBsYXRmb3JtX21wX2luaXRfc2Vjb25kYXJ5KHZv
aWQpCiB7CisKKyNpZmRlZiBBUk1fSU5UUk5HCisJYXJtX2luaXRfc2Vjb25kYXJ5X3BpYygpOwor
I2Vsc2UKIAlhcm1faW5pdF9zZWNvbmRhcnlfaWMoKTsKKyNlbmRpZgogfQogCiB2b2lkCkluZGV4
OiBzeXMvY29uZi9maWxlcy5hcm0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL2NvbmYvZmlsZXMuYXJtCShy
ZXZpc2lvbiAyNzcyMTApCisrKyBzeXMvY29uZi9maWxlcy5hcm0JKHdvcmtpbmcgY29weSkKQEAg
LTI5LDcgKzI5LDggQEAKIGFybS9hcm0vaWRlbnRjcHUuYwkJc3RhbmRhcmQKIGFybS9hcm0vaW5f
Y2tzdW0uYwkJb3B0aW9uYWwJaW5ldCB8IGluZXQ2CiBhcm0vYXJtL2luX2Nrc3VtX2FybS5TCQlv
cHRpb25hbAlpbmV0IHwgaW5ldDYKLWFybS9hcm0vaW50ci5jCQkJc3RhbmRhcmQKK2FybS9hcm0v
aW50ci5jCQkJb3B0aW9uYWwJIWFybV9pbnRybmcKK2FybS9hcm0vaW50cm5nLmMJCW9wdGlvbmFs
CWFybV9pbnRybmcKIGFybS9hcm0vbG9jb3JlLlMJCXN0YW5kYXJkCW5vLW9iagogYXJtL2FybS9t
YWNoZGVwLmMJCXN0YW5kYXJkCiBhcm0vYXJtL21lbS5jCQkJb3B0aW9uYWwJbWVtCkBAIC0zNyw2
ICszOCw3IEBACiBhcm0vYXJtL21wX21hY2hkZXAuYwkJb3B0aW9uYWwJc21wCiBhcm0vYXJtL25l
eHVzLmMJCQlzdGFuZGFyZAogYXJtL2FybS9waHlzbWVtLmMJCXN0YW5kYXJkCithcm0vYXJtL3Bp
Y19pZi5tCQlvcHRpb25hbAlhcm1faW50cm5nCiBhcm0vYXJtL3BsMTkwLmMJCQlvcHRpb25hbAlw
bDE5MAogYXJtL2FybS9wbDMxMC5jCQkJb3B0aW9uYWwJcGwzMTAKIGFybS9hcm0vcGxhdGZvcm0u
YwkJb3B0aW9uYWwJcGxhdGZvcm0KSW5kZXg6IHN5cy9jb25mL29wdGlvbnMuYXJtCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIHN5cy9jb25mL29wdGlvbnMuYXJtCShyZXZpc2lvbiAyNzcyMTApCisrKyBzeXMvY29u
Zi9vcHRpb25zLmFybQkod29ya2luZyBjb3B5KQpAQCAtMiw2ICsyLDcgQEAKIEFSTTlfQ0FDSEVf
V1JJVEVfVEhST1VHSAlvcHRfZ2xvYmFsLmgKIEFSTVY2CQkJb3B0X2dsb2JhbC5oCiBBUk1fQ0FD
SEVfTE9DS19FTkFCTEUJb3B0X2dsb2JhbC5oCitBUk1fSU5UUk5HCQlvcHRfZ2xvYmFsLmgKIEFS
TV9LRVJOX0RJUkVDVE1BUAlvcHRfdm0uaAogQVJNX0wyX1BJUFQJCW9wdF9nbG9iYWwuaAogQVJN
X01BTllfQk9BUkQJCW9wdF9nbG9iYWwuaApJbmRleDogc3lzL2Rldi9mZHQvc2ltcGxlYnVzLmMK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gc3lzL2Rldi9mZHQvc2ltcGxlYnVzLmMJKHJldmlzaW9uIDI3NzIxMCkK
KysrIHN5cy9kZXYvZmR0L3NpbXBsZWJ1cy5jCSh3b3JraW5nIGNvcHkpCkBAIC0zOCw2ICszOCw4
IEBACiAjaW5jbHVkZSA8ZGV2L29mdy9vZndfYnVzLmg+CiAjaW5jbHVkZSA8ZGV2L29mdy9vZndf
YnVzX3N1YnIuaD4KIAorI2luY2x1ZGUgPG1hY2hpbmUvZmR0Lmg+CisKIHN0cnVjdCBzaW1wbGVi
dXNfcmFuZ2UgewogCXVpbnQ2NF90IGJ1czsKIAl1aW50NjRfdCBob3N0OwpAQCAtNjgsNiArNzAs
OSBAQAogICAgIGludCAqLCB1X2xvbmcsIHVfbG9uZywgdV9sb25nLCB1X2ludCk7CiBzdGF0aWMg
dm9pZAkJc2ltcGxlYnVzX3Byb2JlX25vbWF0Y2goZGV2aWNlX3QgYnVzLCBkZXZpY2VfdCBjaGls
ZCk7CiBzdGF0aWMgaW50CQlzaW1wbGVidXNfcHJpbnRfY2hpbGQoZGV2aWNlX3QgYnVzLCBkZXZp
Y2VfdCBjaGlsZCk7CisjaWZkZWYgQVJNX0lOVFJORworc3RhdGljIGludAkJc2ltcGxlYnVzX3By
aW50X2lycXMoc3RydWN0IHJlc291cmNlX2xpc3QgKnJsKTsKKyNlbmRpZgogCiAvKgogICogb2Z3
X2J1cyBpbnRlcmZhY2UKQEAgLTM0NCw3ICszNDksMTEgQEAKIAogCXJ2ID0gMDsKIAlydiArPSBy
ZXNvdXJjZV9saXN0X3ByaW50X3R5cGUoJmRpLT5ybCwgIm1lbSIsIFNZU19SRVNfTUVNT1JZLCAi
JSNseCIpOworI2lmZGVmIEFSTV9JTlRSTkcKKwlydiArPSBzaW1wbGVidXNfcHJpbnRfaXJxcygm
ZGktPnJsKTsKKyNlbHNlCiAJcnYgKz0gcmVzb3VyY2VfbGlzdF9wcmludF90eXBlKCZkaS0+cmws
ICJpcnEiLCBTWVNfUkVTX0lSUSwgIiVsZCIpOworI2VuZGlmCiAJcmV0dXJuIChydik7CiB9CiAK
QEAgLTM4MywzICszOTIsMjYgQEAKIAlydiArPSBidXNfcHJpbnRfY2hpbGRfZm9vdGVyKGJ1cywg
Y2hpbGQpOwogCXJldHVybiAocnYpOwogfQorCisjaWZkZWYgQVJNX0lOVFJORworc3RhdGljIGlu
dAorc2ltcGxlYnVzX3ByaW50X2lycXMoc3RydWN0IHJlc291cmNlX2xpc3QgKnJsKQoreworCXN0
cnVjdCByZXNvdXJjZV9saXN0X2VudHJ5ICpybGU7CisJaW50IHByaW50ZWQsIHJldHZhbDsKKwor
CXByaW50ZWQgPSAwOworCXJldHZhbCA9IDA7CisKKwlTVEFJTFFfRk9SRUFDSChybGUsIHJsLCBs
aW5rKSB7CisJCWlmIChybGUtPnR5cGUgIT0gU1lTX1JFU19JUlEpCisJCQljb250aW51ZTsKKwor
CQlyZXR2YWwgKz0gcHJpbnRmKCIlcyIsIHByaW50ZWQgPyAiLCIgOiAiIGlycSAiKTsKKwkJcmV0
dmFsICs9IHByaW50ZigiJXMiLCBGRFRfREVTQ1JJQkVfSVJRKHJsZS0+c3RhcnQpKTsKKwkJcHJp
bnRlZCsrOworCX0KKworCXJldHVybiAocmV0dmFsKTsKK30KKyNlbmRpZgo=
--001a113ad13c76bebd050cb126db
Content-Type: application/octet-stream; name="pic_if.m"
Content-Disposition: attachment; filename="pic_if.m"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_i4y6ugkb1

Iy0KIyBDb3B5cmlnaHQgKGMpIDIwMTIgSmFrdWIgV29qY2llY2ggS2xhbWEgPGpjZWVsQEZyZWVC
U0Qub3JnPgojIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiMKIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIyBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
IyBhcmUgbWV0OgojIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CiMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgojIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiMgICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQojICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCiMKIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRI
RSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECiMgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCiMg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UKIyBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRI
RSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQojIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCiMg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMKIyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKIyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAojIExJQUJJ
TElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkKIyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiMgU1VDSCBEQU1BR0UuCiMKIyAkRnJlZUJTRCQK
IwoKI2luY2x1ZGUgIm9wdF9wbGF0Zm9ybS5oIgoKI2luY2x1ZGUgPHN5cy9idXMuaD4KI2luY2x1
ZGUgPHN5cy9jcHVzZXQuaD4KI2luY2x1ZGUgPGRldi9vZncvb3BlbmZpcm0uaD4KI2luY2x1ZGUg
PG1hY2hpbmUvZnJhbWUuaD4KI2luY2x1ZGUgPG1hY2hpbmUvaW50ci5oPgoKSU5URVJGQUNFIHBp
YzsKCkNPREUgewoJc3RhdGljIGludCBudWxsX3BpY19iaW5kKGRldmljZV90IGRldiwgc3RydWN0
IGFybV9pcnFzcmMgKmlzcmMsCgkgICAgY3B1c2V0X3QgY3B1bWFzaykKCXsKCQlyZXR1cm4gKEVP
UE5PVFNVUFApOwoJfQoKCXN0YXRpYyB2b2lkIG51bGxfcGljX2luaXRfc2Vjb25kYXJ5KGRldmlj
ZV90IGRldikKCXsKCQlyZXR1cm47Cgl9CgoJc3RhdGljIHZvaWQgbnVsbF9waWNfaXBpX3NlbmQo
ZGV2aWNlX3QgZGV2LCBjcHVzZXRfdCBjcHVzLCB1X2ludCBpcGkpCgl7CgkJcmV0dXJuOwoJfQp9
OwoKTUVUSE9EIGludCBiaW5kIHsKCWRldmljZV90CQlkZXY7CglzdHJ1Y3QgYXJtX2lycXNyYwkq
aXNyYzsKCWNwdXNldF90CQljcHVtYXNrOwp9IERFRkFVTFQgbnVsbF9waWNfYmluZDsKCk1FVEhP
RCBpbnQgY29uZmlnIHsKCWRldmljZV90CQlkZXY7CglzdHJ1Y3QgYXJtX2lycXNyYwkqaXNyYzsK
CWVudW0gaW50cl90cmlnZ2VyCXRyaWc7CgllbnVtIGludHJfcG9sYXJpdHkJcG9sOwp9OwoKTUVU
SE9EIGludCBtYXAgewoJZGV2aWNlX3QJCWRldjsKCXN0cnVjdCBhcm1faXJxc3JjCSppc3JjOwoJ
dV9pbnQJCQl0eXBlOwoJdV9pbnQJCQludW07Cn07CgojaWZkZXQgRkRUCk1FVEhPRCBpbnQgbWFw
X2ZkdCB7CglkZXZpY2VfdAkJZGV2OwoJc3RydWN0IGFybV9pcnFzcmMJKmlzcmM7CglwY2VsbF90
CQkJKmNlbGxzOwoJdV9pbnQJCQluY2VsbHM7Cn07CiNlbmRpZgoKTUVUSE9EIGludCB1bm1hcCB7
CglkZXZpY2VfdAkJZGV2OwoJc3RydWN0IGFybV9pcnFzcmMJKmlzcmM7Cn07CgpNRVRIT0Qgdm9p
ZCBkaXNhYmxlIHsKCWRldmljZV90CQlkZXY7CglzdHJ1Y3QgYXJtX2lycXNyYwkqaXNyYzsKfTsK
Ck1FVEhPRCB2b2lkIGVuYWJsZSB7CglkZXZpY2VfdAkJZGV2OwoJc3RydWN0IGFybV9pcnFzcmMJ
KmlzcmM7Cn07CgpNRVRIT0Qgdm9pZCBwcmVfaXRocmVhZCB7CglkZXZpY2VfdAkJZGV2OwoJc3Ry
dWN0IGFybV9pcnFzcmMJKmlzcmM7Cn07CgpNRVRIT0Qgdm9pZCBwb3N0X2l0aHJlYWQgewoJZGV2
aWNlX3QJCWRldjsKCXN0cnVjdCBhcm1faXJxc3JjCSppc3JjOwp9OwoKTUVUSE9EIHZvaWQgcG9z
dF9maWx0ZXIgewoJZGV2aWNlX3QJCWRldjsKCXN0cnVjdCBhcm1faXJxc3JjCSppc3JjOwp9OwoK
TUVUSE9EIHZvaWQgaW5pdF9zZWNvbmRhcnkgewoJZGV2aWNlX3QJZGV2Owp9IERFRkFVTFQgbnVs
bF9waWNfaW5pdF9zZWNvbmRhcnk7CgpNRVRIT0Qgdm9pZCBpcGlfc2VuZCB7CglkZXZpY2VfdAkJ
ZGV2OwoJc3RydWN0IGFybV9pcnFzcmMJKmlzcmM7CgljcHVzZXRfdAkJY3B1czsKfSBERUZBVUxU
IG51bGxfcGljX2lwaV9zZW5kOwoK
--001a113ad13c76bebd050cb126db--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAFHCsPX5kG_v-F-cjpyMQsT_b386eok=mqWW0%2BEUb_4-_1Otnw>