Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 01 Jun 2012 21:13:53 +0100
From:      Ben Gray <ben.r.gray@gmail.com>
To:        Warner Losh <imp@bsdimp.com>
Cc:        freebsd-arm@freebsd.org
Subject:   Re: SDIO driver
Message-ID:  <4FC92281.9010200@gmail.com>
In-Reply-To: <DF2759B4-8969-4BBB-B790-582A9350A21E@bsdimp.com>
References:  <4FBE93A7.7050502@gmail.com> <DF2759B4-8969-4BBB-B790-582A9350A21E@bsdimp.com>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------020001090707090709020601
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit

Hi Warner,

     Thanks very much for your reply and sorry for my rather tardy reply.
>
> On May 24, 2012, at 2:01 PM, Ben Gray wrote:
>
>> Hi all,
>>
>>    I've being doing some work on hacking SDIO support into the kernel. My changes build on top of the current MMC/MMCBR module. Expanding the diagram from Warner Losh's pdf (http://www.bsdcan.org/2007/schedule/attachments/23-freebsd-sd-warner-losh.pdf), my hacks have the following logic layout
>>
>>
>>              +------------+       +------------+
>>              | ti_mmchs0  |       | ti_mmchs1  |
>>              +------------+       +------------+
>>                    |                     |
>>                    |                     |
>>               +--------+            +--------+
>>               |  mmc0  |            |  mmc1  |
>>               +--------+            +--------+
>>                    |                     |
>>             +------+-----+               |
>>             |            |               |
>>        +---------+  +---------+     +---------+
>>        |  mmcsd0 |  |  mmcsd1 |     |  sdio0  |
>>        +---------+  +---------+     +---------+
>>                                          |
>>                                          |
>>                                   +------+-------+------- .... -----+
>>                                   |              |                  |
>>                               function#1     function#2        function#7
>>                              +----------+   +-----------+      +----------+
>>                              |   wifi   |   | bluetooth | .... | whatever |
>>                              +----------+   +-----------+      +----------+
>>
>>
>>   So my sdio module sits at the same level as the current mmcsd module and uses the same interface to talk to the mmc0 module (notably MMCBUS_WAIT_FOR_REQUEST).  The sdio part does the card setup and CIS scanning, then enables any child functions and probes for a suitable child driver.
>
> I think this is one layer too low in the tree.  This is bus code, and should be in the mmc bus.  sdio drivers can then attach, and multiple functions can attach multiple drivers more easily.
I tended to agree, the issue was I didn't want to change too much at the 
mmc level.  IMO there are some advantages by having an SDIO layer; it's 
a place to put the sdio specific stuff (CIS parsing, etc) and it means 
child devices are based off 'sdio' rather than 'mmc' which seems to make 
more sense to me.  It also means the sdio layer can expose 
functions/interfaces for reading/writing data blocks, something that 
would be used commonly across all child sdio devices.

However I take your point and I guess it's probably best to do it 
properly rather than just tack something on.

So I might go back to the drawing board and see how to cleanly integrate 
the sdio code.
>
>
>>   The problem with this approach is that currently a driver can target only one logic function on the card - I don't know if any driver will ever need to span more than one function.  But perhaps a bigger problem is that it doesn't support 'combo cards' (cards with both I/O and standard SD memory).  However supporting combo cards, I think, would require a lot more changes to the current mmc/mmcsd drivers which I'm reluctant to do.
>
> Yes.  That's one of many problems, since SD I/O cards also need some additional stuff in the enumeration, which may be tricky to reliably do in the lower layers like you've done.  In addition, there would need to be some bus/bridge interfaces because some mmc/sd controllers can't do SD I/O transactions.
>
>>   Anyway I'm interested in whether anyone thinks this is useful in it's current form? or whether the above limitations are too much of a problem?  If others are happy and would like it in the tree then perhaps I can commit it to the armv6 branch for review?
>
> I'd be interested in taking a look.
Once again sorry I've been a bit slow to respond, but I've now attached 
a patch for my code in it's current state.  I apologise in advance, it's 
a bit messy and there parts of the standard missing (interrupts for 
one), but it does work well enough to detect an sdio card and probe a 
child driver.

The patch doesn't include my wifi driver, because that's even more of a 
mess.

Oh and the patch is based off the armv6 project branch, my version may 
be a month or so old.
>
>
>>   Lastly the code is not quite complete as there are still corner cases that need to be fixed, however in it's current form it works with a basic wifi driver I've written for the Pandaboard (can load f/w, read registers, etc).
>
> Which wifi card?
It's not actually a card rather a solder-on-module that supports wifi, 
bt and (on the newer devices) gps. It's made by TI, called wilink 
(http://www.ti.com/general/docs/wtbu/wtbuproductcontent.tsp?templateId=6123&navigationId=12859&contentId=67453). 
It comes on all Pandaboards.
>
>
> Warner
Cheers,
Ben.


--------------020001090707090709020601
Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0";
	name="armv6-mmc-sdio.diff"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="armv6-mmc-sdio.diff"

SW5kZXg6IG1tY3JlZy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIG1tY3JlZy5oCShyZXZpc2lvbiAy
MzQzOTQpCisrKyBtbWNyZWcuaAkod29ya2luZyBjb3B5KQpAQCAtODUsNiArODUsOCBAQAog
I2RlZmluZQlNTUNfUlNQX1IxQgkoTU1DX1JTUF9QUkVTRU5UIHwgTU1DX1JTUF9DUkMgfCBN
TUNfUlNQX09QQ09ERSB8IE1NQ19SU1BfQlVTWSkKICNkZWZpbmUJTU1DX1JTUF9SMgkoTU1D
X1JTUF9QUkVTRU5UIHwgTU1DX1JTUF8xMzYgfCBNTUNfUlNQX0NSQykKICNkZWZpbmUJTU1D
X1JTUF9SMwkoTU1DX1JTUF9QUkVTRU5UKQorI2RlZmluZQlNTUNfUlNQX1I0CShNTUNfUlNQ
X1BSRVNFTlQpCisjZGVmaW5lCU1NQ19SU1BfUjUJKE1NQ19SU1BfUFJFU0VOVCB8IE1NQ19S
U1BfQ1JDIHwgTU1DX1JTUF9PUENPREUpCiAjZGVmaW5lCU1NQ19SU1BfUjYJKE1NQ19SU1Bf
UFJFU0VOVCB8IE1NQ19SU1BfQ1JDKQogI2RlZmluZQlNTUNfUlNQX1I3CShNTUNfUlNQX1BS
RVNFTlQgfCBNTUNfUlNQX0NSQykKICNkZWZpbmUJTU1DX1JTUCh4KQkoKHgpICYgTU1DX1JT
UF9NQVNLKQpAQCAtMTUxLDYgKzE1MywzMSBAQAogI2RlZmluZQlSMV9TVEFURV9QUkcJNwog
I2RlZmluZQlSMV9TVEFURV9ESVMJOAogCisvKgorICogUjUgcmVzcG9uc2VzCisgKgorICog
VHlwZXMgKHBlciBTRCAyLjAgc3RhbmRhcmQpCisgKgllIDogZXJyb3IgYml0CisgKglzIDog
c3RhdHVzIGJpdAorICoJciA6IGRldGVjdGVkIGFuZCBzZXQgZm9yIHRoZSBhY3R1YWwgY29t
bWFuZCByZXNwb25zZQorICoJeCA6IERldGVjdGVkIGFuZCBzZXQgZHVyaW5nIGNvbW1hbmQg
ZXhlY3V0aW9uLiAgVGhlIGhvc3QgY2FuIGdldAorICoJICAgIHRoZSBzdGF0dXMgYnkgaXNz
dWluZyBhIGNvbW1hbmQgd2l0aCBSMSByZXNwb25zZS4KKyAqCisgKiBDbGVhciBDb25kaXRp
b24gKHBlciBTRCAyLjAgc3RhbmRhcmQpCisgKglhIDogYWNjb3JkaW5nIHRvIHRoZSBjYXJk
IGN1cnJlbnQgc3RhdGUuCisgKgliIDogYWx3YXlzIHJlbGF0ZWQgdG8gdGhlIHByZXZpb3Vz
IGNvbW1hbmQuICByZWNlcHRpb24gb2YgYSB2YWxpZAorICoJICAgIGNvbW1hbmQgd2lsbCBj
bGVhciBpdCAod2l0aCBhIGRlbGF5IG9mIG9uZSBjb21tYW5kKS4KKyAqCWMgOiBjbGVhciBi
eSByZWFkCisgKi8KKyNkZWZpbmUJUjVfQ09NX0NSQ19FUlJPUiAoMXUgPDwgMTUpCQkvKiBl
ciwgYiAqLworI2RlZmluZQlSNV9JTExFR0FMX0NPTU1BTkQgKDF1IDw8IDE0KQkJLyogZXIs
IGIgKi8KKyNkZWZpbmUJUjVfSU9fQ1VSUkVOVF9TVEFURV9NQVNLICgzdSA8PCAxMikJCS8q
IHMsIGIgKi8KKyNkZWZpbmUJUjVfSU9fQ1VSUkVOVF9TVEFURSh4KSAoKCh4KSAmIFI1X0lP
X0NVUlJFTlRfU1RBVEVfTUFTSykgPj4gMTIpCisjZGVmaW5lCVI1X0VSUk9SICgxdSA8PCAx
MSkJCS8qIGVyeCwgYyAqLworI2RlZmluZQlSNV9GVU5DVElPTl9OVU1CRVIgKDF1IDw8IDkp
CQkvKiBlciwgYyAqLworI2RlZmluZQlSNV9PVVRfT0ZfUkFOR0UgKDF1IDw8IDgpCQkvKiBl
ciwgYyAqLworCisKIHN0cnVjdCBtbWNfZGF0YSB7CiAJc2l6ZV90IGxlbjsJCS8qIHNpemUg
b2YgdGhlIGRhdGEgKi8KIAlzaXplX3QgeGZlcl9sZW47CkBAIC0xODEsNyArMjA4LDcgQEAK
ICNkZWZpbmUJTU1DX1NFVF9SRUxBVElWRV9BRERSCTMKICNkZWZpbmUJU0RfU0VORF9SRUxB
VElWRV9BRERSCTMKICNkZWZpbmUJTU1DX1NFVF9EU1IJCTQKLQkJCS8qIHJlc2VydmVkOiA1
ICovCisjZGVmaW5lIFNEX0lPX1NFTkRfT1BfQ09ORAk1CiAjZGVmaW5lCU1NQ19TV0lUQ0hf
RlVOQwkJNgogI2RlZmluZQkgTU1DX1NXSVRDSF9GVU5DX0NNRFMJIDAKICNkZWZpbmUJIE1N
Q19TV0lUQ0hfRlVOQ19TRVQJIDEKQEAgLTMzMiw2ICszNTksMjIgQEAKIAogI2RlZmluZQlT
RF9NQVhfSFMJCTUwMDAwMDAwCiAKKy8qCisgKiBTRElPIERpcmVjdCAmIEV4dGVuZGVkIEkv
TworICovCisjZGVmaW5lIFNEX0lPX1JXX1dSCQkoMXUgPDwgMzEpCisjZGVmaW5lIFNEX0lP
X1JXX0ZVTkMoeCkJKCgoeCkgJiAweDcpIDw8IDI4KQorI2RlZmluZSBTRF9JT19SV19SQVcJ
KDF1IDw8IDI3KQorI2RlZmluZSBTRF9JT19SV19JTkNSCQkoMXUgPDwgMjYpCisjZGVmaW5l
IFNEX0lPX1JXX0FEUih4KQkoKCh4KSAmIDB4MUZGRkYpIDw8IDkpCisjZGVmaW5lIFNEX0lP
X1JXX0RBVCh4KQkoKCh4KSAmIDB4RkYpIDw8IDApCisjZGVmaW5lIFNEX0lPX1JXX0xFTih4
KQkoKCh4KSAmIDB4RkYpIDw8IDApCisKKyNkZWZpbmUgU0RfSU9FX1JXX0xFTih4KQkoKCh4
KSAmIDB4MUZGKSA8PCAwKQorI2RlZmluZSBTRF9JT0VfUldfQkxLCSgxdSA8PCAyNykKKwor
CisKIC8qIE9DUiBiaXRzICovCiAKIC8qCkluZGV4OiBicmlkZ2UuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBicmlkZ2UuaAkocmV2aXNpb24gMjM0Mzk0KQorKysgYnJpZGdlLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTEwNSw3ICsxMDUsNyBAQAogfTsKIAogZW51bSBtbWNfYnVzX3RpbWluZyB7
Ci0JYnVzX3RpbWluZ19ub3JtYWwgPSAwLCBidXNfdGltaW5nX2hzCisJYnVzX3RpbWluZ19s
cyA9IDAsIGJ1c190aW1pbmdfbm9ybWFsLCBidXNfdGltaW5nX2hzCiB9OwogCiBzdHJ1Y3Qg
bW1jX2lvcyB7CkBAIC0xMTksNyArMTE5LDcgQEAKIH07CiAKIGVudW0gbW1jX2NhcmRfbW9k
ZSB7Ci0JbW9kZV9tbWMsIG1vZGVfc2QKKwltb2RlX21tYywgbW9kZV9zZCwgbW9kZV9zZGlv
CiB9OwogCiBzdHJ1Y3QgbW1jX2hvc3QgewpJbmRleDogbW1jdmFyLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gbW1jdmFyLmgJKHJldmlzaW9uIDIzNDM5NCkKKysrIG1tY3Zhci5oCSh3b3JraW5n
IGNvcHkpCkBAIC02OSw2ICs2OSw3IEBACiAgICAgTU1DX0lWQVJfQlVTX1dJRFRILAogICAg
IE1NQ19JVkFSX0VSQVNFX1NFQ1RPUiwKICAgICBNTUNfSVZBUl9NQVhfREFUQSwKKyAgICBN
TUNfSVZBUl9JT19GVU5DVElPTlMsCiAvLyAgICBNTUNfSVZBUl8sCiB9OwogCkBAIC04OSw1
ICs5MCw2IEBACiBNTUNfQUNDRVNTT1IoYnVzX3dpZHRoLCBCVVNfV0lEVEgsIGludCkKIE1N
Q19BQ0NFU1NPUihlcmFzZV9zZWN0b3IsIEVSQVNFX1NFQ1RPUiwgaW50KQogTU1DX0FDQ0VT
U09SKG1heF9kYXRhLCBNQVhfREFUQSwgaW50KQorTU1DX0FDQ0VTU09SKGlvX2Z1bmN0aW9u
cywgSU9fRlVOQ1RJT05TLCBpbnQpCiAKICNlbmRpZiAvKiBERVZfTU1DX01NQ1ZBUl9IICov
CkluZGV4OiBtbWMuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBtbWMuYwkocmV2aXNpb24gMjM0Mzk0
KQorKysgbW1jLmMJKHdvcmtpbmcgY29weSkKQEAgLTcwLDYgKzcwLDExIEBACiAjaW5jbHVk
ZSAibW1jYnJfaWYuaCIKICNpbmNsdWRlICJtbWNidXNfaWYuaCIKIAorI2RlZmluZSBNTUNf
U0RJT19TVVBQT1JUCisjaWYgZGVmaW5lZChNTUNfU0RJT19TVVBQT1JUKQorI2luY2x1ZGUg
PGRldi9tbWMvbW1jaW9yZWcuaD4KKyNlbmRpZgorCiBzdHJ1Y3QgbW1jX3NvZnRjIHsKIAlk
ZXZpY2VfdCBkZXY7CiAJc3RydWN0IG10eCBzY19tdHg7CkBAIC0xMDAsNyArMTA1LDkgQEAK
IAl1aW50MzJfdCBzZWNfY291bnQ7CS8qIENhcmQgY2FwYWNpdHkgaW4gNTEyYnl0ZSBibG9j
a3MgKi8KIAl1aW50MzJfdCB0cmFuX3NwZWVkOwkvKiBNYXggc3BlZWQgaW4gbm9ybWFsIG1v
ZGUgKi8KIAl1aW50MzJfdCBoc190cmFuX3NwZWVkOwkvKiBNYXggc3BlZWQgaW4gaGlnaCBz
cGVlZCBtb2RlICovCisJdWludDMyX3QgbHNfdHJhbl9zcGVlZDsJLyogTWF4IHNwZWVkIGlu
IGxvdyBzcGVlZCBtb2RlIChTRElPIG9ubHkpICovCiAJdWludDMyX3QgZXJhc2Vfc2VjdG9y
OwkvKiBDYXJkIG5hdGl2ZSBlcmFzZSBzZWN0b3Igc2l6ZSAqLworCXVpbnQzMl90IGlvX2Z1
bmN0aW9uczsJLyogTnVtYmVyIG9mIElPIGZ1bmN0aW9ucyBzdXBwb3J0ZWQgKFNESU8gb25s
eSkgKi8KIH07CiAKICNkZWZpbmUgQ01EX1JFVFJJRVMJMwpAQCAtNTA2LDYgKzUxMyw4NiBA
QAogCXJldHVybiAoZXJyKTsKIH0KIAorLyogW0JSR10gLSBBZGRlZCBmb3IgU0RJTyAqLwor
I2lmIGRlZmluZWQoTU1DX1NESU9fU1VQUE9SVCkKKworc3RhdGljIGludAorbW1jX3NlbmRf
aW9fb3BfY29uZChzdHJ1Y3QgbW1jX3NvZnRjICpzYywgdWludDMyX3Qgb2NyLCB1aW50MzJf
dCAqcm9jciwKKyAgICB1aW50MzJfdCAqcmZucywgdWludDMyX3QgKnJtZW0pCit7CisJc3Ry
dWN0IG1tY19jb21tYW5kIGNtZDsKKwlpbnQgZXJyOworCWludCBpOworCQorCW1lbXNldCgm
Y21kLCAwLCBzaXplb2YoY21kKSk7CisJY21kLm9wY29kZSA9IFNEX0lPX1NFTkRfT1BfQ09O
RDsKKwljbWQuYXJnID0gb2NyOworCWNtZC5mbGFncyA9IE1NQ19SU1BfUjQgfCBNTUNfQ01E
X0JDUjsKKwljbWQuZGF0YSA9IE5VTEw7CisKKwlwcmludGYoIltCUkddIG1tY19zZW5kX2lv
X29wX2NvbmQgOiBjbWQub3Bjb2RlID0gMHglMDh4IDogY21kLmFyZyA9IDB4JTA4eFxuIiwg
Y21kLm9wY29kZSwgY21kLmFyZyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7
CisJCWVyciA9IG1tY193YWl0X2Zvcl9jbWQoc2MsICZjbWQsIENNRF9SRVRSSUVTKTsKKwkJ
aWYgKGVyciAhPSBNTUNfRVJSX05PTkUpCisJCQlicmVhazsKKwkJaWYgKChjbWQucmVzcFsw
XSAmIE1NQ19PQ1JfQ0FSRF9CVVNZKSB8fAorCQkgICAgKG9jciAmIE1NQ19PQ1JfVk9MVEFH
RSkgPT0gMCkKKwkJCWJyZWFrOworCQllcnIgPSBNTUNfRVJSX1RJTUVPVVQ7CisJCW1tY19t
c19kZWxheSgxMCk7CisJfQorCQorCXByaW50ZigiW0JSR10gbW1jX3NlbmRfaW9fb3BfY29u
ZCA6IGNtZC5yZXNwWzBdID0gMHglMDh4IChlcnIgJWQpXG4iLCBjbWQucmVzcFswXSwgZXJy
KTsKKwkKKwlpZiAoZXJyID09IE1NQ19FUlJfTk9ORSkgeworCQlpZiAocm9jcikKKwkJCSpy
b2NyID0gKGNtZC5yZXNwWzBdICYgMHgwMGZmZmZmZik7CisJCWlmIChyZm5zKQorCQkJKnJm
bnMgPSAoY21kLnJlc3BbMF0gPj4gMjgpICYgMHg3OworCQlpZiAocm1lbSkKKwkJCSpybWVt
ID0gKGNtZC5yZXNwWzBdID4+IDI3KSAmIDB4MTsKKwl9CisJcmV0dXJuIChlcnIpOworfQor
CisvKiBbQlJHXSAtIEFkZGVkIGZvciBTRElPICovCitzdGF0aWMgaW50CittbWNfaW9fcndf
ZGlyZWN0KHN0cnVjdCBtbWNfc29mdGMgKnNjLCBpbnQgd3IsIHVpbnQzMl90IGZuLCB1aW50
MzJfdCBhZHIsCisgICAgdWludDhfdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbW1jX2NvbW1hbmQg
Y21kOworCWludCBlcnI7CisKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNt
ZC5vcGNvZGUgPSBTRF9JT19SV19ESVJFQ1Q7CisJY21kLmFyZyA9IFNEX0lPX1JXX0ZVTkMo
Zm4pIHwgU0RfSU9fUldfQURSKGFkcik7CisJaWYgKHdyKQorCQljbWQuYXJnIHw9IFNEX0lP
X1JXX1dSIHwgU0RfSU9fUldfUkFXIHwgU0RfSU9fUldfREFUKCpkYXRhKTsKKwljbWQuZmxh
Z3MgPSBNTUNfUlNQX1I1IHwgTU1DX0NNRF9BQzsKKwljbWQuZGF0YSA9IE5VTEw7CisKKwlw
cmludGYoIltCUkddIG1tY19pb19yd19kaXJlY3QgOiBjbWQub3Bjb2RlID0gMHglMDh4IDog
Y21kLmFyZyA9IDB4JTA4eFxuIiwgY21kLm9wY29kZSwgY21kLmFyZyk7CisKKwllcnIgPSBt
bWNfd2FpdF9mb3JfY21kKHNjLCAmY21kLCBDTURfUkVUUklFUyk7CisJaWYgKGVycikKKwkJ
cmV0dXJuIChlcnIpOworCWlmIChjbWQuZXJyb3IpCisJCXJldHVybiAoY21kLmVycm9yKTsK
KworCWlmIChjbWQucmVzcFswXSAmIFI1X0NPTV9DUkNfRVJST1IpCisJCXJldHVybiAoTU1D
X0VSUl9CQURDUkMpOworCWlmIChjbWQucmVzcFswXSAmIChSNV9JTExFR0FMX0NPTU1BTkQg
fCBSNV9GVU5DVElPTl9OVU1CRVIpKQorCQlyZXR1cm4gKE1NQ19FUlJfSU5WQUxJRCk7CisJ
aWYgKGNtZC5yZXNwWzBdICYgUjVfT1VUX09GX1JBTkdFKQorCQlyZXR1cm4gKE1NQ19FUlJf
RkFJTEVEKTsKKwkKKwkqZGF0YSA9ICh1aW50OF90KSAoY21kLnJlc3BbMF0gJiAweGZmKTsK
KwlyZXR1cm4gKE1NQ19FUlJfTk9ORSk7Cit9CisKKyNlbmRpZiAvKiBNTUNfU0RJT19TVVBQ
T1JUICovCisKIHN0YXRpYyB2b2lkCiBtbWNfcG93ZXJfdXAoc3RydWN0IG1tY19zb2Z0YyAq
c2MpCiB7CkBAIC01OTcsMTQgKzY4NCw2OCBAQAogCXJldHVybiAoZXJyKTsKIH0KIAorI2lm
IGRlZmluZWQoTU1DX1NESU9fU1VQUE9SVCkKIHN0YXRpYyBpbnQKK21tY19zZGlvX3NldF90
aW1pbmcoc3RydWN0IG1tY19zb2Z0YyAqc2MsIGludCB0aW1pbmcpCit7CisJaW50IGVycjsK
Kwl1aW50OF90IHJlZzsKKworCWVyciA9IG1tY19pb19yd19kaXJlY3Qoc2MsIDAsIDAsIFNE
X0lPX0NDQ1JfSElHSF9TUEVFRCwgJnJlZyk7CisJaWYgKGVycikgeworCQlkZXZpY2VfcHJp
bnRmKHNjLT5kZXYsICJmYWlsZWQgdG8gcmVhZCBTRF9JT19DQ0NSX0hJR0hfU1BFRUQgcmVn
aXN0ZXJcbiIpOworCQlyZXR1cm4gKGVycik7CisJfQorCisJaWYgKHRpbWluZyA9PSBidXNf
dGltaW5nX2hzKSB7CisJCWlmICghKHJlZyAmIENDQ1JfSElHSF9TUEVFRF9TSFMpKQorCQkJ
cmV0dXJuIChNTUNfRVJSX0lOVkFMSUQpOworCQlyZWcgfD0gQ0NDUl9ISUdIX1NQRUVEX0VI
UzsKKwl9IGVsc2UgeworCQlyZWcgJj0gfkNDQ1JfSElHSF9TUEVFRF9FSFM7CisJfQorCQkK
KwllcnIgPSBtbWNfaW9fcndfZGlyZWN0KHNjLCAxLCAwLCBTRF9JT19DQ0NSX0hJR0hfU1BF
RUQsICZyZWcpOworCWlmIChlcnIpCisJCXJldHVybiAoZXJyKTsKKwkKKwlpZiAoKHRpbWlu
ZyA9PSBidXNfdGltaW5nX2hzKSAmJgorCSAgICAoKHJlZyAmIENDQ1JfSElHSF9TUEVFRF9F
SFMpICE9IENDQ1JfSElHSF9TUEVFRF9FSFMpKSB7CisJCXJldHVybiAoTU1DX0VSUl9GQUlM
RUQpOworCX0KKworCXJldHVybiAoTU1DX0VSUl9OT05FKTsKK30KKyNlbmRpZiAvKiBNTUNf
U0RJT19TVVBQT1JUICovCisKK3N0YXRpYyBpbnQKIG1tY19zZXRfY2FyZF9idXNfd2lkdGgo
c3RydWN0IG1tY19zb2Z0YyAqc2MsIHVpbnQxNl90IHJjYSwgaW50IHdpZHRoKQogewogCXN0
cnVjdCBtbWNfY29tbWFuZCBjbWQ7CiAJaW50IGVycjsKIAl1aW50OF90CXZhbHVlOworCWlu
dCBtb2RlID0gbW1jYnJfZ2V0X21vZGUoc2MtPmRldik7CiAKLQlpZiAobW1jYnJfZ2V0X21v
ZGUoc2MtPmRldikgPT0gbW9kZV9zZCkgeworI2lmIGRlZmluZWQoTU1DX1NESU9fU1VQUE9S
VCkKKwlpZiAobW9kZSA9PSBtb2RlX3NkaW8pIHsKKwkJZXJyID0gbW1jX2lvX3J3X2RpcmVj
dChzYywgMCwgMCwgU0RfSU9fQ0NDUl9CVVNfV0lEVEgsICZ2YWx1ZSk7CisJCWlmIChlcnIg
PT0gMCkgeworCQkJdmFsdWUgJj0gfkNDQ1JfQlVTX1dJRFRIX01BU0s7CisJCQlzd2l0Y2gg
KHdpZHRoKSB7CisJCQljYXNlIGJ1c193aWR0aF8xOgorCQkJCXZhbHVlIHw9IENDQ1JfQlVT
X1dJRFRIXzE7CisJCQkJYnJlYWs7CisJCQljYXNlIGJ1c193aWR0aF80OgorCQkJCXZhbHVl
IHw9IENDQ1JfQlVTX1dJRFRIXzQ7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJl
dHVybiAoTU1DX0VSUl9JTlZBTElEKTsKKwkJCX0KKwkJCWVyciA9IG1tY19pb19yd19kaXJl
Y3Qoc2MsIDEsIDAsIFNEX0lPX0NDQ1JfQlVTX1dJRFRILCAmdmFsdWUpOworCQl9CisJfSBl
bHNlCisjZW5kaWYgLyogTU1DX1NESU9fU1VQUE9SVCAqLwkKKwlpZiAobW9kZSA9PSBtb2Rl
X3NkKSB7CiAJCW1lbXNldCgmY21kLCAwLCBzaXplb2Yoc3RydWN0IG1tY19jb21tYW5kKSk7
CiAJCWNtZC5vcGNvZGUgPSBBQ01EX1NFVF9CVVNfV0lEVEg7CiAJCWNtZC5mbGFncyA9IE1N
Q19SU1BfUjEgfCBNTUNfQ01EX0FDOwpAQCAtNjU2LDEyICs3OTcsMjQgQEAKIAlkZWZhdWx0
OgogCQlyZXR1cm4gKE1NQ19FUlJfSU5WQUxJRCk7CiAJfQotCWlmIChtbWNicl9nZXRfbW9k
ZShzYy0+ZGV2KSA9PSBtb2RlX3NkKQorCQorCXN3aXRjaCAobW1jYnJfZ2V0X21vZGUoc2Mt
PmRldikpIHsKKyNpZiBkZWZpbmVkKE1NQ19TRElPX1NVUFBPUlQpCisJY2FzZSBtb2RlX3Nk
aW86CisJCWVyciA9IG1tY19zZGlvX3NldF90aW1pbmcoc2MsIHRpbWluZyk7CisJCWJyZWFr
OworI2VuZGlmCisJY2FzZSBtb2RlX3NkOgogCQllcnIgPSBtbWNfc2Rfc3dpdGNoKHNjLCBT
RF9TV0lUQ0hfTU9ERV9TRVQsIFNEX1NXSVRDSF9HUk9VUDEsCiAJCSAgICB2YWx1ZSwgc3dp
dGNoX3Jlcyk7Ci0JZWxzZQorCQlicmVhazsKKwljYXNlIG1vZGVfbW1jOgorCWRlZmF1bHQ6
CiAJCWVyciA9IG1tY19zd2l0Y2goc2MsIEVYVF9DU0RfQ01EX1NFVF9OT1JNQUwsCiAJCSAg
ICBFWFRfQ1NEX0hTX1RJTUlORywgdmFsdWUpOworCQlicmVhazsKKwl9CisJCiAJcmV0dXJu
IChlcnIpOwogfQogCkBAIC0xMDgyLDcgKzEyMzUsNyBAQAogCSAgICBpdmFyLT5yY2EsIG5l
d2NhcmQgPyAiIGFkZGVkIiA6ICIiKTsKIAlkZXZpY2VfcHJpbnRmKGRldiwgIiBjYXJkOiAl
cyVzICgweCV4LzB4JXgvXCIlc1wiIHJldiAlZC4lZCAiCiAJICAgICJtL2QgJTAyZC4lMDRk
IHMvbiAlMDh4KVxuIiwKLQkgICAgaXZhci0+bW9kZSA9PSBtb2RlX3NkID8gIlNEIiA6ICJN
TUMiLAorCSAgICBpdmFyLT5tb2RlID09IG1vZGVfc2RpbyA/ICJTRElPIiA6IGl2YXItPm1v
ZGUgPT0gbW9kZV9zZCA/ICJTRCIgOiAiTU1DIiwKIAkgICAgaXZhci0+aGlnaF9jYXAgPyAi
IEhpZ2ggQ2FwYWNpdHkiIDogIiIsIAogCSAgICBpdmFyLT5jaWQubWlkLCBpdmFyLT5jaWQu
b2lkLAogCSAgICBpdmFyLT5jaWQucG5tLCBpdmFyLT5jaWQucHJ2ID4+IDQsIGl2YXItPmNp
ZC5wcnYgJiAweDBmLApAQCAtMTA5OCw3ICsxMjUxLDEzNiBAQAogCSAgICBpdmFyLT5yZWFk
X29ubHkgPyAiLCByZWFkLW9ubHkiIDogIiIpOwogfQogCisjaWYgZGVmaW5lZChNTUNfU0RJ
T19TVVBQT1JUKQorLyoqCisgKgltbWNfaW9fZGlzY292ZXJfY2FyZHMgLSBmb3VuZCBhbiBT
RElPIGNhcmQgb24gdGhlIGJ1cyBzbyBkbyBkaXNjb3ZlcgorICoJQHNjOiBkZXZpY2Ugc29m
dCBjb250ZXh0CisgKgkKKyAqCVdoYXQgaGFzIGJlZW4gZG9uZToKKyAqCS0gQ01ENSAoSU9f
U0VORF9PUF9DT05EKSBoYXMgYmVlbiBzZW50IGFuZCBhIHZhbGlkIHJlc3BvbnNlIHJlY2Vp
dmVkCisgKgktIHZvbHRhZ2Ugb24gdGhlIGJ1cyBoYXMgYmVlbiBzZXQgdG8gbWF0Y2ggdGhl
IHJldHVybmVkIE9DIHZhbHVlcworICoJCisgKglXaGF0IGhhc24ndCBiZWVuIGRvbmUKKyAq
CS0gCisgKi8KIHN0YXRpYyB2b2lkCittbWNfaW9fZGlzY292ZXJfY2FyZHMoc3RydWN0IG1t
Y19zb2Z0YyAqc2MpCit7CisJaW50IGVycjsKKwl1aW50MzJfdCByZXNwOworCXVpbnQzMl90
IGZuczsKKwl1aW50MzJfdCBtZW07CisJdWludDE2X3QgcmNhOworCXVpbnQ4X3QgcmVnOwor
CXN0cnVjdCBtbWNfaXZhcnMgKml2YXIgPSBOVUxMOworCWludCBpLCBkZXZjb3VudCwgbmV3
Y2FyZCA9IDE7CisJZGV2aWNlX3QgKmRldmxpc3Q7CisJZGV2aWNlX3QgY2hpbGQ7CisJCisJ
aWYgKGJvb3R2ZXJib3NlIHx8IG1tY19kZWJ1ZykKKwkJZGV2aWNlX3ByaW50ZihzYy0+ZGV2
LCAiUHJvYmluZyBTRElPIGNhcmRzXG4iKTsKKworCisJLyogSXNzdWUgKGFub3RoZXIpIENN
RDUgdG8gZ2V0IHRoZSBudW1iZXIgb2YgZnVuY3Rpb25zICovCisJZXJyID0gbW1jX3NlbmRf
aW9fb3BfY29uZChzYywgTU1DX09DUl9DQ1MsIE5VTEwsICZmbnMsICZtZW0pOworCWlmIChl
cnIpIHsKKwkJcHJpbnRmKCJtbWNfc2VuZF9pb19vcF9jb25kIGZhaWxlZFxuIik7CisJCXJl
dHVybjsKKwl9CisJCisJLyogV2UgY3VycmVudGx5IGRvbid0IHN1cHBvcnQgU0RJTyBjYXJk
cyB0aGF0IGhhdmUgYm90aCBtZW1vcnkgYW5kIEkvTyAqLworCWlmIChtZW0pIHsKKwkJZGV2
aWNlX3ByaW50ZihzYy0+ZGV2LCAiU0RJTyBkcml2ZXIgZG9lc24ndCBjdXJyZW50bHkgc3Vw
cG9ydCBtaXhlZCBtZW1vcnkgYW5kIEkvTyBjYXJkc1xuIik7CisJCXJldHVybjsKKwl9CQor
CisKKwkvKiBTZW5kIGEgQ01EMyB3aGljaCBtb3ZlcyB0aGUgY2FyZCBzdGF0ZSBtYWNoaW5l
IGZyb20gJ2luaXQnIHRvICdzdGFuZGJ5JyAqLworCWVyciA9IG1tY19zZW5kX3JlbGF0aXZl
X2FkZHIoc2MsICZyZXNwKTsKKwlyY2EgPSByZXNwID4+IDE2OworCQorCS8qIFZlcmlmeSB0
aGF0IHRoZSBSQ0EgaGFzIGJlZW4gc2V0IGJ5IHNlbGVjdGluZyB0aGUgY2FyZC4gKi8KKwll
cnIgPSBtbWNfc2VsZWN0X2NhcmQoc2MsIHJjYSk7CisJaWYgKGVycikgeworCQlkZXZpY2Vf
cHJpbnRmKHNjLT5kZXYsICJjb3VsZG4ndCBzZWxlY3QgSS9PIFJDQSAlZFxuIiwgcmNhKTsK
KwkJcmV0dXJuOworCX0KKwkKKwkKKwkvKgorCSAqIE5vdyB0aGluZ3MgZ2V0IGEgYml0IGhh
Y2t5IC4uLiB0aGUgb3JpZ2luYWwgZHJpdmVyIHVzZXMgaXZhcnMgc3RvcmVkIGluCisJICog
dGhlIGNoaWxkIGRldmljZSAobW1jc2QgbWVtb3J5IGNhcmQpIHRvIGNhbGN1bGF0ZSB0aGlu
Z3MgbGlrZSB0aGUgYnVzCisJICogd2lkdGgsIHRpbWluZyByZXF1aXJlbWVudHMsIGV0Yy4g
IEl0J3MgYWxsIGJhc2VkIG9uIHRoZSB1bmlxdWUgY2FyZCBpZCwKKwkgKiBob3dldmVyIHRo
aXMgaXMgbm90IHJlbGV2YW50IHRvIFNESU8gY2FyZHMgd2hpY2ggZG9uJ3QgaGF2ZSB0aGUK
KwkgKiBzYW1lIGJ1cyBzY2FuIHByb2NlZHVyZSBhbmQgZG9uJ3Qgc3VwcG9ydCB0aGUgY2Fy
ZCBpZCBjbWQgKENJRCkuCisJICoKKwkgKiBSZWdhcmRsZXNzIChmb3IgdGhlIG1vbWVudCkg
SSd2ZSB0cmllZCB0byBwcm92aWRlIHRoZSBzYW1lIGl2YXJzIGZvcgorCSAqIFNESU8gY2Fy
ZHMgdGhhdCB3b3VsZCBiZSBmb3IgU0QvTU1DIG1lbW9yeSBjYXJkcy4KKwkgKi8KKwlpZiAo
KGVyciA9IGRldmljZV9nZXRfY2hpbGRyZW4oc2MtPmRldiwgJmRldmxpc3QsICZkZXZjb3Vu
dCkpICE9IDApCisJCXJldHVybjsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgZGV2Y291bnQ7IGkr
KykgeworCQlpdmFyID0gZGV2aWNlX2dldF9pdmFycyhkZXZsaXN0W2ldKTsKKwkJaWYgKGl2
YXItPm1vZGUgPT0gbW9kZV9zZGlvKSB7CisJCQluZXdjYXJkID0gMDsKKwkJCWJyZWFrOwor
CQl9CisJfQorCWZyZWUoZGV2bGlzdCwgTV9URU1QKTsKKwkKKwlpZiAoYm9vdHZlcmJvc2Ug
fHwgbW1jX2RlYnVnKSB7CisJCWRldmljZV9wcmludGYoc2MtPmRldiwgIiVzU0RJTyBjYXJk
IGRldGVjdGVkXG4iLCBuZXdjYXJkID8gIk5ldyAiIDogIiIpOworCX0KKworCWlmIChuZXdj
YXJkKSB7CisJCWl2YXIgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBtbWNfaXZhcnMpLCBNX0RF
VkJVRiwgTV9XQUlUT0sgfCBNX1pFUk8pOworCQlpZiAoIWl2YXIpCisJCQlyZXR1cm47CisJ
fQorCQorCWl2YXItPnJjYSA9IHJjYTsKKwlpdmFyLT5yZWFkX29ubHkgPSAwOworCWl2YXIt
PnRpbWluZyA9IGJ1c190aW1pbmdfbm9ybWFsOworCWl2YXItPm1vZGUgPSBtbWNicl9nZXRf
bW9kZShzYy0+ZGV2KTsKKwlpdmFyLT5pb19mdW5jdGlvbnMgPSBmbnM7CisKKwkvKiBGaW5k
IG1heCBzdXBwb3J0ZWQgYnVzIHdpZHRoLiAqLworCW1tY19pb19yd19kaXJlY3Qoc2MsIDAs
IDAsIFNEX0lPX0NDQ1JfQ0FQQUJJTElUWSwgJnJlZyk7CisJaWYgKChtbWNicl9nZXRfY2Fw
cyhzYy0+ZGV2KSAmIE1NQ19DQVBfNF9CSVRfREFUQSkgJiYKKwkgICAgKCEocmVnICYgQ0ND
Ul9DQVBTX0xTQykgfHwgKHJlZyAmIENDQ1JfQ0FQU180QkxTKSkpIHsKKwkJaXZhci0+YnVz
X3dpZHRoID0gYnVzX3dpZHRoXzQ7CisJfQorCisJLyogRm9yIFNESU8gc2V0IHRoZSBtYXhp
bXVtIHNwZWVkcyBpbiBlaXRoZXIgbG93IG9yIGZ1bGwgc3BlZWQgbW9kZXMgKi8KKwlpdmFy
LT50cmFuX3NwZWVkID0gMjUgKiAxMDAwICogMTAwMDsKKwlpdmFyLT5oc190cmFuX3NwZWVk
ID0gNTAgKiAxMDAwICogMTAwMDsKKwlpdmFyLT5sc190cmFuX3NwZWVkID0gNDAwICogMTAw
MDsKKwlpZiAocmVnICYgQ0NDUl9DQVBTX0xTQykKKwkJaXZhci0+dGltaW5nID0gYnVzX3Rp
bWluZ19sczsKKwllbHNlIHsKKwkJbW1jX2lvX3J3X2RpcmVjdChzYywgMCwgMCwgU0RfSU9f
Q0NDUl9ISUdIX1NQRUVELCAmcmVnKTsKKwkJaWYgKHJlZyAmIENDQ1JfSElHSF9TUEVFRF9T
SFMpCisJCQlpdmFyLT50aW1pbmcgPSBidXNfdGltaW5nX2hzOworCQllbHNlCisJCQlpdmFy
LT50aW1pbmcgPSBidXNfdGltaW5nX25vcm1hbDsKKwl9CisJCQorCisJaWYgKGJvb3R2ZXJi
b3NlIHx8IG1tY19kZWJ1ZykKKwkJbW1jX2xvZ19jYXJkKHNjLT5kZXYsIGl2YXIsIG5ld2Nh
cmQpOworCisKKwkvKiBBZGQgZGV2aWNlLiAqLworCWNoaWxkID0gZGV2aWNlX2FkZF9jaGls
ZChzYy0+ZGV2LCAic2RpbyIsIC0xKTsKKwlkZXZpY2Vfc2V0X2l2YXJzKGNoaWxkLCBpdmFy
KTsKKworCXJldHVybjsKKwkKK30KKyNlbmRpZiAvKiBNTUNfU0RJT19TVVBQT1JUICovCisK
K3N0YXRpYyB2b2lkCiBtbWNfZGlzY292ZXJfY2FyZHMoc3RydWN0IG1tY19zb2Z0YyAqc2Mp
CiB7CiAJc3RydWN0IG1tY19pdmFycyAqaXZhciA9IE5VTEw7CkBAIC0xMTkyLDcgKzE0NzQs
NyBAQAogCQkJCW1tY19sb2dfY2FyZChzYy0+ZGV2LCBpdmFyLCBuZXdjYXJkKTsKIAkJCWlm
IChuZXdjYXJkKSB7CiAJCQkJLyogQWRkIGRldmljZS4gKi8KLQkJCQljaGlsZCA9IGRldmlj
ZV9hZGRfY2hpbGQoc2MtPmRldiwgTlVMTCwgLTEpOworCQkJCWNoaWxkID0gZGV2aWNlX2Fk
ZF9jaGlsZChzYy0+ZGV2LCAibW1jc2QiLCAtMSk7CiAJCQkJZGV2aWNlX3NldF9pdmFycyhj
aGlsZCwgaXZhcik7CiAJCQl9CiAJCQlyZXR1cm47CkBAIC0xMjQ5LDcgKzE1MzEsNyBAQAog
CQkJbW1jX2xvZ19jYXJkKHNjLT5kZXYsIGl2YXIsIG5ld2NhcmQpOwogCQlpZiAobmV3Y2Fy
ZCkgewogCQkJLyogQWRkIGRldmljZS4gKi8KLQkJCWNoaWxkID0gZGV2aWNlX2FkZF9jaGls
ZChzYy0+ZGV2LCBOVUxMLCAtMSk7CisJCQljaGlsZCA9IGRldmljZV9hZGRfY2hpbGQoc2Mt
PmRldiwgIm1tY3NkIiwgLTEpOwogCQkJZGV2aWNlX3NldF9pdmFycyhjaGlsZCwgaXZhcik7
CiAJCX0KIAl9CkBAIC0xMzA4LDM2ICsxNTkwLDU1IEBACiAKIAlkZXYgPSBzYy0+ZGV2Owog
CWlmIChtbWNicl9nZXRfcG93ZXJfbW9kZShkZXYpICE9IHBvd2VyX29uKSB7CisKKyNpZiBk
ZWZpbmVkKE1NQ19TRElPX1NVUFBPUlQpCisvL21tY19kZWJ1ZyA9IDEwOworCiAJCS8qCi0J
CSAqIEZpcnN0LCB0cnkgU0QgbW9kZXMKKwkJICogRmlyc3QsIHRyeSBTRElPIG1vZGUKIAkJ
ICovCi0JCW1tY2JyX3NldF9tb2RlKGRldiwgbW9kZV9zZCk7CisJCW1tY2JyX3NldF9tb2Rl
KGRldiwgbW9kZV9zZGlvKTsKIAkJbW1jX3Bvd2VyX3VwKHNjKTsKIAkJbW1jYnJfc2V0X2J1
c19tb2RlKGRldiwgcHVzaHB1bGwpOwogCQlpZiAoYm9vdHZlcmJvc2UgfHwgbW1jX2RlYnVn
KQogCQkJZGV2aWNlX3ByaW50ZihzYy0+ZGV2LCAiUHJvYmluZyBidXNcbiIpOwogCQltbWNf
aWRsZV9jYXJkcyhzYyk7Ci0JCWVyciA9IG1tY19zZW5kX2lmX2NvbmQoc2MsIDEpOwotCQlp
ZiAoKGJvb3R2ZXJib3NlIHx8IG1tY19kZWJ1ZykgJiYgZXJyID09IDApCi0JCQlkZXZpY2Vf
cHJpbnRmKHNjLT5kZXYsICJTRCAyLjAgaW50ZXJmYWNlIGNvbmRpdGlvbnM6IE9LXG4iKTsK
LQkJaWYgKG1tY19zZW5kX2FwcF9vcF9jb25kKHNjLCBlcnIgPyAwIDogTU1DX09DUl9DQ1Ms
ICZvY3IpICE9Ci0JCSAgICBNTUNfRVJSX05PTkUpIHsKLQkJCWlmIChib290dmVyYm9zZSB8
fCBtbWNfZGVidWcpCi0JCQkJZGV2aWNlX3ByaW50ZihzYy0+ZGV2LCAiU0QgcHJvYmU6IGZh
aWxlZFxuIik7CisJCQorCQllcnIgPSBtbWNfc2VuZF9pb19vcF9jb25kKHNjLCAwLCAmb2Ny
LCBOVUxMLCBOVUxMKTsKKwkJaWYgKGVyciA9PSBNTUNfRVJSX05PTkUpIHsKKwkJCWlmIChi
b290dmVyYm9zZSB8fCBtbWNfZGVidWcpIHsKKwkJCQlkZXZpY2VfcHJpbnRmKHNjLT5kZXYs
ICJTRElPIDIuMCBpbnRlcmZhY2UgY29uZGl0aW9uczogT0tcbiIpOworCQkJCWRldmljZV9w
cmludGYoc2MtPmRldiwgIlNESU8gcHJvYmU6IE9LIChPQ1I6IDB4JTA4eClcbiIsIG9jcik7
CisJCQl9CisJCX0gZWxzZSAKKyNlbmRpZiAvKiBNTUNfU0RJT19TVVBQT1JUICovCisJCXsK
IAkJCS8qCi0JCQkgKiBGYWlsZWQsIHRyeSBNTUMKKwkJCSAqIE5leHQsIHRyeSBTRCBtb2Rl
cwogCQkJICovCi0JCQltbWNicl9zZXRfbW9kZShkZXYsIG1vZGVfbW1jKTsKLQkJCWlmICht
bWNfc2VuZF9vcF9jb25kKHNjLCAwLCAmb2NyKSAhPSBNTUNfRVJSX05PTkUpIHsKKwkJCW1t
Y2JyX3NldF9tb2RlKGRldiwgbW9kZV9zZCk7CisJCQllcnIgPSBtbWNfc2VuZF9pZl9jb25k
KHNjLCAxKTsKKwkJCWlmICgoYm9vdHZlcmJvc2UgfHwgbW1jX2RlYnVnKSAmJiBlcnIgPT0g
MCkKKwkJCQlkZXZpY2VfcHJpbnRmKHNjLT5kZXYsICJTRCAyLjAgaW50ZXJmYWNlIGNvbmRp
dGlvbnM6IE9LXG4iKTsKKwkJCWlmIChtbWNfc2VuZF9hcHBfb3BfY29uZChzYywgZXJyID8g
MCA6IE1NQ19PQ1JfQ0NTLCAmb2NyKSAhPQorCQkJCU1NQ19FUlJfTk9ORSkgewogCQkJCWlm
IChib290dmVyYm9zZSB8fCBtbWNfZGVidWcpCi0JCQkJCWRldmljZV9wcmludGYoc2MtPmRl
diwgIk1NQyBwcm9iZTogZmFpbGVkXG4iKTsKLQkJCQlvY3IgPSAwOyAvKiBGYWlsZWQgYm90
aCwgcG93ZXJkb3duLiAqLworCQkJCQlkZXZpY2VfcHJpbnRmKHNjLT5kZXYsICJTRCBwcm9i
ZTogZmFpbGVkXG4iKTsKKwkJCQkvKgorCQkJCSAqIEZhaWxlZCwgdHJ5IE1NQworCQkJCSAq
LworCQkJCW1tY2JyX3NldF9tb2RlKGRldiwgbW9kZV9tbWMpOworCQkJCWlmIChtbWNfc2Vu
ZF9vcF9jb25kKHNjLCAwLCAmb2NyKSAhPSBNTUNfRVJSX05PTkUpIHsKKwkJCQkJaWYgKGJv
b3R2ZXJib3NlIHx8IG1tY19kZWJ1ZykKKwkJCQkJCWRldmljZV9wcmludGYoc2MtPmRldiwg
Ik1NQyBwcm9iZTogZmFpbGVkXG4iKTsKKwkJCQkJb2NyID0gMDsgLyogRmFpbGVkIGJvdGgs
IHBvd2VyZG93bi4gKi8KKwkJCQl9IGVsc2UgaWYgKGJvb3R2ZXJib3NlIHx8IG1tY19kZWJ1
ZykKKwkJCQkJZGV2aWNlX3ByaW50ZihzYy0+ZGV2LAorCQkJCQkJIk1NQyBwcm9iZTogT0sg
KE9DUjogMHglMDh4KVxuIiwgb2NyKTsKIAkJCX0gZWxzZSBpZiAoYm9vdHZlcmJvc2UgfHwg
bW1jX2RlYnVnKQotCQkJCWRldmljZV9wcmludGYoc2MtPmRldiwKLQkJCQkgICAgIk1NQyBw
cm9iZTogT0sgKE9DUjogMHglMDh4KVxuIiwgb2NyKTsKLQkJfSBlbHNlIGlmIChib290dmVy
Ym9zZSB8fCBtbWNfZGVidWcpCi0JCQlkZXZpY2VfcHJpbnRmKHNjLT5kZXYsICJTRCBwcm9i
ZTogT0sgKE9DUjogMHglMDh4KVxuIiwgb2NyKTsKLQorCQkJCWRldmljZV9wcmludGYoc2Mt
PmRldiwgIlNEIHByb2JlOiBPSyAoT0NSOiAweCUwOHgpXG4iLCBvY3IpOworCQl9CisJCQog
CQltbWNicl9zZXRfb2NyKGRldiwgbW1jX3NlbGVjdF92ZGQoc2MsIG9jcikpOwogCQlpZiAo
bW1jYnJfZ2V0X29jcihkZXYpICE9IDApCiAJCQltbWNfaWRsZV9jYXJkcyhzYyk7CkBAIC0x
MzU4LDcgKzE2NTksMTYgQEAKIAkJbW1jX3Bvd2VyX2Rvd24oc2MpOwogCQlyZXR1cm47CiAJ
fQorI2lmIGRlZmluZWQoTU1DX1NESU9fU1VQUE9SVCkKIAkvKgorCSAqIElmIFNESU8gY2Fy
ZCBpbiB0aGUgc2xvdCBwZXJmb3JtIFNESU8gaW5pdCBvbmx5CisJICovCisJaWYgKG1tY2Jy
X2dldF9tb2RlKGRldikgPT0gbW9kZV9zZGlvKSB7CisJCW1tY19pb19kaXNjb3Zlcl9jYXJk
cyhzYyk7CisJCQkKKwl9IGVsc2UgeworI2VuZGlmCisJLyoKIAkgKiBSZXNlbGVjdCB0aGUg
Y2FyZHMgYWZ0ZXIgd2UndmUgaWRsZWQgdGhlbSBhYm92ZS4KIAkgKi8KIAlpZiAobW1jYnJf
Z2V0X21vZGUoZGV2KSA9PSBtb2RlX3NkKSB7CkBAIC0xMzY5LDE4ICsxNjc5LDQ2IEBACiAJ
CW1tY19zZW5kX29wX2NvbmQoc2MsIG1tY2JyX2dldF9vY3IoZGV2KSwgTlVMTCk7CiAJbW1j
X2Rpc2NvdmVyX2NhcmRzKHNjKTsKIAltbWNfcmVzY2FuX2NhcmRzKHNjKTsKLQorI2lmIGRl
ZmluZWQoTU1DX1NESU9fU1VQUE9SVCkKKwl9CisjZW5kaWYKKwkKIAltbWNicl9zZXRfYnVz
X21vZGUoZGV2LCBwdXNocHVsbCk7CiAJbW1jYnJfdXBkYXRlX2lvcyhkZXYpOwogCW1tY19j
YWxjdWxhdGVfY2xvY2soc2MpOworI2lmICFkZWZpbmVkKE1NQ19TRElPX1NVUFBPUlQpCiAJ
YnVzX2dlbmVyaWNfYXR0YWNoKGRldik7CisjZWxzZQorCS8qIFRoZSBTRElPIGRyaXZlciBh
dHRlbXB0cyB0byBzY2FuIHRoZSBmdW5jdGlvbnMgb24gdGhlIGNhcmQgaW4KKwkgKiBkZXZp
Y2VfYXR0YWNoLCB0aGVyZWZvcmUgd2UgbmVlZCB0byBiZSBhYmxlIHRvIGFjY2VzcyB0aGUg
Y2FyZAorCSAqIGFuZCBpdCBzaG91bGQgYmUgc2VsZWN0ZWQuCisJICoKKwkgKiBTbyByZXBs
YWNlIHRoZSBnZW5lcmljIGJ1c19hdHRhY2ggd2l0aCBhIGxvb3AgdGhhdCBzZWxlY3RzIHRo
ZQorCSAqIGNhcmQgYmVmb3JlIGNhbGxpbmcgdGhlIHByb2JpbmcgYW5kIGF0dGFjaGluZyB0
aGUgY2hpbGQgZHJpdmVycy4KKwkgKi8KKwl7CisJCWludCBua2lkLCBpOworCQlkZXZpY2Vf
dCAqa2lkczsKKwkJc3RydWN0IG1tY19pdmFycyAqaXZhcjsKKworCQlpZiAoKGVyciA9IGRl
dmljZV9nZXRfY2hpbGRyZW4oc2MtPmRldiwgJmtpZHMsICZua2lkKSkgIT0gMCkKKwkJCXJl
dHVybjsKKwkJZm9yIChpID0gMDsgaSA8IG5raWQ7IGkrKykgeworCQkJaXZhciA9IGRldmlj
ZV9nZXRfaXZhcnMoa2lkc1tpXSk7CisJCQltbWNfc2VsZWN0X2NhcmQoc2MsIGl2YXItPnJj
YSk7CisJCQlkZXZpY2VfcHJvYmVfYW5kX2F0dGFjaChraWRzW2ldKTsKKwkJfQorCQltbWNf
c2VsZWN0X2NhcmQoc2MsIDApOworCX0KKyNlbmRpZgorCiAvKgltbWNfdXBkYXRlX2NoaWxk
cmVuX3N5c2N0bChkZXYpOyovCiB9CiAKIHN0YXRpYyBpbnQKIG1tY19jYWxjdWxhdGVfY2xv
Y2soc3RydWN0IG1tY19zb2Z0YyAqc2MpCiB7Ci0JaW50IG1heF9kdHIsIG1heF9oc19kdHIs
IG1heF90aW1pbmc7CisJaW50IG1heF9sc19kdHIsIG1heF9kdHIsIG1heF9oc19kdHIsIG1h
eF90aW1pbmc7CiAJaW50IG5raWQsIGksIGZfbWluLCBmX21heDsKIAlkZXZpY2VfdCAqa2lk
czsKIAlzdHJ1Y3QgbW1jX2l2YXJzICppdmFyOwpAQCAtMTM5OCw2ICsxNzM2LDggQEAKIAkJ
aXZhciA9IGRldmljZV9nZXRfaXZhcnMoa2lkc1tpXSk7CiAJCWlmIChpdmFyLT50aW1pbmcg
PCBtYXhfdGltaW5nKQogCQkJbWF4X3RpbWluZyA9IGl2YXItPnRpbWluZzsKKwkJaWYgKGl2
YXItPmxzX3RyYW5fc3BlZWQgPCBtYXhfbHNfZHRyKQorCQkJbWF4X2xzX2R0ciA9IGl2YXIt
PmxzX3RyYW5fc3BlZWQ7CiAJCWlmIChpdmFyLT50cmFuX3NwZWVkIDwgbWF4X2R0cikKIAkJ
CW1heF9kdHIgPSBpdmFyLT50cmFuX3NwZWVkOwogCQlpZiAoaXZhci0+aHNfdHJhbl9zcGVl
ZCA8IG1heF9oc19kdHIpCkBAIC0xNDA1LDcgKzE3NDUsNyBAQAogCX0KIAlmb3IgKGkgPSAw
OyBpIDwgbmtpZDsgaSsrKSB7CiAJCWl2YXIgPSBkZXZpY2VfZ2V0X2l2YXJzKGtpZHNbaV0p
OwotCQlpZiAoaXZhci0+dGltaW5nID09IGJ1c190aW1pbmdfbm9ybWFsKQorCQlpZiAoaXZh
ci0+dGltaW5nID09IG1heF90aW1pbmcpCiAJCQljb250aW51ZTsKIAkJbW1jX3NlbGVjdF9j
YXJkKHNjLCBpdmFyLT5yY2EpOwogCQltbWNfc2V0X3RpbWluZyhzYywgbWF4X3RpbWluZyk7
CkBAIC0xNDE0LDYgKzE3NTQsOCBAQAogCWZyZWUoa2lkcywgTV9URU1QKTsKIAlpZiAobWF4
X3RpbWluZyA9PSBidXNfdGltaW5nX2hzKQogCQltYXhfZHRyID0gbWF4X2hzX2R0cjsKKwll
bHNlIGlmIChtYXhfdGltaW5nID09IGJ1c190aW1pbmdfbHMpCisJCW1heF9kdHIgPSBtYXhf
bHNfZHRyOwogCWlmIChib290dmVyYm9zZSB8fCBtbWNfZGVidWcpIHsKIAkJZGV2aWNlX3By
aW50ZihzYy0+ZGV2LAogCQkgICAgInNldHRpbmcgdHJhbnNmZXIgcmF0ZSB0byAlZC4lMDNk
TUh6JXNcbiIsCkBAIC0xNDc3LDYgKzE4MTksOSBAQAogCWNhc2UgTU1DX0lWQVJfTUFYX0RB
VEE6CiAJCSpyZXN1bHQgPSBtbWNicl9nZXRfbWF4X2RhdGEoYnVzKTsKIAkJYnJlYWs7CisJ
Y2FzZSBNTUNfSVZBUl9JT19GVU5DVElPTlM6CisJCSpyZXN1bHQgPSBpdmFyLT5pb19mdW5j
dGlvbnM7CisJCWJyZWFrOwogCX0KIAlyZXR1cm4gKDApOwogfQotLS0gL2Rldi9udWxsCTIw
MTItMDYtMDEgMTY6NTg6MzQuMDAwMDAwMDAwICswMTAwCisrKyBzZGlvLmMJMjAxMi0wNi0w
MSAxNzoyODowNS4wMDAwMDAwMDAgKzAxMDAKQEAgLTAsMCArMSw5MTAgQEAKKy8qLQorICog
Q29weXJpZ2h0IChjKSAyMDExIEJlbiBHcmF5LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBP
UgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElO
IE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogUG9ydGlvbnMgb2YgdGhpcyBzb2Z0
d2FyZSBtYXkgaGF2ZSBiZWVuIGRldmVsb3BlZCB3aXRoIHJlZmVyZW5jZSB0bworICogdGhl
IFNESU8gU2ltcGxpZmllZCBTcGVjaWZpY2F0aW9uLiAgVGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIG1heSBhcHBseToKKyAqCisgKiBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXBwbHkg
dG8gdGhlIHJlbGVhc2Ugb2YgdGhlIFNEIHNpbXBsaWZpZWQKKyAqIHNwZWNpZmljYXRpb24g
KCJTaW1wbGlmaWVkIFNwZWNpZmljYXRpb24iKSBieSB0aGUgU0QgQ2FyZCBBc3NvY2lhdGlv
bi4KKyAqIFRoZSBTaW1wbGlmaWVkIFNwZWNpZmljYXRpb24gaXMgYSBzdWJzZXQgb2YgdGhl
IGNvbXBsZXRlIFNEIFNwZWNpZmljYXRpb24KKyAqIHdoaWNoIGlzIG93bmVkIGJ5IHRoZSBT
RCBDYXJkIEFzc29jaWF0aW9uLgorICoKKyAqIERpc2NsYWltZXJzOgorICoKKyAqIFRoZSBp
bmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlIFNpbXBsaWZpZWQgU3BlY2lmaWNhdGlvbiBp
cyBwcmVzZW50ZWQKKyAqIG9ubHkgYXMgYSBzdGFuZGFyZCBzcGVjaWZpY2F0aW9uIGZvciBT
RCBDYXJkcyBhbmQgU0QgSG9zdC9BbmNpbGxhcnkgcHJvZHVjdHMKKyAqIGFuZCBpcyBwcm92
aWRlZCAiQVMtSVMiIHdpdGhvdXQgYW55IHJlcHJlc2VudGF0aW9ucyBvciB3YXJyYW50aWVz
IG9mIGFueQorICoga2luZC4gTm8gcmVzcG9uc2liaWxpdHkgaXMgYXNzdW1lZCBieSB0aGUg
U0QgQ2FyZCBBc3NvY2lhdGlvbiBmb3IgYW55CisgKiBkYW1hZ2VzLCBhbnkgaW5mcmluZ2Vt
ZW50cyBvZiBwYXRlbnRzIG9yIG90aGVyIHJpZ2h0IG9mIHRoZSBTRCBDYXJkCisgKiBBc3Nv
Y2lhdGlvbiBvciBhbnkgdGhpcmQgcGFydGllcywgd2hpY2ggbWF5IHJlc3VsdCBmcm9tIGl0
cyB1c2UuIE5vCisgKiBsaWNlbnNlIGlzIGdyYW50ZWQgYnkgaW1wbGljYXRpb24sIGVzdG9w
cGVsIG9yIG90aGVyd2lzZSB1bmRlciBhbnkgcGF0ZW50CisgKiBvciBvdGhlciByaWdodHMg
b2YgdGhlIFNEIENhcmQgQXNzb2NpYXRpb24gb3IgYW55IHRoaXJkIHBhcnR5LiBOb3RoaW5n
CisgKiBoZXJlaW4gc2hhbGwgYmUgY29uc3RydWVkIGFzIGFuIG9ibGlnYXRpb24gYnkgdGhl
IFNEIENhcmQgQXNzb2NpYXRpb24gdG8KKyAqIGRpc2Nsb3NlIG9yIGRpc3RyaWJ1dGUgYW55
IHRlY2huaWNhbCBpbmZvcm1hdGlvbiwga25vdy1ob3cgb3Igb3RoZXIKKyAqIGNvbmZpZGVu
dGlhbCBpbmZvcm1hdGlvbiB0byBhbnkgdGhpcmQgcGFydHkuCisgKi8KKworI2luY2x1ZGUg
PHN5cy9jZGVmcy5oPgorX19GQlNESUQoIiRGcmVlQlNEJCIpOworCisjaW5jbHVkZSA8c3lz
L3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3N5c3RtLmg+CisjaW5jbHVkZSA8c3lzL2Jpby5o
PgorI2luY2x1ZGUgPHN5cy9idXMuaD4KKyNpbmNsdWRlIDxzeXMvY29uZi5oPgorI2luY2x1
ZGUgPHN5cy9rZXJuZWwuaD4KKyNpbmNsdWRlIDxzeXMva3RocmVhZC5oPgorI2luY2x1ZGUg
PHN5cy9sb2NrLmg+CisjaW5jbHVkZSA8c3lzL21hbGxvYy5oPgorI2luY2x1ZGUgPHN5cy9t
b2R1bGUuaD4KKyNpbmNsdWRlIDxzeXMvbXV0ZXguaD4KKworI2luY2x1ZGUgPGRldi9tbWMv
bW1jdmFyLmg+CisjaW5jbHVkZSA8ZGV2L21tYy9tbWNyZWcuaD4KKyNpbmNsdWRlIDxkZXYv
bW1jL21tY2lvcmVnLmg+CisjaW5jbHVkZSA8ZGV2L21tYy9zZGlvLmg+CisjaW5jbHVkZSA8
ZGV2L21tYy9zZGlvdmFyLmg+CisKKyNpbmNsdWRlICJtbWNidXNfaWYuaCIKKyNpbmNsdWRl
ICJzZGlvX2lmLmgiCisKKworI2RlZmluZSBTRElPX0ZMQUdfU1VQUE9SVF9NVUxUSV9CTE9D
SyAgICgweDFVTCA8PCAwKQorCisKKworc3RydWN0IHNkaW9fc29mdGMgeworCWRldmljZV90
IGRldjsKKwlzdHJ1Y3QgbXR4IHNjX210eDsKKwlpbnQgbnVtX2Z1bmNzOworCisJdW5zaWdu
ZWQgaW50IGZsYWdzOworCXVpbnQ4X3QgY2Njcl9yZXY7CisJdWludDhfdCBzZGlvX3JldjsK
KworCXVpbnQxNl90IHZlbmRvcl9pZDsKKwl1aW50MTZfdCBwcm9kdWN0X2lkOworfTsKKwor
LyogYnVzIGVudHJ5IHBvaW50cyAqLworc3RhdGljIGludCBzZGlvX3Byb2JlKGRldmljZV90
IGRldik7CitzdGF0aWMgaW50IHNkaW9fYXR0YWNoKGRldmljZV90IGRldik7CitzdGF0aWMg
aW50IHNkaW9fZGV0YWNoKGRldmljZV90IGRldik7CisKKy8qCisgKiBQZXItZnVuY3Rpb24g
ZGF0YQorICovCitzdHJ1Y3Qgc2Rpb19pdmFycyB7CisJdV9pbnQgZm47CQkJLyogRnVuY3Rp
b24gbnVtYmVyICovCisJdV9zaG9ydCBibGtfc3o7Cit9OworCisKKyNkZWZpbmUgU0RJT19M
T0NLKF9zYykJCW10eF9sb2NrKCYoX3NjKS0+c2NfbXR4KQorI2RlZmluZQlTRElPX1VOTE9D
Syhfc2MpCW10eF91bmxvY2soJihfc2MpLT5zY19tdHgpCisjZGVmaW5lIFNESU9fTE9DS19J
TklUKF9zYykgXAorCW10eF9pbml0KCZfc2MtPnNjX210eCwgZGV2aWNlX2dldF9uYW1ldW5p
dChfc2MtPmRldiksIFwKKwkgICAgInNkaW8iLCBNVFhfREVGKQorI2RlZmluZSBTRElPX0xP
Q0tfREVTVFJPWShfc2MpCW10eF9kZXN0cm95KCZfc2MtPnNjX210eCk7CisjZGVmaW5lIFNE
SU9fQVNTRVJUX0xPQ0tFRChfc2MpIG10eF9hc3NlcnQoJl9zYy0+c2NfbXR4LCBNQV9PV05F
RCk7CisjZGVmaW5lIFNESU9fQVNTRVJUX1VOTE9DS0VEKF9zYykgbXR4X2Fzc2VydCgmX3Nj
LT5zY19tdHgsIE1BX05PVE9XTkVEKTsKKworCisvKioKKyAqCXNkaW9fcndfZGlyZWN0IC0g
cmVhZHMgb3Igd3JpdGVzIGEgc2luZ2xlIGJ5dGUKKyAqCUBzYzogaTJjIGRyaXZlciBjb250
ZXh0CisgKglAZmxhZ3M6IHRoZSBldmVudChzKSB0byB3YWl0IG9uLCB0aGlzIGlzIGEgYml0
bWFzayBvZiB0aGUgSTJDX1NUQVRfPz8/IGZsYWdzCisgKglAc3RhdHA6IGlmIG5vdCBudWxs
IHdpbGwgY29udGFpbiB0aGUgc3RhdHVzIGZsYWdzIHVwb24gcmV0dXJuCisgKglAdGltbzog
dGhlIG51bWJlciBvZiB0aWNrcyB0byB3YWl0CisgKgorICoJCisgKgorICoJTE9DS0lORzoK
KyAqCVRoZSBkcml2ZXIgY29udGV4dCBtdXN0IGJlIGxvY2tlZCBiZWZvcmUgY2FsbGluZyB0
aGlzIGZ1bmN0aW9uLiBJbnRlcm5hbGx5CisgKgl0aGUgZnVuY3Rpb24gc2xlZXBzLCByZWxl
YXNpbmcgdGhlIGxvY2sgYXMgaXQgZG9lcyBzbywgaG93ZXZlciB0aGUgbG9jayBpcworICoJ
YWx3YXlzIHJldGFrZW4gYmVmb3JlIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KKyAqCisgKglS
RVRVUk5TOgorICoJMCBpZiB0aGUgZXZlbnQocykgd2VyZSB0cmlwcGVkIHdpdGhpbiB0aW1l
b3V0IHBlcmlvZAorICoJLUVCVVNZIGlmIHRpbWVkb3V0IHdhaXRpbmcgZm9yIHRoZSBldmVu
dHMKKyAqCS1FTlhJTyBpZiBhIE5BQ0sgZXZlbnQgd2FzIHJlY2VpdmVkCisgKi8KK2ludAor
c2Rpb19yd19kaXJlY3Qoc3RydWN0IHNkaW9fc29mdGMgKnNjLCBpbnQgd3IsIHVpbnQzMl90
IGZuLCB1aW50MzJfdCBhZHIsCisgICAgdWludDhfdCAqZGF0YSkKK3sKKwlkZXZpY2VfdCBk
ZXYgPSBzYy0+ZGV2OworCXN0cnVjdCBtbWNfcmVxdWVzdCByZXE7CisJc3RydWN0IG1tY19j
b21tYW5kIGNtZDsKKworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisJbWVtc2V0
KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwlyZXEuY21kID0gJmNtZDsKKwljbWQub3Bjb2Rl
ID0gU0RfSU9fUldfRElSRUNUOworCWNtZC5hcmcgPSBTRF9JT19SV19GVU5DKGZuKSB8IFNE
X0lPX1JXX0FEUihhZHIpOworCWlmICh3cikKKwkJY21kLmFyZyB8PSBTRF9JT19SV19XUiB8
IFNEX0lPX1JXX1JBVyB8IFNEX0lPX1JXX0RBVCgqZGF0YSk7CisJY21kLmZsYWdzID0gTU1D
X1JTUF9SNSB8IE1NQ19DTURfQUM7CisJY21kLmRhdGEgPSBOVUxMOworCisJTU1DQlVTX1dB
SVRfRk9SX1JFUVVFU1QoZGV2aWNlX2dldF9wYXJlbnQoZGV2KSwgZGV2LCAmcmVxKTsKKwlp
ZiAocmVxLmNtZC0+ZXJyb3IgIT0gTU1DX0VSUl9OT05FKQorCQlyZXR1cm4gKHJlcS5jbWQt
PmVycm9yKTsKKworCWlmIChjbWQucmVzcFswXSAmIFI1X0NPTV9DUkNfRVJST1IpCisJCXJl
dHVybiAoTU1DX0VSUl9CQURDUkMpOworCWlmIChjbWQucmVzcFswXSAmIChSNV9JTExFR0FM
X0NPTU1BTkQgfCBSNV9GVU5DVElPTl9OVU1CRVIpKQorCQlyZXR1cm4gKE1NQ19FUlJfSU5W
QUxJRCk7CisJaWYgKGNtZC5yZXNwWzBdICYgUjVfT1VUX09GX1JBTkdFKQorCQlyZXR1cm4g
KE1NQ19FUlJfRkFJTEVEKTsKKwkKKwkqZGF0YSA9ICh1aW50OF90KSAoY21kLnJlc3BbMF0g
JiAweGZmKTsKKwlyZXR1cm4gKE1NQ19FUlJfTk9ORSk7Cit9CisKKworLyoqCisgKglzZGlv
X3J3X2V4dGVuZGVkIC0gcmVhZHMgb3Igd3JpdGVzIG11bHRpcGxlIGJ5dGVzCisgKglAc2M6
IGkyYyBkcml2ZXIgY29udGV4dAorICoJQGZsYWdzOiB0aGUgZXZlbnQocykgdG8gd2FpdCBv
biwgdGhpcyBpcyBhIGJpdG1hc2sgb2YgdGhlIEkyQ19TVEFUXz8/PyBmbGFncworICoJQHN0
YXRwOiBpZiBub3QgbnVsbCB3aWxsIGNvbnRhaW4gdGhlIHN0YXR1cyBmbGFncyB1cG9uIHJl
dHVybgorICoJQHRpbW86IHRoZSBudW1iZXIgb2YgdGlja3MgdG8gd2FpdAorICoKKyAqCQor
ICoKKyAqCVJFVFVSTlM6CisgKglNTUNfRVJSX05PTkUgaWYgc3VjY2Vzc2lmdWwKKyAqLwor
aW50CitzZGlvX3J3X2V4dGVuZGVkKHN0cnVjdCBzZGlvX3NvZnRjICpzYywgaW50IHdyLCBp
bnQgaW5jciwgdWludDMyX3QgZm4sCisgICAgdWludDMyX3QgYWRyLCB1aW50OF90ICpkYXRh
cCwgc2l6ZV90IGRhdGFsZW4sIHVuc2lnbmVkIGJsa3MpCit7CisJZGV2aWNlX3QgZGV2ID0g
c2MtPmRldjsKKwlzdHJ1Y3QgbW1jX3JlcXVlc3QgcmVxOworCXN0cnVjdCBtbWNfY29tbWFu
ZCBjbWQ7CisJc3RydWN0IG1tY19kYXRhIGRhdGE7CisJCisjaWYgMAorCS8qIFRPRE86IGJs
b2NrIG1vZGUgbm90IHlldCBzdXBwb3J0ZWQgKi8KKwlpZiAobGVuID4gNTEyKSB7CisJCWRl
dmljZV9wcmludGYoc2MtPmRldiwgIndhcm5pbmcgLSBibG9jayBtb2RlIG5vdCB5ZXQgc3Vw
cG9ydGVkXG4iKTsKKwkJcmV0dXJuIE1NQ19FUlJfTUFYOworCX0KKyNlbmRpZgorCQorCW1l
bXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihj
bWQpKTsKKwltZW1zZXQoJmRhdGEsIDAsIHNpemVvZihkYXRhKSk7CisJcmVxLmNtZCA9ICZj
bWQ7CisKKwljbWQub3Bjb2RlID0gU0RfSU9fUldfRVhURU5ERUQ7CisJY21kLmFyZyA9IFNE
X0lPX1JXX0ZVTkMoZm4pOworCWNtZC5hcmcgfD0gU0RfSU9fUldfQURSKGFkcik7CisJaWYg
KGJsa3MpCisJCWNtZC5hcmcgfD0gU0RfSU9FX1JXX0JMSyB8IFNEX0lPRV9SV19MRU4oYmxr
cyk7CisJZWxzZQorCQljbWQuYXJnIHw9IFNEX0lPRV9SV19MRU4oZGF0YWxlbik7CisJaWYg
KHdyKQorCQljbWQuYXJnIHw9IFNEX0lPX1JXX1dSOworCWlmIChpbmNyKQorCQljbWQuYXJn
IHw9IFNEX0lPX1JXX0lOQ1I7CisJY21kLmZsYWdzID0gTU1DX1JTUF9SNSB8IE1NQ19DTURf
QUM7CisJY21kLmRhdGEgPSAmZGF0YTsKKworCWRhdGEuZGF0YSA9IGRhdGFwOworCWRhdGEu
bGVuID0gZGF0YWxlbjsKKwlkYXRhLmZsYWdzID0gd3IgPyBNTUNfREFUQV9XUklURSA6IE1N
Q19EQVRBX1JFQUQ7CisKKwkvLyBwcmludGYoIltCUkddIHNkaW9fcndfZXh0ZW5kZWQgOiBj
bWQub3Bjb2RlID0gMHglMDh4IDogY21kLmFyZyA9IDB4JTA4eCA6IGRhdGEubGVuID0gJXVc
biIsIGNtZC5vcGNvZGUsIGNtZC5hcmcsIGRhdGEubGVuKTsKKy8vc2MtPmZsYWdzIHw9IFNE
SU9fRkxBR19TVVBQT1JUX01VTFRJX0JMT0NLCisKKwlNTUNCVVNfV0FJVF9GT1JfUkVRVUVT
VChkZXZpY2VfZ2V0X3BhcmVudChkZXYpLCBkZXYsICZyZXEpOworCWlmIChyZXEuY21kLT5l
cnJvciAhPSBNTUNfRVJSX05PTkUpCisJCXJldHVybiAocmVxLmNtZC0+ZXJyb3IpOworCisJ
cmV0dXJuIChNTUNfRVJSX05PTkUpOworfQorCisKKy8qKgorICoJc2Rpb19yd19leHRlbmRl
ZF9leCAtIHJlYWRzIG9yIHdyaXRlcyBtdWx0aXBsZSBieXRlcworICoJQHNjOiBpMmMgZHJp
dmVyIGNvbnRleHQKKyAqCUBmbGFnczogdGhlIGV2ZW50KHMpIHRvIHdhaXQgb24sIHRoaXMg
aXMgYSBiaXRtYXNrIG9mIHRoZSBJMkNfU1RBVF8/Pz8gZmxhZ3MKKyAqCUBzdGF0cDogaWYg
bm90IG51bGwgd2lsbCBjb250YWluIHRoZSBzdGF0dXMgZmxhZ3MgdXBvbiByZXR1cm4KKyAq
CUB0aW1vOiB0aGUgbnVtYmVyIG9mIHRpY2tzIHRvIHdhaXQKKyAqCisgKgkKKyAqCisgKglS
RVRVUk5TOgorICoJTU1DX0VSUl9OT05FIGlmIHN1Y2Nlc3NpZnVsCisgKi8KK3N0YXRpYyBp
bnQKK3NkaW9fcndfZXh0ZW5kZWRfZXgoc3RydWN0IHNkaW9fc29mdGMgKnNjLCBpbnQgd3Is
IGludCBpbmNyLAorCXN0cnVjdCBzZGlvX2l2YXJzICppdmFyLCB1aW50MzJfdCBhZHIsIHVp
bnQ4X3QgKmRhdGFwLCBzaXplX3QgbGVuKQoreworCWludCByZXQ7CisJc2l6ZV90IG5ibGtz
OworCXNpemVfdCBuYnl0ZXM7CisKKwkvKiBJZiB0aGUgZGV2aWNlIHN1cHBvcnRzIGJsb2Nr
IHRyYW5zZmVycyBhbmQgdGhlIHNpemUgaXMgbGFyZ2VyIHRoYW4KKwkgKiB0aGUgYmxvY2sg
c2l6ZSB0aGVuIGRvIHRoZSBpbnRpYWwgdHJhbnNmZXIgYXMgYSBibG9jay4KKwkgKi8KKwlp
ZiAoKHNjLT5mbGFncyAmIFNESU9fRkxBR19TVVBQT1JUX01VTFRJX0JMT0NLKSAmJgorCSAg
ICAoaXZhci0+YmxrX3N6ID4gMCkgJiYgKGxlbiA+IGl2YXItPmJsa19zeikpIHsKKwkKKwkJ
d2hpbGUgKGxlbiA+IGl2YXItPmJsa19zeikgeworCQkKKwkJCS8qIFRoZSBtYXhpbXVtIG51
bWJlciBvZiBibG9ja3MgdGhhdCBjYW4gYmUgdHJhbnNmZXJyZWQgYWNjb3JkaW5nCisJCQkg
KiB0byB0aGUgc3BlYyBpZiA1MTEuCisJCQkgKi8KKwkJCW5ibGtzID0gKGxlbiAvIGl2YXIt
PmJsa19zeik7CisJCQlpZiAobmJsa3MgPiA1MTEpCisJCQkJbmJsa3MgPSA1MTE7CisJCQkJ
CisJCQluYnl0ZXMgPSAobmJsa3MgKiBpdmFyLT5ibGtfc3opOworCQkJCisJCQkvKiBXcml0
ZSB0aGUgZGF0YSBhcyBibG9ja3MgKi8KKwkJCXJldCA9IHNkaW9fcndfZXh0ZW5kZWQoc2Ms
IHdyLCBpbmNyLCBpdmFyLT5mbiwgYWRyLCBkYXRhcCwgbmJ5dGVzLCBuYmxrcyk7CisJCQlp
ZiAocmV0ICE9IDApCisJCQkJcmV0dXJuIChyZXQpOworCisJCQlsZW4gLT0gbmJ5dGVzOwor
CQkJZGF0YXAgKz0gbmJ5dGVzOworCQkJaWYgKGluY3IpCisJCQkJYWRyICs9IG5ieXRlczsK
KwkJfQorCX0KKwkKKwkvKiBJZiB0aGVyZSBpcyBhbnkgZGF0YSByZW1haW5pbmcgdXNlIHN0
YW5kYXJkIGJ5dGUgdHJhbnNmZXJzICovCisJd2hpbGUgKGxlbiA+IDApIHsKKwkJCisJCW5i
eXRlcyA9IG1pbihsZW4sIDUxMik7CisJCQorCQkvKiBEbyB0aGUgd3JpdGUgaW4gYnl0ZSBt
b2RlICovCisJCXJldCA9IHNkaW9fcndfZXh0ZW5kZWQoc2MsIHdyLCBpbmNyLCBpdmFyLT5m
biwgYWRyLCBkYXRhcCwgbmJ5dGVzLCAwKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJcmV0dXJu
IChyZXQpOworCisJCWxlbiAtPSBuYnl0ZXM7CisJCWRhdGFwICs9IG5ieXRlczsKKwkJaWYg
KGluY3IpCisJCQlhZHIgKz0gbmJ5dGVzOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworCisv
KioKKyAqCXNkaW9fcmVhZGIgLSByZWFkcyBhIHNpbmdsZSBieXRlCisgKglzZGlvX3JlYWRz
IC0gcmVhZHMgYSAxNi1iaXQgdmFsdWUKKyAqCXNkaW9fcmVhZGwgLSByZWFkcyBhIDMyLWJp
dCB2YWx1ZQorICoJQHNjOiBpMmMgZHJpdmVyIGNvbnRleHQKKyAqCUBmbGFnczogdGhlIGV2
ZW50KHMpIHRvIHdhaXQgb24sIHRoaXMgaXMgYSBiaXRtYXNrIG9mIHRoZSBJMkNfU1RBVF8/
Pz8gZmxhZ3MKKyAqCUBzdGF0cDogaWYgbm90IG51bGwgd2lsbCBjb250YWluIHRoZSBzdGF0
dXMgZmxhZ3MgdXBvbiByZXR1cm4KKyAqCUB0aW1vOiB0aGUgbnVtYmVyIG9mIHRpY2tzIHRv
IHdhaXQKKyAqCisgKgkKKyAqCisgKglSRVRVUk5TOgorICoJTU1DX0VSUl9OT05FIGlmIHN1
Y2Nlc3NpZnVsCisgKi8KK3N0YXRpYyBpbnQKK3NkaW9fZjBfcmVhZGIoZGV2aWNlX3QgYnJk
ZXYsIHVfaW50IHJlZywgdWludDhfdCAqdmFsKQoreworCXN0cnVjdCBzZGlvX3NvZnRjICpz
YyA9IGRldmljZV9nZXRfc29mdGMoYnJkZXYpOworCXJldHVybiBzZGlvX3J3X2RpcmVjdChz
YywgMCwgMCwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW50CitzZGlvX3JlYWRiKGRldmlj
ZV90IGJyZGV2LCBkZXZpY2VfdCByZXFkZXYsIHVfaW50IHJlZywgdWludDhfdCAqdmFsKQor
eworCXN0cnVjdCBzZGlvX3NvZnRjICpzYyA9IGRldmljZV9nZXRfc29mdGMoYnJkZXYpOwor
CXN0cnVjdCBzZGlvX2l2YXJzICppdmFyID0gZGV2aWNlX2dldF9pdmFycyhyZXFkZXYpOwor
CisJcmV0dXJuIHNkaW9fcndfZGlyZWN0KHNjLCAwLCBpdmFyLT5mbiwgcmVnLCB2YWwpOwor
fQorCitzdGF0aWMgaW50CitzZGlvX3JlYWRzKGRldmljZV90IGJyZGV2LCBkZXZpY2VfdCBy
ZXFkZXYsIHVfaW50IHJlZywgdWludDE2X3QgKnZhbCkKK3sKKwlzdHJ1Y3Qgc2Rpb19zb2Z0
YyAqc2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGJyZGV2KTsKKwlzdHJ1Y3Qgc2Rpb19pdmFycyAq
aXZhciA9IGRldmljZV9nZXRfaXZhcnMocmVxZGV2KTsKKworCXJldHVybiBzZGlvX3J3X2V4
dGVuZGVkKHNjLCAwLCAxLCBpdmFyLT5mbiwgcmVnLCAodWludDhfdCopdmFsLCAyLCAwKTsK
K30KKworc3RhdGljIGludAorc2Rpb19yZWFkbChkZXZpY2VfdCBicmRldiwgZGV2aWNlX3Qg
cmVxZGV2LCB1X2ludCByZWcsIHVpbnQzMl90ICp2YWwpCit7CisJc3RydWN0IHNkaW9fc29m
dGMgKnNjID0gZGV2aWNlX2dldF9zb2Z0YyhicmRldik7CisJc3RydWN0IHNkaW9faXZhcnMg
Kml2YXIgPSBkZXZpY2VfZ2V0X2l2YXJzKHJlcWRldik7CisKKwlyZXR1cm4gc2Rpb19yd19l
eHRlbmRlZChzYywgMCwgMSwgaXZhci0+Zm4sIHJlZywgKHVpbnQ4X3QqKXZhbCwgNCwgMCk7
Cit9CisKKworLyoqCisgKglzZGlvX3dyaXRlYiAtIHdyaXRlcyBhIHNpbmdsZSBieXRlCisg
KglzZGlvX3dyaXRlcyAtIHdyaXRlcyBhIDE2LWJpdCB2YWx1ZQorICoJc2Rpb193cml0ZWwg
LSB3cml0ZXMgYSAzMi1iaXQgdmFsdWUKKyAqCUBzYzogaTJjIGRyaXZlciBjb250ZXh0Cisg
KglAZmxhZ3M6IHRoZSBldmVudChzKSB0byB3YWl0IG9uLCB0aGlzIGlzIGEgYml0bWFzayBv
ZiB0aGUgSTJDX1NUQVRfPz8/IGZsYWdzCisgKglAc3RhdHA6IGlmIG5vdCBudWxsIHdpbGwg
Y29udGFpbiB0aGUgc3RhdHVzIGZsYWdzIHVwb24gcmV0dXJuCisgKglAdGltbzogdGhlIG51
bWJlciBvZiB0aWNrcyB0byB3YWl0CisgKgorICoJCisgKgorICoJUkVUVVJOUzoKKyAqCU1N
Q19FUlJfTk9ORSBpZiBzdWNjZXNzaWZ1bAorICovCitzdGF0aWMgaW50CitzZGlvX2YwX3dy
aXRlYihkZXZpY2VfdCBicmRldiwgdV9pbnQgcmVnLCB1aW50OF90IHZhbCkKK3sKKwlzdHJ1
Y3Qgc2Rpb19zb2Z0YyAqc2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGJyZGV2KTsKKwlyZXR1cm4g
c2Rpb19yd19kaXJlY3Qoc2MsIDEsIDAsIHJlZywgJnZhbCk7Cit9CisKK3N0YXRpYyBpbnQK
K3NkaW9fd3JpdGViKGRldmljZV90IGJyZGV2LCBkZXZpY2VfdCByZXFkZXYsIHVfaW50IHJl
ZywgdWludDhfdCB2YWwpCit7CisJc3RydWN0IHNkaW9fc29mdGMgKnNjID0gZGV2aWNlX2dl
dF9zb2Z0YyhicmRldik7CisJc3RydWN0IHNkaW9faXZhcnMgKml2YXIgPSBkZXZpY2VfZ2V0
X2l2YXJzKHJlcWRldik7CisKKwlyZXR1cm4gc2Rpb19yd19kaXJlY3Qoc2MsIDEsIGl2YXIt
PmZuLCByZWcsICZ2YWwpOworfQorCitzdGF0aWMgaW50CitzZGlvX3dyaXRlcyhkZXZpY2Vf
dCBicmRldiwgZGV2aWNlX3QgcmVxZGV2LCB1X2ludCByZWcsIHVpbnQxNl90IHZhbCkKK3sK
KwlzdHJ1Y3Qgc2Rpb19zb2Z0YyAqc2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGJyZGV2KTsKKwlz
dHJ1Y3Qgc2Rpb19pdmFycyAqaXZhciA9IGRldmljZV9nZXRfaXZhcnMocmVxZGV2KTsKKwor
CXJldHVybiBzZGlvX3J3X2V4dGVuZGVkKHNjLCAxLCAxLCBpdmFyLT5mbiwgcmVnLCAodWlu
dDhfdCopJnZhbCwgMiwgMCk7Cit9CisKK3N0YXRpYyBpbnQKK3NkaW9fd3JpdGVsKGRldmlj
ZV90IGJyZGV2LCBkZXZpY2VfdCByZXFkZXYsIHVfaW50IHJlZywgdWludDMyX3QgdmFsKQor
eworCXN0cnVjdCBzZGlvX3NvZnRjICpzYyA9IGRldmljZV9nZXRfc29mdGMoYnJkZXYpOwor
CXN0cnVjdCBzZGlvX2l2YXJzICppdmFyID0gZGV2aWNlX2dldF9pdmFycyhyZXFkZXYpOwor
CisJcmV0dXJuIHNkaW9fcndfZXh0ZW5kZWQoc2MsIDEsIDEsIGl2YXItPmZuLCByZWcsICh1
aW50OF90KikmdmFsLCA0LCAwKTsKK30KKworCisKKy8qKgorICoJc2Rpb19tZW1jcHlfZnJv
bSAtIHdyaXRlcyBhIHNpbmdsZSBieXRlCisgKglzZGlvX21lbWNweV90byAtIHdyaXRlcyBh
IDE2LWJpdCB2YWx1ZQorICoJQHNjOiBpMmMgZHJpdmVyIGNvbnRleHQKKyAqCUBmbGFnczog
dGhlIGV2ZW50KHMpIHRvIHdhaXQgb24sIHRoaXMgaXMgYSBiaXRtYXNrIG9mIHRoZSBJMkNf
U1RBVF8/Pz8gZmxhZ3MKKyAqCUBzdGF0cDogaWYgbm90IG51bGwgd2lsbCBjb250YWluIHRo
ZSBzdGF0dXMgZmxhZ3MgdXBvbiByZXR1cm4KKyAqCUB0aW1vOiB0aGUgbnVtYmVyIG9mIHRp
Y2tzIHRvIHdhaXQKKyAqCisgKgkKKyAqCisgKglSRVRVUk5TOgorICoJTU1DX0VSUl9OT05F
IGlmIHN1Y2Nlc3NpZnVsCisgKi8KK3N0YXRpYyBpbnQKK3NkaW9fbWVtY3B5X2Zyb20oZGV2
aWNlX3QgYnJkZXYsIGRldmljZV90IHJlcWRldiwgdV9pbnQgcmVnLCB1X2NoYXIgKmRhdGFw
LAorICAgICAgICAgICAgICAgICBzaXplX3QgbGVuKQoreworCXN0cnVjdCBzZGlvX3NvZnRj
ICpzYyA9IGRldmljZV9nZXRfc29mdGMoYnJkZXYpOworCXN0cnVjdCBzZGlvX2l2YXJzICpp
dmFyID0gZGV2aWNlX2dldF9pdmFycyhyZXFkZXYpOworCisJcmV0dXJuIHNkaW9fcndfZXh0
ZW5kZWRfZXgoc2MsIDAsIDEsIGl2YXIsIHJlZywgZGF0YXAsIGxlbik7Cit9CisKK3N0YXRp
YyBpbnQKK3NkaW9fbWVtY3B5X3RvKGRldmljZV90IGJyZGV2LCBkZXZpY2VfdCByZXFkZXYs
IHVfaW50IHJlZywgdV9jaGFyICpkYXRhcCwKKyAgICAgICAgICAgICAgIHNpemVfdCBsZW4p
Cit7CisJc3RydWN0IHNkaW9fc29mdGMgKnNjID0gZGV2aWNlX2dldF9zb2Z0YyhicmRldik7
CisJc3RydWN0IHNkaW9faXZhcnMgKml2YXIgPSBkZXZpY2VfZ2V0X2l2YXJzKHJlcWRldik7
CisKKwlyZXR1cm4gc2Rpb19yd19leHRlbmRlZF9leChzYywgMSwgMSwgaXZhciwgcmVnLCBk
YXRhcCwgbGVuKTsKK30KKworLyoqCisgKglzZGlvX3N0cmVhbV9mcm9tIC0gd3JpdGVzIGEg
c2luZ2xlIGJ5dGUKKyAqCXNkaW9fc3RyZWFtX3RvIC0gd3JpdGVzIGEgMTYtYml0IHZhbHVl
CisgKglAc2M6IGkyYyBkcml2ZXIgY29udGV4dAorICoJQGZsYWdzOiB0aGUgZXZlbnQocykg
dG8gd2FpdCBvbiwgdGhpcyBpcyBhIGJpdG1hc2sgb2YgdGhlIEkyQ19TVEFUXz8/PyBmbGFn
cworICoJQHN0YXRwOiBpZiBub3QgbnVsbCB3aWxsIGNvbnRhaW4gdGhlIHN0YXR1cyBmbGFn
cyB1cG9uIHJldHVybgorICoJQHRpbW86IHRoZSBudW1iZXIgb2YgdGlja3MgdG8gd2FpdAor
ICoKKyAqCQorICoKKyAqCVJFVFVSTlM6CisgKglNTUNfRVJSX05PTkUgaWYgc3VjY2Vzc2lm
dWwKKyAqLworc3RhdGljIGludAorc2Rpb19zdHJlYW1fZnJvbShkZXZpY2VfdCBicmRldiwg
ZGV2aWNlX3QgcmVxZGV2LCB1X2ludCByZWcsIHVfY2hhciAqZGF0YXAsCisgICAgICAgICAg
ICAgICAgIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHNkaW9fc29mdGMgKnNjID0gZGV2aWNl
X2dldF9zb2Z0YyhicmRldik7CisJc3RydWN0IHNkaW9faXZhcnMgKml2YXIgPSBkZXZpY2Vf
Z2V0X2l2YXJzKHJlcWRldik7CisKKwlyZXR1cm4gc2Rpb19yd19leHRlbmRlZF9leChzYywg
MCwgMCwgaXZhciwgcmVnLCBkYXRhcCwgbGVuKTsKK30KKworc3RhdGljIGludAorc2Rpb19z
dHJlYW1fdG8oZGV2aWNlX3QgYnJkZXYsIGRldmljZV90IHJlcWRldiwgdV9pbnQgcmVnLCB1
X2NoYXIgKmRhdGFwLAorICAgICAgICAgICAgICAgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qg
c2Rpb19zb2Z0YyAqc2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGJyZGV2KTsKKwlzdHJ1Y3Qgc2Rp
b19pdmFycyAqaXZhciA9IGRldmljZV9nZXRfaXZhcnMocmVxZGV2KTsKKworCXJldHVybiBz
ZGlvX3J3X2V4dGVuZGVkX2V4KHNjLCAxLCAwLCBpdmFyLCByZWcsIGRhdGFwLCBsZW4pOwor
fQorCisKKy8qKgorICoJc2Rpb19zZXRfYmxrX3N6IC0gc2V0cyB0aGUgYmxvY2sgc2l6ZSBm
b3IgdGhlIGZ1bmN0aW9uCisgKglAc2M6IGkyYyBkcml2ZXIgY29udGV4dAorICoJQGZsYWdz
OiB0aGUgZXZlbnQocykgdG8gd2FpdCBvbiwgdGhpcyBpcyBhIGJpdG1hc2sgb2YgdGhlIEky
Q19TVEFUXz8/PyBmbGFncworICoJQHN0YXRwOiBpZiBub3QgbnVsbCB3aWxsIGNvbnRhaW4g
dGhlIHN0YXR1cyBmbGFncyB1cG9uIHJldHVybgorICoJQHRpbW86IHRoZSBudW1iZXIgb2Yg
dGlja3MgdG8gd2FpdAorICoKKyAqCQorICoKKyAqCVJFVFVSTlM6CisgKglNTUNfRVJSX05P
TkUgaWYgc3VjY2Vzc2lmdWwKKyAqLworc3RhdGljIGludAorc2Rpb19zZXRfYmxrX3N6KGRl
dmljZV90IGJyZGV2LCBkZXZpY2VfdCByZXFkZXYsIHVpbnQxNl90IHNpemUpCit7CisJc3Ry
dWN0IHNkaW9fc29mdGMgKnNjID0gZGV2aWNlX2dldF9zb2Z0YyhicmRldik7CisJc3RydWN0
IHNkaW9faXZhcnMgKml2YXIgPSBkZXZpY2VfZ2V0X2l2YXJzKHJlcWRldik7CisJaW50IGVy
cjsKKwl1aW50MzJfdCBjY2NyX2FkcjsKKwl1aW50OF90IGRhdGFbMl07CisJCisJLyogYmxv
Y2sgc2l6ZSBpcyAxNi1iaXQgaW4gbGl0dGxlIGVuZGlhbiBvcmRlciAqLworCWRhdGFbMF0g
PSAoc2l6ZSAmIDB4ZmYpOworCWRhdGFbMV0gPSAoKHNpemUgPj4gOCkgJiAweGZmKTsKKwkK
KwljY2NyX2FkciA9IChpdmFyLT5mbiAqIDB4MTAwKSArIFNEX0lPX0NDQ1JfRk4wX0JMS1NJ
WjsKKworCWVyciA9IHNkaW9fcndfZGlyZWN0KHNjLCAxLCAwLCBjY2NyX2FkciwgJmRhdGFb
MF0pOworCWlmIChlcnIgIT0gTU1DX0VSUl9OT05FKQorCQlyZXR1cm4gKGVycik7CisJCisJ
ZXJyID0gc2Rpb19yd19kaXJlY3Qoc2MsIDEsIDAsIGNjY3JfYWRyICsgMSwgJmRhdGFbMV0p
OworCWlmIChlcnIgIT0gTU1DX0VSUl9OT05FKQorCQlyZXR1cm4gKGVycik7CisJCisJaXZh
ci0+YmxrX3N6ID0gc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbW1jX2lv
X2R1bXBfY2NjcihzdHJ1Y3Qgc2Rpb19zb2Z0YyAqc2MpCit7CisJdWludDhfdCBidWZbMTAy
NF07CisJdWludDhfdCAqY2NjcjsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGludCBpLCBqOwor
CQorCQorCWNjY3IgPSAodWludDhfdCopICgoKHVuc2lnbmVkIGludCkmYnVmWzBdICsgNTEy
KSAmIH4weGZmKTsKKworCWZvciAoaiA9IDA7IGogPCA3OyBqKyspIHsKKwkJZXJyID0gc2Rp
b19yd19leHRlbmRlZChzYywgMCwgMSwgMCwgKDB4MTAwICogaiksIGNjY3IsIDUxMiwgMCk7
CisJCWlmIChlcnIgPT0gTU1DX0VSUl9OT05FKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgMzI7
IGkrKykgeworCQkJCXByaW50ZigiW0NDQ1JdIDB4JTAyeCA6ICVkJWQlZCVkJWQlZCVkJWRc
biIsICgoMHgxMDAgKiBqKSArIGkpLAorCQkJCQkgICAoY2NjcltpXSA+PiA3KSAmIDB4MSwK
KwkJCQkJICAgKGNjY3JbaV0gPj4gNikgJiAweDEsCisJCQkJCSAgIChjY2NyW2ldID4+IDUp
ICYgMHgxLAorCQkJCQkgICAoY2NjcltpXSA+PiA0KSAmIDB4MSwKKwkJCQkJICAgKGNjY3Jb
aV0gPj4gMykgJiAweDEsCisJCQkJCSAgIChjY2NyW2ldID4+IDIpICYgMHgxLAorCQkJCQkg
ICAoY2NjcltpXSA+PiAxKSAmIDB4MSwKKwkJCQkJICAgKGNjY3JbaV0gPj4gMCkgJiAweDEp
OworCQkJfQorCQl9CisJfQorCQorCXJldHVybiAoZXJyKTsKK30KKworCisKKy8qKgorICoJ
c2Rpb19mdW5jdGlvbl9kaXNhYmxlIC0gZW5hYmxlcyBhIGdpdmVuIGZ1bmN0aW9uIAorICoJ
QHNjOiBpMmMgZHJpdmVyIGNvbnRleHQKKyAqCUBmbGFnczogdGhlIGV2ZW50KHMpIHRvIHdh
aXQgb24sIHRoaXMgaXMgYSBiaXRtYXNrIG9mIHRoZSBJMkNfU1RBVF8/Pz8gZmxhZ3MKKyAq
CUBzdGF0cDogaWYgbm90IG51bGwgd2lsbCBjb250YWluIHRoZSBzdGF0dXMgZmxhZ3MgdXBv
biByZXR1cm4KKyAqCUB0aW1vOiB0aGUgbnVtYmVyIG9mIHRpY2tzIHRvIHdhaXQKKyAqCisg
KglTY2FucyB0aGUgU0RJTyBjYXJkIGFuZCBnZXRzIHRoZSBmdW5jdGlvbnMgLi4uCisgKgor
ICoJUkVUVVJOUzoKKyAqCU1NQ19FUlJfTk9ORSBpZiBzdWNjZXNzaWZ1bAorICovCitzdGF0
aWMgaW50CitzZGlvX2Z1bmN0aW9uX2Rpc2FibGUoZGV2aWNlX3QgZGV2LCBpbnQgZm4pCit7
CisJc3RydWN0IHNkaW9fc29mdGMgKnNjID0gZGV2aWNlX2dldF9zb2Z0YyhkZXYpOworCWlu
dCBlcnI7CisJdWludDhfdCBpb2U7CisKKwllcnIgPSBzZGlvX3J3X2RpcmVjdChzYywgMCwg
MCwgU0RfSU9fQ0NDUl9GTl9FTkFCTEUsICZpb2UpOworCWlmIChlcnIgIT0gTU1DX0VSUl9O
T05FKQorCQlyZXR1cm4gKGVycik7CisJCisJaW9lICY9IH4oMHgxIDw8IGZuKTsKKwkKKwll
cnIgPSBzZGlvX3J3X2RpcmVjdChzYywgMSwgMCwgU0RfSU9fQ0NDUl9GTl9FTkFCTEUsICZp
b2UpOworCWlmIChlcnIgIT0gTU1DX0VSUl9OT05FKQorCQlyZXR1cm4gKGVycik7CisKKwly
ZXR1cm4gKDApOworfQorCisvKioKKyAqCXNkaW9fZnVuY3Rpb25fZW5hYmxlIC0gZW5hYmxl
cyBhIGdpdmVuIGZ1bmN0aW9uIAorICoJQHNjOiBpMmMgZHJpdmVyIGNvbnRleHQKKyAqCUBm
bGFnczogdGhlIGV2ZW50KHMpIHRvIHdhaXQgb24sIHRoaXMgaXMgYSBiaXRtYXNrIG9mIHRo
ZSBJMkNfU1RBVF8/Pz8gZmxhZ3MKKyAqCUBzdGF0cDogaWYgbm90IG51bGwgd2lsbCBjb250
YWluIHRoZSBzdGF0dXMgZmxhZ3MgdXBvbiByZXR1cm4KKyAqCUB0aW1vOiB0aGUgbnVtYmVy
IG9mIHRpY2tzIHRvIHdhaXQKKyAqCisgKglTY2FucyB0aGUgU0RJTyBjYXJkIGFuZCBnZXRz
IHRoZSBmdW5jdGlvbnMgLi4uCisgKgorICoJUkVUVVJOUzoKKyAqCU1NQ19FUlJfTk9ORSBp
ZiBzdWNjZXNzaWZ1bAorICovCitzdGF0aWMgaW50CitzZGlvX2Z1bmN0aW9uX2VuYWJsZShk
ZXZpY2VfdCBkZXYsIGludCBmbiwgdW5zaWduZWQgbG9uZyB0aW1lb3V0X21zKQoreworCWlu
dCBlcnI7CisJc3RydWN0IHNkaW9fc29mdGMgKnNjID0gZGV2aWNlX2dldF9zb2Z0YyhkZXYp
OworCXVuc2lnbmVkIGxvbmcgZWxhcHNlZF9tczsKKwl1bnNpZ25lZCBpbnQgdGlja3NfMTBt
czsKKwl1aW50OF90IGlvZTsKKwl1aW50OF90IGlvcjsKKworZGV2aWNlX3ByaW50ZihkZXYs
ICJzZGlvX2Z1bmN0aW9uX2VuYWJsZSA6IGZuICVkIDogdGltZW91dF9tcyA9ICVsdVxuIiwg
Zm4sIHRpbWVvdXRfbXMpOworCS8qIHNldCB0aGUgZW5hYmxlIGJpdCAqLworCWVyciA9IHNk
aW9fcndfZGlyZWN0KHNjLCAwLCAwLCBTRF9JT19DQ0NSX0ZOX0VOQUJMRSwgJmlvZSk7CisJ
aWYgKGVyciAhPSBNTUNfRVJSX05PTkUpCisJCXJldHVybiAoZXJyKTsKKwkKKwlpb2UgfD0g
KDB4MSA8PCBmbik7CisJCisJZXJyID0gc2Rpb19yd19kaXJlY3Qoc2MsIDEsIDAsIFNEX0lP
X0NDQ1JfRk5fRU5BQkxFLCAmaW9lKTsKKwlpZiAoZXJyICE9IE1NQ19FUlJfTk9ORSkKKwkJ
cmV0dXJuIChlcnIpOworCQorCXRpY2tzXzEwbXMgPSAoaHogLyAxMDApOworCWlmICghdGlj
a3NfMTBtcykKKwkJdGlja3NfMTBtcyA9IDE7CisJCisJLyogcG9sbCBvbiB0aGUgcmVhZHkg
Yml0ICovCisJZWxhcHNlZF9tcyA9IDA7CisJZG8geworCQlwYXVzZSgic2Rpb19mbl9lbiIs
IHRpY2tzXzEwbXMpOworCQllbGFwc2VkX21zICs9IDEwOworCQorCQllcnIgPSBzZGlvX3J3
X2RpcmVjdChzYywgMCwgMCwgU0RfSU9fQ0NDUl9GTl9JT1JFQURZLCAmaW9yKTsKK2Rldmlj
ZV9wcmludGYoZGV2LCAic2Rpb19mdW5jdGlvbl9lbmFibGUgOiBlcnIgPSAlZCA6IGVsYXBz
ZWRfbXMgPSAlbHUgOiBpb3IgMHglMDJ4XG4iLCBlcnIsIGVsYXBzZWRfbXMsIGlvcik7CisJ
CWlmIChlcnIgIT0gTU1DX0VSUl9OT05FKQorCQkJcmV0dXJuIChlcnIpOworCisJfSB3aGls
ZSAoIShpb3IgJiAoMHgxIDw8IGZuKSkgJiYgKGVsYXBzZWRfbXMgPCB0aW1lb3V0X21zKSk7
CisJCisJaWYgKCEoaW9yICYgKDB4MSA8PCBmbikpKQorCQlyZXR1cm4gKE1NQ19FUlJfVElN
RU9VVCk7CisJCQorCXJldHVybiAoMCk7Cit9CisKKworLyoqCisgKglzZGlvX3Byb2JlX2Fu
ZF9hdHRhY2hfY2hpbGQgLSBsb29wcyBvdmVyIHRoZSAKKyAqCUBzYzogaTJjIGRyaXZlciBj
b250ZXh0CisgKglAZmxhZ3M6IHRoZSBldmVudChzKSB0byB3YWl0IG9uLCB0aGlzIGlzIGEg
Yml0bWFzayBvZiB0aGUgSTJDX1NUQVRfPz8/IGZsYWdzCisgKglAc3RhdHA6IGlmIG5vdCBu
dWxsIHdpbGwgY29udGFpbiB0aGUgc3RhdHVzIGZsYWdzIHVwb24gcmV0dXJuCisgKglAdGlt
bzogdGhlIG51bWJlciBvZiB0aWNrcyB0byB3YWl0CisgKgorICoJU2NhbnMgdGhlIFNESU8g
Y2FyZCBhbmQgZ2V0cyB0aGUgZnVuY3Rpb25zIC4uLgorICoKKyAqCVJFVFVSTlM6CisgKglN
TUNfRVJSX05PTkUgaWYgc3VjY2Vzc2lmdWwKKyAqLworc3RhdGljIGludAorc2Rpb19wcm9i
ZV9hbmRfYXR0YWNoX2NoaWxkKGRldmljZV90IGRldiwgZGV2aWNlX3QgY2hpbGQsIGludCBm
biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc2Rpb19jaXMg
KmNpcykKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBzZGlvX3NvZnRjICpzYyA9IGRldmljZV9n
ZXRfc29mdGMoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXRfbXM7CisKKworCWVyciA9
IGRldmljZV9wcm9iZShjaGlsZCk7CisJaWYgKGVyciAhPSAwKQorCQlnb3RvIG91dDsKKwkK
Kwl0aW1lb3V0X21zID0gY2lzLT5mdW5jZS5mbnMuc3RhcnR1cF90aW1lb3V0X21zOworCWlm
ICh0aW1lb3V0X21zIDwgMTAwKQorCQl0aW1lb3V0X21zID0gMTAwMDsKKworCWlmIChzZGlv
X2Z1bmN0aW9uX2VuYWJsZShkZXYsIGZuLCB0aW1lb3V0X21zKSA9PSAwICYmCisJICAgIGRl
dmljZV9hdHRhY2goY2hpbGQpID09IDApIHsKKwkJZGV2aWNlX3ByaW50ZihkZXYsICJmdW5j
dGlvbiAlZCBcbiIsIGZuKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJZXJyID0gRU5YSU87CisK
K291dDo7CisJc2Rpb19mdW5jdGlvbl9kaXNhYmxlKGRldiwgZm4pOworCXJldHVybiBlcnI7
Cit9CisKKworLyoqCisgKglzZGlvX3NjYW5fZnVuY3MgLSBsb29wcyBvdmVyIHRoZSAKKyAq
CUBzYzogaTJjIGRyaXZlciBjb250ZXh0CisgKglAZmxhZ3M6IHRoZSBldmVudChzKSB0byB3
YWl0IG9uLCB0aGlzIGlzIGEgYml0bWFzayBvZiB0aGUgSTJDX1NUQVRfPz8/IGZsYWdzCisg
KglAc3RhdHA6IGlmIG5vdCBudWxsIHdpbGwgY29udGFpbiB0aGUgc3RhdHVzIGZsYWdzIHVw
b24gcmV0dXJuCisgKglAdGltbzogdGhlIG51bWJlciBvZiB0aWNrcyB0byB3YWl0CisgKgor
ICoJU2NhbnMgdGhlIFNESU8gY2FyZCBhbmQgZ2V0cyB0aGUgZnVuY3Rpb25zIC4uLgorICoK
KyAqCVJFVFVSTlM6CisgKglNTUNfRVJSX05PTkUgaWYgc3VjY2Vzc2lmdWwKKyAqLworc3Rh
dGljIGludAorc2Rpb19zY2FuX2Z1bmNzKHN0cnVjdCBzZGlvX3NvZnRjICpzYykKK3sKKwlk
ZXZpY2VfdCBkZXYgPSBzYy0+ZGV2OworCWludCBlcnI7CisJaW50IGZuOworCXVpbnQ4X3Qg
dmFsWzRdOworCXVpbnQzMl90IGNpc3B0cjsKKwlzdHJ1Y3Qgc2Rpb19jaXMgY2lzOworCXN0
cnVjdCBzZGlvX2l2YXJzICppdmFyID0gTlVMTDsKKwlkZXZpY2VfdCBjaGlsZDsKKworCS8q
IFJlYWQgdGhlIENDQ1IgcmVnaXN0ZXJzICovCisJZXJyID0gc2Rpb19yd19kaXJlY3Qoc2Ms
IDAsIDAsIFNEX0lPX0NDQ1JfQ0NDUl9TRElPX1JFViwgdmFsKTsKKwlpZiAoZXJyICE9IE1N
Q19FUlJfTk9ORSkKKwkJZ290byBkb25lOworCXNjLT5jY2NyX3JldiA9IHZhbFswXSAmIDB4
ZjsKKwlzYy0+c2Rpb19yZXYgPSAodmFsWzBdID4+IDQpICYgMHhmOworCQorCQorCS8qIFJl
YWQgdGhlIGNhcmQncyBjYXBhYmxpdGllcyAqLworCWVyciA9IHNkaW9fcndfZGlyZWN0KHNj
LCAwLCAwLCBTRF9JT19DQ0NSX0NBUEFCSUxJVFksIHZhbCk7CisJaWYgKGVyciAhPSBNTUNf
RVJSX05PTkUpCisJCWdvdG8gZG9uZTsKKwlpZiAodmFsWzBdICYgQ0NDUl9DQVBTX1NNQikK
KwkJc2MtPmZsYWdzIHw9IFNESU9fRkxBR19TVVBQT1JUX01VTFRJX0JMT0NLOworCQorCQor
CQorCS8qIEZpcnN0IG9mZiByZWFkIHRoZSBjb21tb24gQ0lTIGFyZWEgKi8KKwllcnIgPSBz
ZGlvX3J3X2V4dGVuZGVkKHNjLCAwLCAxLCAwLCBTRF9JT19DQ0NSX0NJU1BUUiwgdmFsLCA0
LCAwKTsKKwlpZiAoZXJyICE9IE1NQ19FUlJfTk9ORSkKKwkJZ290byBkb25lOworCWNpc3B0
ciA9IHZhbFswXSB8ICgodWludDMyX3QpdmFsWzFdIDw8IDgpIHwgKCh1aW50MzJfdCl2YWxb
Ml0gPDwgOCk7CisKKwlzZGlvX2Npc19yZWFkKGRldiwgY2lzcHRyLCAmY2lzKTsKKwlzZGlv
X2Npc19wcmludChkZXYsICZjaXMpOworCisJc2MtPnZlbmRvcl9pZCA9IGNpcy5tYW51ZmFj
dHVyZXI7CisJc2MtPnByb2R1Y3RfaWQgPSBjaXMucHJvZHVjdDsKKwkKKworCS8qIE5leHQg
dGhlIGluZGl2aWR1YWwgZnVuY3Rpb25zICovCisJZm9yIChmbiA9IDE7IGZuIDw9IHNjLT5u
dW1fZnVuY3M7IGZuKyspIHsKKwkJLyogUmVhZCB0aGUgZnVuY3Rpb24gYmFzaWMgcmVnaXN0
ZXJzIHRvIGdldCB0aGUgQ0lTIHBvaW50ZXIgKi8KKwkJZXJyID0gc2Rpb19yd19leHRlbmRl
ZChzYywgMCwgMSwgMCwKKwkJCSgoU0RfSU9fRkJSX1NJWkUgKiBmbikgKyBTRF9JT19DQ0NS
X0NJU1BUUiksIHZhbCwgNCwgMCk7CisJCWlmIChlcnIgIT0gTU1DX0VSUl9OT05FKQorCQkJ
Y29udGludWU7CisJCQorCQljaXNwdHIgPSB2YWxbMF0gfCAoKHVpbnQzMl90KXZhbFsxXSA8
PCA4KSB8ICgodWludDMyX3QpdmFsWzJdIDw8IDgpOworCisJCXNkaW9fY2lzX3JlYWQoZGV2
LCBjaXNwdHIsICZjaXMpOworCQlzZGlvX2Npc19wcmludChkZXYsICZjaXMpOworCQkKKwkJ
aXZhciA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHNkaW9faXZhcnMpLCBNX0RFVkJVRiwgTV9X
QUlUT0sgfCBNX1pFUk8pOworCQlpdmFyLT5mbiA9IGZuOworCQlpdmFyLT5ibGtfc3ogPSAw
OworCisJCS8qIEFkZCBkZXZpY2UuICovCisJCWNoaWxkID0gZGV2aWNlX2FkZF9jaGlsZChk
ZXYsIE5VTEwsIC0xKTsKKwkJZGV2aWNlX3NldF9pdmFycyhjaGlsZCwgaXZhcik7CisJCXNk
aW9fcHJvYmVfYW5kX2F0dGFjaF9jaGlsZChkZXYsIGNoaWxkLCBmbiwgJmNpcyk7CisJfQor
CQorZG9uZToKKwlyZXR1cm4gKGVycik7Cit9CisKKworCitzdGF0aWMgaW50CitzZGlvX3By
b2JlKGRldmljZV90IGRldikKK3sKKworLy8JZGV2aWNlX3F1aWV0KGRldik7CisJZGV2aWNl
X3NldF9kZXNjKGRldiwgIlNESU8gQ2FyZCIpOworCXJldHVybiAoMCk7Cit9CisKKy8qKgor
ICoJc2Rpb19hdHRhY2ggLSByZWFkcyBvciB3cml0ZXMgbXVsdGlwbGUgYnl0ZXMKKyAqCUBz
YzogaTJjIGRyaXZlciBjb250ZXh0CisgKglAZmxhZ3M6IHRoZSBldmVudChzKSB0byB3YWl0
IG9uLCB0aGlzIGlzIGEgYml0bWFzayBvZiB0aGUgSTJDX1NUQVRfPz8/IGZsYWdzCisgKglA
c3RhdHA6IGlmIG5vdCBudWxsIHdpbGwgY29udGFpbiB0aGUgc3RhdHVzIGZsYWdzIHVwb24g
cmV0dXJuCisgKglAdGltbzogdGhlIG51bWJlciBvZiB0aWNrcyB0byB3YWl0CisgKgorICoJ
CisgKgorICoJUkVUVVJOUzoKKyAqCU1NQ19FUlJfTk9ORSBpZiBzdWNjZXNzaWZ1bAorICov
CitzdGF0aWMgaW50CitzZGlvX2F0dGFjaChkZXZpY2VfdCBkZXYpCit7CisJc3RydWN0IHNk
aW9fc29mdGMgKnNjOworCisJc2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7CisJc2MtPmRl
diA9IGRldjsKKwlTRElPX0xPQ0tfSU5JVChzYyk7CisKKwlkZXZpY2VfcHJpbnRmKGRldiwg
IlNESU8gQ2FyZCB3aXRoICVkIEZ1bmN0aW9ucyBhdCAlcyAlZE1Iei8lZGJpdFxuIiwKKwkg
ICAgICAgICAgICAgIG1tY19nZXRfaW9fZnVuY3Rpb25zKGRldiksCisJICAgICAgICAgICAg
ICBkZXZpY2VfZ2V0X25hbWV1bml0KGRldmljZV9nZXRfcGFyZW50KGRldikpLAorCSAgICAg
ICAgICAgICAgbW1jX2dldF90cmFuX3NwZWVkKGRldikgLyAxMDAwMDAwLAorCSAgICAgICAg
ICAgICAgKG1tY19nZXRfYnVzX3dpZHRoKGRldikgPT0gYnVzX3dpZHRoXzEpID8gMSA6IDQp
OworCisJc2MtPm51bV9mdW5jcyA9IG1tY19nZXRfaW9fZnVuY3Rpb25zKGRldik7CisKKwlz
ZGlvX3NjYW5fZnVuY3Moc2MpOworCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAor
c2Rpb19kZXRhY2goZGV2aWNlX3QgZGV2KQoreworCXN0cnVjdCBzZGlvX3NvZnRjICpzYyA9
IGRldmljZV9nZXRfc29mdGMoZGV2KTsKKworCVNESU9fTE9DSyhzYyk7CisjaWYgMAorCXNj
LT5zdXNwZW5kID0gMDsKKwlpZiAoc2MtPnJ1bm5pbmcgPiAwKSB7CisJCS8qIGtpbGwgdGhy
ZWFkICovCisJCXNjLT5ydW5uaW5nID0gMDsKKwkJd2FrZXVwKHNjKTsKKwkJLyogd2FpdCBm
b3IgdGhyZWFkIHRvIGZpbmlzaC4gKi8KKwkJd2hpbGUgKHNjLT5ydW5uaW5nICE9IC0xKQor
CQkJbXNsZWVwKHNjLCAmc2MtPnNjX210eCwgMCwgImRldGFjaCIsIDApOworCX0KKyNlbmRp
ZgorCVNESU9fVU5MT0NLKHNjKTsKKworCisJU0RJT19MT0NLX0RFU1RST1koc2MpOworCisJ
cmV0dXJuICgwKTsKK30KKworCitzdGF0aWMgaW50CitzZGlvX2FjcXVpcmVfYnVzKGRldmlj
ZV90IGNhcmRkZXYsIGRldmljZV90IHJlcWRldikKK3sKKwlNTUNCVVNfQUNRVUlSRV9CVVMo
ZGV2aWNlX2dldF9wYXJlbnQoY2FyZGRldiksIGNhcmRkZXYpOworCXJldHVybiAoMCk7Cit9
CisKK3N0YXRpYyBpbnQKK3NkaW9fcmVsZWFzZV9idXMoZGV2aWNlX3QgY2FyZGRldiwgZGV2
aWNlX3QgcmVxZGV2KQoreworCU1NQ0JVU19SRUxFQVNFX0JVUyhkZXZpY2VfZ2V0X3BhcmVu
dChjYXJkZGV2KSwgY2FyZGRldik7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAor
c2Rpb19yZWFkX2l2YXIoZGV2aWNlX3QgYnVzLCBkZXZpY2VfdCBjaGlsZCwgaW50IHdoaWNo
LCB1aW50cHRyX3QgKnJlc3VsdCkKK3sKKwlzdHJ1Y3Qgc2Rpb19pdmFycyAqaXZhciA9IGRl
dmljZV9nZXRfaXZhcnMoY2hpbGQpOworCXN0cnVjdCBzZGlvX3NvZnRjICpzYyA9IGRldmlj
ZV9nZXRfc29mdGMoYnVzKTsKKworCXN3aXRjaCAod2hpY2gpIHsKKwlkZWZhdWx0OgorCQly
ZXR1cm4gKEVJTlZBTCk7CisJY2FzZSBTRElPX0lWQVJfVkVORE9SOgorCQkqKHVuc2lnbmVk
IGludCAqKXJlc3VsdCA9IHNjLT52ZW5kb3JfaWQ7CisJCWJyZWFrOworCWNhc2UgU0RJT19J
VkFSX1BST0RVQ1Q6CisJCSoodW5zaWduZWQgaW50ICopcmVzdWx0ID0gc2MtPnByb2R1Y3Rf
aWQ7CisJCWJyZWFrOworCWNhc2UgU0RJT19JVkFSX0ZVTkNUSU9OX05VTUJFUjoKKwkJKih1
bnNpZ25lZCBpbnQgKilyZXN1bHQgPSBpdmFyLT5mbjsKKwkJYnJlYWs7CisJY2FzZSBTRElP
X0lWQVJfQkxPQ0tfU0laRToKKwkJKih1bnNpZ25lZCBpbnQgKilyZXN1bHQgPSBpdmFyLT5i
bGtfc3o7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50Citz
ZGlvX3dyaXRlX2l2YXIoZGV2aWNlX3QgYnVzLCBkZXZpY2VfdCBjaGlsZCwgaW50IHdoaWNo
LCB1aW50cHRyX3QgdmFsdWUpCit7CisJLyoKKwkgKiBOb25lIGFyZSB3cml0YWJsZSBBVE0K
KwkgKi8KKwlyZXR1cm4gKEVJTlZBTCk7Cit9CisKKworCitzdGF0aWMgZGV2aWNlX21ldGhv
ZF90IHNkaW9fbWV0aG9kc1tdID0geworCURFVk1FVEhPRChkZXZpY2VfcHJvYmUsIHNkaW9f
cHJvYmUpLAorCURFVk1FVEhPRChkZXZpY2VfYXR0YWNoLCBzZGlvX2F0dGFjaCksCisJREVW
TUVUSE9EKGRldmljZV9kZXRhY2gsIHNkaW9fZGV0YWNoKSwKKworCS8qIEJ1cyBpbnRlcmZh
Y2UgKi8KKwlERVZNRVRIT0QoYnVzX3JlYWRfaXZhciwgc2Rpb19yZWFkX2l2YXIpLAorCURF
Vk1FVEhPRChidXNfd3JpdGVfaXZhciwgc2Rpb193cml0ZV9pdmFyKSwKKworCS8qIFNESU8g
aW50ZXJmYWNlICovCisJREVWTUVUSE9EKHNkaW9fYWNxdWlyZV9jYXJkLCBzZGlvX2FjcXVp
cmVfYnVzKSwKKwlERVZNRVRIT0Qoc2Rpb19yZWxlYXNlX2NhcmQsIHNkaW9fcmVsZWFzZV9i
dXMpLAorCURFVk1FVEhPRChzZGlvX3NldF9ibG9ja19zaXplLCBzZGlvX3NldF9ibGtfc3op
LAorCisJREVWTUVUSE9EKHNkaW9fZnVuYzBfcmVhZF8xLCBzZGlvX2YwX3JlYWRiKSwKKwlE
RVZNRVRIT0Qoc2Rpb19mdW5jMF93cml0ZV8xLCBzZGlvX2YwX3dyaXRlYiksCisJREVWTUVU
SE9EKHNkaW9fcmVhZF8xLCBzZGlvX3JlYWRiKSwKKwlERVZNRVRIT0Qoc2Rpb19yZWFkXzIs
IHNkaW9fcmVhZHMpLAorCURFVk1FVEhPRChzZGlvX3JlYWRfNCwgc2Rpb19yZWFkbCksCisJ
REVWTUVUSE9EKHNkaW9fd3JpdGVfMSwgc2Rpb193cml0ZWIpLAorCURFVk1FVEhPRChzZGlv
X3dyaXRlXzIsIHNkaW9fd3JpdGVzKSwKKwlERVZNRVRIT0Qoc2Rpb193cml0ZV80LCBzZGlv
X3dyaXRlbCksCisJREVWTUVUSE9EKHNkaW9fcmVhZF9tdWx0aSwgc2Rpb19tZW1jcHlfZnJv
bSksCisJREVWTUVUSE9EKHNkaW9fcmVhZF9zdHJlYW1fbXVsdGksIHNkaW9fc3RyZWFtX2Zy
b20pLAorCURFVk1FVEhPRChzZGlvX3dyaXRlX211bHRpLCBzZGlvX21lbWNweV90byksCisJ
REVWTUVUSE9EKHNkaW9fd3JpdGVfc3RyZWFtX211bHRpLCBzZGlvX3N0cmVhbV90byksCisJ
CisvLwlERVZNRVRIT0Qoc2Rpb19zZXR1cF9pbnRyLCBtbWNfc2Rpb19zZXR1cF9pbnRyKSwK
Ky8vCURFVk1FVEhPRChzZGlvX3RlYXJkb3duX2ludHIsIG1tY19zZGlvX3RlYXJkb3duX2lu
dHIpLAorCisJezAsIDB9LAorfTsKKworc3RhdGljIGRyaXZlcl90IHNkaW9fZHJpdmVyID0g
eworCSJzZGlvIiwKKwlzZGlvX21ldGhvZHMsCisJc2l6ZW9mKHN0cnVjdCBzZGlvX3NvZnRj
KSwKK307CitzdGF0aWMgZGV2Y2xhc3NfdCBzZGlvX2RldmNsYXNzOworCitEUklWRVJfTU9E
VUxFKHNkaW8sIG1tYywgc2Rpb19kcml2ZXIsIHNkaW9fZGV2Y2xhc3MsIDAsIDApOwotLS0g
L2Rldi9udWxsCTIwMTItMDYtMDEgMTY6NTg6MzQuMDAwMDAwMDAwICswMTAwCisrKyBzZGlv
LmgJMjAxMi0wNi0wMSAxNzoyODo0MC4wMDAwMDAwMDAgKzAxMDAKQEAgLTAsMCArMSwxMTEg
QEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDExIEJlbiBHcmF5LiAgQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBB
TlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogUG9ydGlvbnMg
b2YgdGhpcyBzb2Z0d2FyZSBtYXkgaGF2ZSBiZWVuIGRldmVsb3BlZCB3aXRoIHJlZmVyZW5j
ZSB0bworICogdGhlIFNEIFNpbXBsaWZpZWQgU3BlY2lmaWNhdGlvbi4gIFRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBtYXkgYXBwbHk6CisgKgorICogVGhlIGZvbGxvd2luZyBjb25kaXRp
b25zIGFwcGx5IHRvIHRoZSByZWxlYXNlIG9mIHRoZSBzaW1wbGlmaWVkCisgKiBzcGVjaWZp
Y2F0aW9uICgiU2ltcGxpZmllZCBTcGVjaWZpY2F0aW9uIikgYnkgdGhlIFNEIENhcmQgQXNz
b2NpYXRpb24gYW5kCisgKiB0aGUgU0QgR3JvdXAuIFRoZSBTaW1wbGlmaWVkIFNwZWNpZmlj
YXRpb24gaXMgYSBzdWJzZXQgb2YgdGhlIGNvbXBsZXRlIFNECisgKiBTcGVjaWZpY2F0aW9u
IHdoaWNoIGlzIG93bmVkIGJ5IHRoZSBTRCBDYXJkIEFzc29jaWF0aW9uIGFuZCB0aGUgU0QK
KyAqIEdyb3VwLiBUaGlzIFNpbXBsaWZpZWQgU3BlY2lmaWNhdGlvbiBpcyBwcm92aWRlZCBv
biBhIG5vbi1jb25maWRlbnRpYWwKKyAqIGJhc2lzIHN1YmplY3QgdG8gdGhlIGRpc2NsYWlt
ZXJzIGJlbG93LiBBbnkgaW1wbGVtZW50YXRpb24gb2YgdGhlCisgKiBTaW1wbGlmaWVkIFNw
ZWNpZmljYXRpb24gbWF5IHJlcXVpcmUgYSBsaWNlbnNlIGZyb20gdGhlIFNEIENhcmQKKyAq
IEFzc29jaWF0aW9uLCBTRCBHcm91cCwgU0QtM0MgTExDIG9yIG90aGVyIHRoaXJkIHBhcnRp
ZXMuCisgKgorICogRGlzY2xhaW1lcnM6CisgKgorICogVGhlIGluZm9ybWF0aW9uIGNvbnRh
aW5lZCBpbiB0aGUgU2ltcGxpZmllZCBTcGVjaWZpY2F0aW9uIGlzIHByZXNlbnRlZCBvbmx5
CisgKiBhcyBhIHN0YW5kYXJkIHNwZWNpZmljYXRpb24gZm9yIFNEIENhcmRzIGFuZCBTRCBI
b3N0L0FuY2lsbGFyeSBwcm9kdWN0cyBhbmQKKyAqIGlzIHByb3ZpZGVkICJBUy1JUyIgd2l0
aG91dCBhbnkgcmVwcmVzZW50YXRpb25zIG9yIHdhcnJhbnRpZXMgb2YgYW55CisgKiBraW5k
LiBObyByZXNwb25zaWJpbGl0eSBpcyBhc3N1bWVkIGJ5IHRoZSBTRCBHcm91cCwgU0QtM0Mg
TExDIG9yIHRoZSBTRAorICogQ2FyZCBBc3NvY2lhdGlvbiBmb3IgYW55IGRhbWFnZXMsIGFu
eSBpbmZyaW5nZW1lbnRzIG9mIHBhdGVudHMgb3Igb3RoZXIKKyAqIHJpZ2h0IG9mIHRoZSBT
RCBHcm91cCwgU0QtM0MgTExDLCB0aGUgU0QgQ2FyZCBBc3NvY2lhdGlvbiBvciBhbnkgdGhp
cmQKKyAqIHBhcnRpZXMsIHdoaWNoIG1heSByZXN1bHQgZnJvbSBpdHMgdXNlLiBObyBsaWNl
bnNlIGlzIGdyYW50ZWQgYnkKKyAqIGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndp
c2UgdW5kZXIgYW55IHBhdGVudCBvciBvdGhlciByaWdodHMgb2YgdGhlCisgKiBTRCBHcm91
cCwgU0QtM0MgTExDLCB0aGUgU0QgQ2FyZCBBc3NvY2lhdGlvbiBvciBhbnkgdGhpcmQgcGFy
dHkuIE5vdGhpbmcKKyAqIGhlcmVpbiBzaGFsbCBiZSBjb25zdHJ1ZWQgYXMgYW4gb2JsaWdh
dGlvbiBieSB0aGUgU0QgR3JvdXAsIHRoZSBTRC0zQyBMTEMKKyAqIG9yIHRoZSBTRCBDYXJk
IEFzc29jaWF0aW9uIHRvIGRpc2Nsb3NlIG9yIGRpc3RyaWJ1dGUgYW55IHRlY2huaWNhbAor
ICogaW5mb3JtYXRpb24sIGtub3ctaG93IG9yIG90aGVyIGNvbmZpZGVudGlhbCBpbmZvcm1h
dGlvbiB0byBhbnkgdGhpcmQgcGFydHkuCisgKgorICogIiRGcmVlQlNEJCIKKyAqLworCisj
aWZuZGVmIERFVl9NTUNfU0RJT19ICisjZGVmaW5lIERFVl9NTUNfU0RJT19ICisKKworc3Ry
dWN0IHNkaW9fc29mdGM7CisKKworaW50CitzZGlvX3J3X2RpcmVjdChzdHJ1Y3Qgc2Rpb19z
b2Z0YyAqc2MsIGludCB3ciwgdWludDMyX3QgZm4sIHVpbnQzMl90IGFkciwKKyAgICB1aW50
OF90ICpkYXRhKTsKK2ludAorc2Rpb19yd19leHRlbmRlZChzdHJ1Y3Qgc2Rpb19zb2Z0YyAq
c2MsIGludCB3ciwgaW50IGluY3IsIHVpbnQzMl90IGZuLAorICAgIHVpbnQzMl90IGFkciwg
dWludDhfdCAqZGF0YXAsIHNpemVfdCBsZW4sIHVuc2lnbmVkIGJsa3MpOworCisKKworCisv
KgorICogRGVjb2RlZCBQQyBDYXJkIDE2IGJhc2VkIENhcmQgSW5mb3JtYXRpb24gU3RydWN0
dXJlIChDSVMpLAorICogcGVyIGNhcmQgKGZ1bmN0aW9uIDApIGFuZCBwZXIgZnVuY3Rpb24g
KDEgYW5kIGdyZWF0ZXIpLgorICovCitzdHJ1Y3Qgc2Rpb19jaXMgeworCXVpbnQxNl90CSBt
YW51ZmFjdHVyZXI7CisjZGVmaW5lIFNESU9fVkVORE9SX0lOVkFMSUQJIDB4ZmZmZgorCXVp
bnQxNl90CSBwcm9kdWN0OworI2RlZmluZSBTRElPX1BST0RVQ1RfSU5WQUxJRCAweGZmZmYK
KworCXVfY2hhcgkJIGNpczFfbWFqb3I7CisJdV9jaGFyCQkgY2lzMV9taW5vcjsKKworCXVu
aW9uIHsKKwkJc3RydWN0IHsKKwkJCXVpbnQxNl90IGJsa19zejsKKwkJCXVpbnQzMl90IG1h
eF9zcGQ7CisJCQorCQl9IGZuMDsKKwkKKwkJc3RydWN0IHsKKwkJCXVpbnQzMl90IHNlcmlh
bF9udW07CisJCQl1aW50MTZfdCBtYXhfYmxrX3N6OworCQkJdWludDMyX3Qgc3RhcnR1cF90
aW1lb3V0X21zOworCQkJCisJCQl1aW50MzJfdCBvcF9taW5fcHdyLCBvcF9hdmdfcHdyLCBv
cF9tYXhfcHdyOworCQkJdWludDMyX3Qgc2JfbWluX3B3ciwgc2JfYXZnX3B3ciwgc2JfbWF4
X3B3cjsKKwkJCXVpbnQzMl90IGhwX2F2Z19wd3IsIGhwX21heF9wd3I7CisJCQl1aW50MzJf
dCBscF9hdmdfcHdyLCBscF9tYXhfcHdyOworCQl9IGZuczsKKwl9IGZ1bmNlOworfTsKKwor
aW50CitzZGlvX2Npc19yZWFkKGRldmljZV90IGRldiwgdWludDMyX3QgY2lzcHRyLCBzdHJ1
Y3Qgc2Rpb19jaXMgKmNpcyk7Cit2b2lkCitzZGlvX2Npc19wcmludChkZXZpY2VfdCBkZXYs
IHN0cnVjdCBzZGlvX2NpcyAqY2lzKTsKKworCisKKyNlbmRpZgotLS0gL2Rldi9udWxsCTIw
MTItMDYtMDEgMTY6NTg6MzQuMDAwMDAwMDAwICswMTAwCisrKyBtbWNpb3JlZy5oCTIwMTIt
MDEtMTYgMTE6NDg6MzYuMDAwMDAwMDAwICswMDAwCkBAIC0wLDAgKzEsMTM2IEBACisvKgkk
TmV0QlNEOiBzZG1tY19pb3JlZy5oLHYgMS4yIDIwMTAvMTAvMDcgMTI6NDA6MzQga2l5b2hh
cmEgRXhwICQJKi8KKy8qCSRPcGVuQlNEOiBzZG1tY19pb3JlZy5oLHYgMS40IDIwMDcvMDYv
MDIgMDE6NDg6MzcgdXdlIEV4cCAkCSovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYg
VXdlIFN0dWVobGVyIDx1d2VAb3BlbmJzZC5vcmc+CisgKgorICogUGVybWlzc2lvbiB0byB1
c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55
CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHBy
b3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBl
cm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZU
V0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwg
V0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcg
QUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFO
WSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
T1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBV
U0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRS
QUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQg
T0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9G
IFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZglERVZfTU1DSU9SRUdfSAorI2RlZmlu
ZQlERVZfTU1DSU9SRUdfSAorCisvKiBTRElPIGNvbW1hbmRzICovCQkJCS8qIHJlc3BvbnNl
IHR5cGUgKi8KKyNkZWZpbmUgU0RfSU9fU0VORF9PUF9DT05ECQk1CS8qIFI0ICovCisjZGVm
aW5lIFNEX0lPX1JXX0RJUkVDVAkJCTUyCS8qIFI1ICovCisjZGVmaW5lIFNEX0lPX1JXX0VY
VEVOREVECQk1MwkvKiBSNT8gKi8KKworLyogQ01ENTIgYXJndW1lbnRzICovCisjZGVmaW5l
IFNEX0FSR19DTUQ1Ml9SRUFECQkoMDw8MzEpCisjZGVmaW5lIFNEX0FSR19DTUQ1Ml9XUklU
RQkJKDE8PDMxKQorI2RlZmluZSBTRF9BUkdfQ01ENTJfRlVOQ19TSElGVAkJMjgKKyNkZWZp
bmUgU0RfQVJHX0NNRDUyX0ZVTkNfTUFTSwkJMHg3CisjZGVmaW5lIFNEX0FSR19DTUQ1Ml9F
WENIQU5HRQkJKDE8PDI3KQorI2RlZmluZSBTRF9BUkdfQ01ENTJfUkVHX1NISUZUCQk5Cisj
ZGVmaW5lIFNEX0FSR19DTUQ1Ml9SRUdfTUFTSwkJMHgxZmZmZgorI2RlZmluZSBTRF9BUkdf
Q01ENTJfREFUQV9TSElGVAkJMAorI2RlZmluZSBTRF9BUkdfQ01ENTJfREFUQV9NQVNLCQkw
eGZmCisjZGVmaW5lIFNEX1I1X0RBVEEocmVzcCkJCSgocmVzcClbMF0gJiAweGZmKQorCisv
KiBDTUQ1MyBhcmd1bWVudHMgKi8KKyNkZWZpbmUgU0RfQVJHX0NNRDUzX1JFQUQJCSgwPDwz
MSkKKyNkZWZpbmUgU0RfQVJHX0NNRDUzX1dSSVRFCQkoMTw8MzEpCisjZGVmaW5lIFNEX0FS
R19DTUQ1M19GVU5DX1NISUZUCQkyOAorI2RlZmluZSBTRF9BUkdfQ01ENTNfRlVOQ19NQVNL
CQkweDcKKyNkZWZpbmUgU0RfQVJHX0NNRDUzX0JMT0NLX01PREUJCSgxPDwyNykKKyNkZWZp
bmUgU0RfQVJHX0NNRDUzX0lOQ1JFTUVOVAkJKDE8PDI2KQorI2RlZmluZSBTRF9BUkdfQ01E
NTNfUkVHX1NISUZUCQk5CisjZGVmaW5lIFNEX0FSR19DTUQ1M19SRUdfTUFTSwkJMHgxZmZm
ZgorI2RlZmluZSBTRF9BUkdfQ01ENTNfTEVOR1RIX1NISUZUCTAKKyNkZWZpbmUgU0RfQVJH
X0NNRDUzX0xFTkdUSF9NQVNLCTB4MWZmCisjZGVmaW5lIFNEX0FSR19DTUQ1M19MRU5HVEhf
TUFYCQk2NCAvKiBYWFggc2hvdWxkIGJlIDUxMT8gKi8KKworLyogNDgtYml0IHJlc3BvbnNl
IGRlY29kaW5nICgzMiBiaXRzIHcvbyBDUkMpICovCisjZGVmaW5lIE1NQ19SNChyZXNwKQkJ
CSgocmVzcClbMF0pCisjZGVmaW5lIE1NQ19SNShyZXNwKQkJCSgocmVzcClbMF0pCisKKy8q
IFNEIFI0IHJlc3BvbnNlIChJTyBPQ1IpICovCisjZGVmaW5lIFNEX0lPX09DUl9NRU1fUkVB
RFkJCSgxPDwzMSkKKyNkZWZpbmUgU0RfSU9fT0NSX05VTV9GVU5DVElPTlMob2NyKQkoKChv
Y3IpID4+IDI4KSAmIDB4NykKKyNkZWZpbmUgU0RfSU9fT0NSX01FTV9QUkVTRU5UCQkoMTw8
MjcpCisjZGVmaW5lIFNEX0lPX09DUl9NQVNLCQkJMHgwMGZmZmZmMAorCisvKiBDYXJkIENv
bW1vbiBDb250cm9sIFJlZ2lzdGVycyAoQ0NDUikgKi8KKyNkZWZpbmUgU0RfSU9fQ0NDUl9T
VEFSVAkJMHgwMDAwMAorI2RlZmluZSBTRF9JT19DQ0NSX1NJWkUJCQkweDEwMAorI2RlZmlu
ZSBTRF9JT19DQ0NSX0NDQ1JfU0RJT19SRVYJMHgwMAorI2RlZmluZSBTRF9JT19DQ0NSX0ND
Q1JfUkVWKHIpCQkoKHIpICYgMHhmKQorI2RlZmluZSAgQ0NDUl9DQ0NSX1JFVl8xXzAwCQkw
CisjZGVmaW5lICBDQ0NSX0NDQ1JfUkVWXzFfMTAJCTEKKyNkZWZpbmUgIENDQ1JfQ0NDUl9S
RVZfMV8yMAkJMgorI2RlZmluZSBTRF9JT19DQ0NSX1NESU9fUkVWKHIpCQkoKChyKSA+PiA0
KSAmIDB4ZikKKyNkZWZpbmUgIENDQ1JfU0RJT19SRVZfMV8wMAkJMAorI2RlZmluZSAgQ0ND
Ul9TRElPX1JFVl8xXzEwCQkxCisjZGVmaW5lICBDQ0NSX1NESU9fUkVWXzFfMjAJCTIJLyog
KHVucmVsZWFzZWQpICovCisjZGVmaW5lICBDQ0NSX1NESU9fUkVWXzJfMDAJCTMKKyNkZWZp
bmUgU0RfSU9fQ0NDUl9TUEVDX1JFVgkJMHgwMQorI2RlZmluZSBTRF9JT19DQ0NSX1NEX1BI
WVNfU1BFQ19WRVIocikJKChyKSAmIDB4ZikKKyNkZWZpbmUgIENDQ1JfU0RfUEhZU19TUEVD
X1ZFUl8xXzAxCTAKKyNkZWZpbmUgIENDQ1JfU0RfUEhZU19TUEVDX1ZFUl8xXzEwCTEKKyNk
ZWZpbmUgIENDQ1JfU0RfUEhZU19TUEVDX1ZFUl8yXzAwCTIKKyNkZWZpbmUgU0RfSU9fQ0ND
Ul9GTl9FTkFCTEUJCTB4MDIKKyNkZWZpbmUgU0RfSU9fQ0NDUl9GTl9JT1JFQURZCQkweDAz
CisjZGVmaW5lIFNEX0lPX0NDQ1JfRk5fSU5URU4JCTB4MDQKKyNkZWZpbmUgIENDQ1JfSU5U
RU5fSU5UTQkJKDE8PDApCisjZGVmaW5lIFNEX0lPX0NDQ1JfRk5fSU5UUEVORElORwkweDA1
CisjZGVmaW5lIFNEX0lPX0NDQ1JfQ1RMCQkJMHgwNgorI2RlZmluZSAgQ0NDUl9DVExfUkVT
CQkJKDE8PDMpCisjZGVmaW5lIFNEX0lPX0NDQ1JfQlVTX1dJRFRICQkweDA3CisjZGVmaW5l
ICBDQ0NSX0JVU19XSURUSF80CQkoMjw8MCkKKyNkZWZpbmUgIENDQ1JfQlVTX1dJRFRIXzEJ
CSgwPDwwKQorI2RlZmluZSAgQ0NDUl9CVVNfV0lEVEhfTUFTSwkoMzw8MCkKKyNkZWZpbmUg
U0RfSU9fQ0NDUl9DQVBBQklMSVRZCQkweDA4CisjZGVmaW5lICBDQ0NSX0NBUFNfU0RDCQkJ
KDE8PDApCisjZGVmaW5lICBDQ0NSX0NBUFNfU01CCQkJKDE8PDEpIC8qIE11bHRpLUJsb2Nr
IHN1cHBvcnQgKi8KKyNkZWZpbmUgIENDQ1JfQ0FQU19TUkIJCQkoMTw8MikgLyogUmVhZCBX
YWl0IHN1cHBvcnQgKi8KKyNkZWZpbmUgIENDQ1JfQ0FQU19TQlMJCQkoMTw8MykgLyogU3Vz
cGVuZC9SZXN1bWUgc3VwcG9ydCAqLworI2RlZmluZSAgQ0NDUl9DQVBTX1M0TUkJCQkoMTw8
NCkgLyogaW50ciBzdXBwb3J0IGluIDQtYml0IG1vZGUgKi8KKyNkZWZpbmUgIENDQ1JfQ0FQ
U19FNE1JCQkJKDE8PDUpIC8qIGVuYWJsZSBpbnRyIGluIDQtYml0IG1vZGUgKi8KKyNkZWZp
bmUgIENDQ1JfQ0FQU19MU0MJCQkoMTw8NikgLyogTG93IHNwZWVkIGNhcmQgKi8KKyNkZWZp
bmUgIENDQ1JfQ0FQU180QkxTCQkJKDE8PDcpIC8qIDQtYml0IHN1cHBvcnQgZm9yIGxvdyBz
cGVlZCAqLworI2RlZmluZSBTRF9JT19DQ0NSX0NJU1BUUgkJMHgwOSAvKiBYWFggOS0xMCwg
MTAtMTEsIG9yIDktMTIgKi8KKyNkZWZpbmUgU0RfSU9fQ0NDUl9CVVNfU1VTUEVORAkJMHgw
YworI2RlZmluZSBTRF9JT19DQ0NSX0ZVTkNfU0VMRUNUCQkweDBkCisjZGVmaW5lICBDQ0NS
X0ZVTkNfRlMocikJCSgocikgJiAweGYpCisjZGVmaW5lICBDQ0NSX0ZVTkNfRlNfRk4oZm4p
CQkoKGZuKSAmIDB4NykKKyNkZWZpbmUgIENDQ1JfRlVOQ19GU19NRU0JCTgKKyNkZWZpbmUg
U0RfSU9fQ0NDUl9GTl9FWEVDX0ZMRwkJMHgwZQorI2RlZmluZSBTRF9JT19DQ0NSX0ZOX1JF
QURZX0ZMRwkJMHgwZgorI2RlZmluZSBTRF9JT19DQ0NSX0ZOMF9CTEtTSVoJCTB4MTAgLyog
MHgxMC0weDExICovCisjZGVmaW5lIFNEX0lPX0NDQ1JfUE9XRVJfQ1RMCQkweDEyCisjZGVm
aW5lIFNEX0lPX0NDQ1JfSElHSF9TUEVFRAkJMHgxMworI2RlZmluZSAgQ0NDUl9ISUdIX1NQ
RUVEX1NIUwkJKDE8PDApIC8qIFN1cHBvcnQgSGlnaC1TcGVlZCAqLworI2RlZmluZSAgQ0ND
Ul9ISUdIX1NQRUVEX0VIUwkJKDE8PDEpIC8qIEVuYWJsZSBIaWdoLVNwZWVkICovCisKKy8q
IEZ1bmN0aW9uIEJhc2ljIFJlZ2lzdGVycyAoRkJSKSAqLworI2RlZmluZSBTRF9JT19GQlJf
U1RBUlQJCQkweDAwMTAwCisjZGVmaW5lIFNEX0lPX0ZCUl9TSVpFCQkJMHgxMDAKKyNkZWZp
bmUgU0RfSU9fRkJSKGZ1bmMpCSgoKChmdW5jKSAtIDEpICogU0RfSU9fRkJSX1NJWkUpICsg
U0RfSU9fRkJSX1NUQVJUKQorI2RlZmluZSAgRkJSX1NURF9GVU5DX0lGX0NPREUodikJKCh2
KSAmIDB4MGYpCisKKy8qIENhcmQgSW5mb3JtYXRpb24gU3RydWN0dXJlIChDSVMpICovCisj
ZGVmaW5lIFNEX0lPX0NJU19TVEFSVAkJCTB4MDEwMDAKKyNkZWZpbmUgU0RfSU9fQ0lTX1NJ
WkUJCQkweDE3MDAwCisKKy8qIFNESU8gU3RhbmRhcmQgRnVuY3Rpb24gSW50ZXJmYWNlIGNv
ZGUgKi8KKyNkZWZpbmUgU0RfSU9fU0ZJQ19OT19TVEFOREFSRAkJMHgwCisjZGVmaW5lIFNE
X0lPX1NGSUNfVUFSVAkJCTB4MQorI2RlZmluZSBTRF9JT19TRklDX1RZUEVBX0JMVUVUT09U
SAkweDIJLyogVHlwZS1BIEJsdWV0b290aCAqLworI2RlZmluZSBTRF9JT19TRklDX1RZUEVC
X0JMVUVUT09USAkweDMJLyogVHlwZS1CIEJsdWV0b290aCAqLworI2RlZmluZSBTRF9JT19T
RklDX0dQUwkJCTB4NAorI2RlZmluZSBTRF9JT19TRklDX0NBTUVSQQkJMHg1CisjZGVmaW5l
IFNEX0lPX1NGSUNfUEhTCQkJMHg2CisjZGVmaW5lIFNEX0lPX1NGSUNfV0xBTgkJCTB4Nwor
I2RlZmluZSBTRF9JT19TRklDX0FUQQkJCTB4OAkvKiBFbWJlZGRlZCBTRElPLUFUQSAqLwor
CisjZW5kaWYJLyogREVWX01NQ1JFR19IICovCi0tLSAvZGV2L251bGwJMjAxMi0wNi0wMSAx
Njo1ODozNC4wMDAwMDAwMDAgKzAxMDAKKysrIHNkaW92YXIuaAkyMDEyLTA2LTAxIDE3OjI4
OjI5LjAwMDAwMDAwMCArMDEwMApAQCAtMCwwICsxLDEzNiBAQAorLyotCisgKiBDb3B5cmln
aHQgKGMpIDIwMTEgQmVuIEdyYXkuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZF
TlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIG1h
eSBoYXZlIGJlZW4gZGV2ZWxvcGVkIHdpdGggcmVmZXJlbmNlIHRvCisgKiB0aGUgU0QgU2lt
cGxpZmllZCBTcGVjaWZpY2F0aW9uLiAgVGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIG1heSBh
cHBseToKKyAqCisgKiBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXBwbHkgdG8gdGhlIHJl
bGVhc2Ugb2YgdGhlIHNpbXBsaWZpZWQKKyAqIHNwZWNpZmljYXRpb24gKCJTaW1wbGlmaWVk
IFNwZWNpZmljYXRpb24iKSBieSB0aGUgU0QgQ2FyZCBBc3NvY2lhdGlvbiBhbmQKKyAqIHRo
ZSBTRCBHcm91cC4gVGhlIFNpbXBsaWZpZWQgU3BlY2lmaWNhdGlvbiBpcyBhIHN1YnNldCBv
ZiB0aGUgY29tcGxldGUgU0QKKyAqIFNwZWNpZmljYXRpb24gd2hpY2ggaXMgb3duZWQgYnkg
dGhlIFNEIENhcmQgQXNzb2NpYXRpb24gYW5kIHRoZSBTRAorICogR3JvdXAuIFRoaXMgU2lt
cGxpZmllZCBTcGVjaWZpY2F0aW9uIGlzIHByb3ZpZGVkIG9uIGEgbm9uLWNvbmZpZGVudGlh
bAorICogYmFzaXMgc3ViamVjdCB0byB0aGUgZGlzY2xhaW1lcnMgYmVsb3cuIEFueSBpbXBs
ZW1lbnRhdGlvbiBvZiB0aGUKKyAqIFNpbXBsaWZpZWQgU3BlY2lmaWNhdGlvbiBtYXkgcmVx
dWlyZSBhIGxpY2Vuc2UgZnJvbSB0aGUgU0QgQ2FyZAorICogQXNzb2NpYXRpb24sIFNEIEdy
b3VwLCBTRC0zQyBMTEMgb3Igb3RoZXIgdGhpcmQgcGFydGllcy4KKyAqCisgKiBEaXNjbGFp
bWVyczoKKyAqCisgKiBUaGUgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZSBTaW1wbGlm
aWVkIFNwZWNpZmljYXRpb24gaXMgcHJlc2VudGVkIG9ubHkKKyAqIGFzIGEgc3RhbmRhcmQg
c3BlY2lmaWNhdGlvbiBmb3IgU0QgQ2FyZHMgYW5kIFNEIEhvc3QvQW5jaWxsYXJ5IHByb2R1
Y3RzIGFuZAorICogaXMgcHJvdmlkZWQgIkFTLUlTIiB3aXRob3V0IGFueSByZXByZXNlbnRh
dGlvbnMgb3Igd2FycmFudGllcyBvZiBhbnkKKyAqIGtpbmQuIE5vIHJlc3BvbnNpYmlsaXR5
IGlzIGFzc3VtZWQgYnkgdGhlIFNEIEdyb3VwLCBTRC0zQyBMTEMgb3IgdGhlIFNECisgKiBD
YXJkIEFzc29jaWF0aW9uIGZvciBhbnkgZGFtYWdlcywgYW55IGluZnJpbmdlbWVudHMgb2Yg
cGF0ZW50cyBvciBvdGhlcgorICogcmlnaHQgb2YgdGhlIFNEIEdyb3VwLCBTRC0zQyBMTEMs
IHRoZSBTRCBDYXJkIEFzc29jaWF0aW9uIG9yIGFueSB0aGlyZAorICogcGFydGllcywgd2hp
Y2ggbWF5IHJlc3VsdCBmcm9tIGl0cyB1c2UuIE5vIGxpY2Vuc2UgaXMgZ3JhbnRlZCBieQor
ICogaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZSB1bmRlciBhbnkgcGF0ZW50
IG9yIG90aGVyIHJpZ2h0cyBvZiB0aGUKKyAqIFNEIEdyb3VwLCBTRC0zQyBMTEMsIHRoZSBT
RCBDYXJkIEFzc29jaWF0aW9uIG9yIGFueSB0aGlyZCBwYXJ0eS4gTm90aGluZworICogaGVy
ZWluIHNoYWxsIGJlIGNvbnN0cnVlZCBhcyBhbiBvYmxpZ2F0aW9uIGJ5IHRoZSBTRCBHcm91
cCwgdGhlIFNELTNDIExMQworICogb3IgdGhlIFNEIENhcmQgQXNzb2NpYXRpb24gdG8gZGlz
Y2xvc2Ugb3IgZGlzdHJpYnV0ZSBhbnkgdGVjaG5pY2FsCisgKiBpbmZvcm1hdGlvbiwga25v
dy1ob3cgb3Igb3RoZXIgY29uZmlkZW50aWFsIGluZm9ybWF0aW9uIHRvIGFueSB0aGlyZCBw
YXJ0eS4KKyAqCisgKiAiJEZyZWVCU0QkIgorICovCisKKyNpZm5kZWYgREVWX01NQ19TRElP
VkFSX0gKKyNkZWZpbmUgREVWX01NQ19TRElPVkFSX0gKKworI2luY2x1ZGUgPGRldi9tbWMv
YnJpZGdlLmg+CisKK2VudW0gc2Rpb19jYXJkX2l2YXJzIHsKKwlTRElPX0lWQVJfVkVORE9S
LAorCVNESU9fSVZBUl9QUk9EVUNULAorCVNESU9fSVZBUl9GVU5DVElPTl9OVU1CRVIsCisJ
U0RJT19JVkFSX0JMT0NLX1NJWkUsCisvLyAgICBTRElPX0lWQVJfLAorfTsKKworLyoKKyAq
IFNpbXBsaWZpZWQgYWNjZXNzb3JzIGZvciBwY2kgZGV2aWNlcworICovCisjZGVmaW5lIFNE
SU9fQUNDRVNTT1IodmFyLCBpdmFyLCB0eXBlKQlcCisJX19CVVNfQUNDRVNTT1Ioc2Rpbywg
dmFyLCBTRElPLCBpdmFyLCB0eXBlKQorCitTRElPX0FDQ0VTU09SKHZlbmRvciwgVkVORE9S
LCB1bnNpZ25lZCBpbnQpCitTRElPX0FDQ0VTU09SKHByb2R1Y3QsIFBST0RVQ1QsIHVuc2ln
bmVkIGludCkKK1NESU9fQUNDRVNTT1IoZnVuY3Rpb25fbnVtYmVyLCBGVU5DVElPTl9OVU1C
RVIsIHVuc2lnbmVkIGludCkKK1NESU9fQUNDRVNTT1IoYmxvY2tfc2l6ZSwgQkxPQ0tfU0la
RSwgdW5zaWduZWQgaW50KQorCisKKy8qCisgKiBDb252ZW5pZW5jZSBmdW5jdGlvbnMKKyAq
LworI2luY2x1ZGUgInNkaW9faWYuaCIKKworc3RhdGljIGlubGluZSBpbnQKK3NkaW9fcmVh
ZF8xKGRldmljZV90IGRldiwgdWludDMyX3Qgb2Zmc2V0LCB1aW50OF90ICp2YWwpCit7CisJ
cmV0dXJuIChTRElPX1JFQURfTVVMVEkoZGV2aWNlX2dldF9wYXJlbnQoZGV2KSwgZGV2LCBv
ZmZzZXQsIHZhbCwgMSkpOworfQorCitzdGF0aWMgaW5saW5lIGludAorc2Rpb193cml0ZV8x
KGRldmljZV90IGRldiwgdWludDMyX3Qgb2Zmc2V0LCB1aW50OF90IHZhbCkKK3sKKwlyZXR1
cm4gKFNESU9fV1JJVEVfTVVMVEkoZGV2aWNlX2dldF9wYXJlbnQoZGV2KSwgZGV2LCBvZmZz
ZXQsICZ2YWwsIDEpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3NkaW9fcmVhZF8yKGRl
dmljZV90IGRldiwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MTZfdCAqdmFsKQoreworCXJldHVy
biAoU0RJT19SRUFEX01VTFRJKGRldmljZV9nZXRfcGFyZW50KGRldiksIGRldiwgb2Zmc2V0
LCAodWludDhfdCopdmFsLCAyKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitzZGlvX3dy
aXRlXzIoZGV2aWNlX3QgZGV2LCB1aW50MzJfdCBvZmZzZXQsIHVpbnQxNl90IHZhbCkKK3sK
KwlyZXR1cm4gKFNESU9fV1JJVEVfTVVMVEkoZGV2aWNlX2dldF9wYXJlbnQoZGV2KSwgZGV2
LCBvZmZzZXQsICh1aW50OF90KikmdmFsLCAyKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50
CitzZGlvX3JlYWRfNChkZXZpY2VfdCBkZXYsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3Qg
KnZhbCkKK3sKKwlyZXR1cm4gKFNESU9fUkVBRF9NVUxUSShkZXZpY2VfZ2V0X3BhcmVudChk
ZXYpLCBkZXYsIG9mZnNldCwgKHVpbnQ4X3QqKXZhbCwgNCkpOworfQorCitzdGF0aWMgaW5s
aW5lIGludAorc2Rpb193cml0ZV80KGRldmljZV90IGRldiwgdWludDMyX3Qgb2Zmc2V0LCB1
aW50MzJfdCB2YWwpCit7CisJcmV0dXJuIChTRElPX1dSSVRFX01VTFRJKGRldmljZV9nZXRf
cGFyZW50KGRldiksIGRldiwgb2Zmc2V0LCAodWludDhfdCopJnZhbCwgNCkpOworfQorCisK
K3N0YXRpYyBpbmxpbmUgaW50CitzZGlvX2Z1bmMwX3JlYWRfMShkZXZpY2VfdCBkZXYsIHVp
bnQzMl90IG9mZnNldCwgdWludDhfdCAqdmFsKQoreworCXJldHVybiAoU0RJT19GVU5DMF9S
RUFEXzEoZGV2aWNlX2dldF9wYXJlbnQoZGV2KSwgb2Zmc2V0LCB2YWwpKTsKK30KKworc3Rh
dGljIGlubGluZSBpbnQKK3NkaW9fZnVuYzBfd3JpdGVfMShkZXZpY2VfdCBkZXYsIHVpbnQz
Ml90IG9mZnNldCwgdWludDhfdCB2YWwpCit7CisJcmV0dXJuIChTRElPX0ZVTkMwX1dSSVRF
XzEoZGV2aWNlX2dldF9wYXJlbnQoZGV2KSwgb2Zmc2V0LCB2YWwpKTsKK30KKworCisKKwor
I2VuZGlmIC8qIERFVl9NTUNfTU1DVkFSX0ggKi8KLS0tIC9kZXYvbnVsbAkyMDEyLTA2LTAx
IDE2OjU4OjM0LjAwMDAwMDAwMCArMDEwMAorKysgc2Rpb19pZi5tCTIwMTItMDUtMDcgMjI6
Mjc6MzIuMDAwMDAwMDAwICswMTAwCkBAIC0wLDAgKzEsMjMyIEBACisjLQorIyBDb3B5cmln
aHQgKGMpIDIwMTIgQmVuIEdyYXkKKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
IyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMg
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBU
SEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorIyBBTlkgRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyMgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyMgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyMg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pCisjIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisjIExJQUJJTElUWSwgT1IgVE9SVCAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkK
KyMgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRgorIyBTVUNIIERBTUFHRS4KKyMKKyMgUG9ydGlvbnMgb2Yg
dGhpcyBzb2Z0d2FyZSBtYXkgaGF2ZSBiZWVuIGRldmVsb3BlZCB3aXRoIHJlZmVyZW5jZSB0
bworIyB0aGUgU0QgU2ltcGxpZmllZCBTcGVjaWZpY2F0aW9uLiAgVGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIG1heSBhcHBseToKKyMKKyMgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFw
cGx5IHRvIHRoZSByZWxlYXNlIG9mIHRoZSBzaW1wbGlmaWVkCisjIHNwZWNpZmljYXRpb24g
KCJTaW1wbGlmaWVkIFNwZWNpZmljYXRpb24iKSBieSB0aGUgU0QgQ2FyZCBBc3NvY2lhdGlv
biBhbmQKKyMgdGhlIFNEIEdyb3VwLiBUaGUgU2ltcGxpZmllZCBTcGVjaWZpY2F0aW9uIGlz
IGEgc3Vic2V0IG9mIHRoZSBjb21wbGV0ZSBTRAorIyBTcGVjaWZpY2F0aW9uIHdoaWNoIGlz
IG93bmVkIGJ5IHRoZSBTRCBDYXJkIEFzc29jaWF0aW9uIGFuZCB0aGUgU0QKKyMgR3JvdXAu
IFRoaXMgU2ltcGxpZmllZCBTcGVjaWZpY2F0aW9uIGlzIHByb3ZpZGVkIG9uIGEgbm9uLWNv
bmZpZGVudGlhbAorIyBiYXNpcyBzdWJqZWN0IHRvIHRoZSBkaXNjbGFpbWVycyBiZWxvdy4g
QW55IGltcGxlbWVudGF0aW9uIG9mIHRoZQorIyBTaW1wbGlmaWVkIFNwZWNpZmljYXRpb24g
bWF5IHJlcXVpcmUgYSBsaWNlbnNlIGZyb20gdGhlIFNEIENhcmQKKyMgQXNzb2NpYXRpb24s
IFNEIEdyb3VwLCBTRC0zQyBMTEMgb3Igb3RoZXIgdGhpcmQgcGFydGllcy4KKyMKKyMgRGlz
Y2xhaW1lcnM6CisjCisjIFRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlIFNpbXBs
aWZpZWQgU3BlY2lmaWNhdGlvbiBpcyBwcmVzZW50ZWQgb25seQorIyBhcyBhIHN0YW5kYXJk
IHNwZWNpZmljYXRpb24gZm9yIFNEIENhcmRzIGFuZCBTRCBIb3N0L0FuY2lsbGFyeSBwcm9k
dWN0cyBhbmQKKyMgaXMgcHJvdmlkZWQgIkFTLUlTIiB3aXRob3V0IGFueSByZXByZXNlbnRh
dGlvbnMgb3Igd2FycmFudGllcyBvZiBhbnkKKyMga2luZC4gTm8gcmVzcG9uc2liaWxpdHkg
aXMgYXNzdW1lZCBieSB0aGUgU0QgR3JvdXAsIFNELTNDIExMQyBvciB0aGUgU0QKKyMgQ2Fy
ZCBBc3NvY2lhdGlvbiBmb3IgYW55IGRhbWFnZXMsIGFueSBpbmZyaW5nZW1lbnRzIG9mIHBh
dGVudHMgb3Igb3RoZXIKKyMgcmlnaHQgb2YgdGhlIFNEIEdyb3VwLCBTRC0zQyBMTEMsIHRo
ZSBTRCBDYXJkIEFzc29jaWF0aW9uIG9yIGFueSB0aGlyZAorIyBwYXJ0aWVzLCB3aGljaCBt
YXkgcmVzdWx0IGZyb20gaXRzIHVzZS4gTm8gbGljZW5zZSBpcyBncmFudGVkIGJ5CisjIGlt
cGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UgdW5kZXIgYW55IHBhdGVudCBvciBv
dGhlciByaWdodHMgb2YgdGhlCisjIFNEIEdyb3VwLCBTRC0zQyBMTEMsIHRoZSBTRCBDYXJk
IEFzc29jaWF0aW9uIG9yIGFueSB0aGlyZCBwYXJ0eS4gTm90aGluZworIyBoZXJlaW4gc2hh
bGwgYmUgY29uc3RydWVkIGFzIGFuIG9ibGlnYXRpb24gYnkgdGhlIFNEIEdyb3VwLCB0aGUg
U0QtM0MgTExDCisjIG9yIHRoZSBTRCBDYXJkIEFzc29jaWF0aW9uIHRvIGRpc2Nsb3NlIG9y
IGRpc3RyaWJ1dGUgYW55IHRlY2huaWNhbAorIyBpbmZvcm1hdGlvbiwga25vdy1ob3cgb3Ig
b3RoZXIgY29uZmlkZW50aWFsIGluZm9ybWF0aW9uIHRvIGFueSB0aGlyZCBwYXJ0eS4KKyMK
KyMgJEZyZWVCU0QkCisjCisKKyNpbmNsdWRlIDxzeXMvYnVzLmg+CisjaW5jbHVkZSA8ZGV2
L21tYy9tbWNyZWcuaD4KKyNpbmNsdWRlIDxkZXYvbW1jL2JyaWRnZS5oPgorCisjCisjIFRo
aXMgaXMgdGhlIHNldCBvZiBjYWxsYmFja3MgdGhhdCBzZGlvIGNhcmQgZHJpdmVycyBjYWxs
IHRvIG1ha2UgcmVxdWVzdHMuCisjCisKK0lOVEVSRkFDRSBzZGlvOworCisjCisjIENsYWlt
IHRoZSBjdXJyZW50IGNhcmQsIGJsb2NraW5nIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0
aGUgaG9zdAorIyBpcyBubyBsb25nZXIgYnVzeS4KKyMKK01FVEhPRCBpbnQgYWNxdWlyZV9j
YXJkIHsKKwlkZXZpY2VfdAljYXJkZGV2OworCWRldmljZV90CXJlcWRldjsKK30KKworIwor
IyBSZWxlYXNlIHRoZSBjdXJyZW50IGNhcmQuCisjCitNRVRIT0QgaW50IHJlbGVhc2VfY2Fy
ZCB7CisJZGV2aWNlX3QJY2FyZGRldjsKKwlkZXZpY2VfdAlyZXFkZXY7Cit9CisKKworIwor
IyBSZWxlYXNlIHRoZSBjdXJyZW50IGNhcmQuCisjCitNRVRIT0QgaW50IHNldF9ibG9ja19z
aXplIHsKKwlkZXZpY2VfdAljYXJkZGV2OworCWRldmljZV90CXJlcWRldjsKKwl1aW50MTZf
dAlzaXplOworfQorCisKKyMKKyMgUmVhZCBhIHNpbmdsZSBieXRlIGZyb20gYSByZWdpc3Rl
ciBpbiBmdW5jdGlvbiAwIGFyZWEgb24gdGhlIFNESU8gY2FyZC4KKyMKK01FVEhPRCBpbnQg
ZnVuYzBfcmVhZF8xIHsKKwlkZXZpY2VfdAlicmRldjsKKwl1X2ludAkJcmVnOworCXVpbnQ4
X3QJCSp2YWw7Cit9OworCisjCisjIFdyaXRlIGEgc2luZ2xlIGJ5dGUgdG8gYSByZWdpc3Rl
ciBpbiBmdW5jdGlvbiAwIGFyZWEgb24gdGhlIFNESU8gY2FyZC4KKyMKK01FVEhPRCBpbnQg
ZnVuYzBfd3JpdGVfMSB7CisJZGV2aWNlX3QJYnJkZXY7CisJdV9pbnQJCXJlZzsKKwl1aW50
OF90CQl2YWw7Cit9OworCisKKworCisjCisjIFJlYWQgYSBzaW5nbGUgYnl0ZSBmcm9tIGEg
cmVnaXN0ZXIgb24gdGhlIFNESU8gY2FyZC4KKyMKK01FVEhPRCBpbnQgcmVhZF8xIHsKKwlk
ZXZpY2VfdAlicmRldjsKKwlkZXZpY2VfdAlyZXFkZXY7CisJdV9pbnQJCXJlZzsKKwl1aW50
OF90CQkqdmFsOworfTsKKworTUVUSE9EIGludCByZWFkXzIgeworCWRldmljZV90CWJyZGV2
OworCWRldmljZV90CXJlcWRldjsKKwl1X2ludAkJcmVnOworCXVpbnQxNl90CSp2YWw7Cit9
OworCitNRVRIT0QgaW50IHJlYWRfNCB7CisJZGV2aWNlX3QJYnJkZXY7CisJZGV2aWNlX3QJ
cmVxZGV2OworCXVfaW50CQlyZWc7CisJdWludDMyX3QJKnZhbDsKK307CisKKyMKKyMgV3Jp
dGUgYSBzaW5nbGUgYnl0ZSBmcm9tIGEgcmVnaXN0ZXIgb24gdGhlIFNESU8gY2FyZC4KKyMK
K01FVEhPRCBpbnQgd3JpdGVfMSB7CisJZGV2aWNlX3QJYnJkZXY7CisJZGV2aWNlX3QJcmVx
ZGV2OworCXVfaW50CQlyZWc7CisJdWludDhfdAkJdmFsOworfTsKKworTUVUSE9EIGludCB3
cml0ZV8yIHsKKwlkZXZpY2VfdAlicmRldjsKKwlkZXZpY2VfdAlyZXFkZXY7CisJdV9pbnQJ
CXJlZzsKKwl1aW50MTZfdAkJdmFsOworfTsKKworTUVUSE9EIGludCB3cml0ZV80IHsKKwlk
ZXZpY2VfdAlicmRldjsKKwlkZXZpY2VfdAlyZXFkZXY7CisJdV9pbnQJCXJlZzsKKwl1aW50
MzJfdAl2YWw7Cit9OworCisKKworIworIyBSZWFkIG11bHRpcGxlIGJ5dGVzIGZyb20gdGhl
IFNESU8gY2FyZCdzIHJlZ2lzdGVycworIworTUVUSE9EIGludCByZWFkX211bHRpIHsKKwlk
ZXZpY2VfdAlicmRldjsKKwlkZXZpY2VfdAlyZXFkZXY7CisJdV9pbnQJCXJlZzsKKwl1X2No
YXIJCSpkYXRhcDsKKwlzaXplX3QJCWxlbjsKK307CisKKyMKKyMgUmVhZHMgb25lIG9yIG1v
cmUgYnl0ZXMgZnJvbSBhIGZpZm8gdHlwZSBkZXZpY2UgKGRvZXNuJ3QgaW5jcmVtZW50Cisj
IHRoZSBhZGRyZXNzIG9uIHJlYWQpCisjCitNRVRIT0QgaW50IHJlYWRfc3RyZWFtX211bHRp
IHsKKwlkZXZpY2VfdAlicmRldjsKKwlkZXZpY2VfdAlyZXFkZXY7CisJdV9pbnQJCXJlZzsK
Kwl1X2NoYXIJCSpkYXRhcDsKKwlzaXplX3QJCWxlbjsKK307CisKKyMKKyMgV3JpdGUgbXVs
dGlwbGUgYnl0ZXMgdG8gdGhlIFNESU8gY2FyZCdzIHJlZ2lzdGVycworIworTUVUSE9EIGlu
dCB3cml0ZV9tdWx0aSB7CisJZGV2aWNlX3QJYnJkZXY7CisJZGV2aWNlX3QJcmVxZGV2Owor
CXVfaW50CQlyZWc7CisJdV9jaGFyCQkqZGF0YXA7CisJc2l6ZV90CQlsZW47Cit9OworCisj
CisjIFdyaXRlcyBvbmUgb3IgbW9yZSBieXRlcyBpbnRvIGEgZmlmbyB0eXBlIGRldmljZSAo
ZG9lc24ndCBpbmNyZW1lbnQKKyMgdGhlIGFkZHJlc3MgYWZ0ZXIgZWFjaCB3cml0ZSkKKyMK
K01FVEhPRCBpbnQgd3JpdGVfc3RyZWFtX211bHRpIHsKKwlkZXZpY2VfdAlicmRldjsKKwlk
ZXZpY2VfdAlyZXFkZXY7CisJdV9pbnQJCXJlZzsKKwl1X2NoYXIJCSpkYXRhcDsKKwlzaXpl
X3QJCWxlbjsKK307CisKKworCisjCisjIEFjdGl2YXRlIGFuZCBpbnN0YWxsIGFuIGludGVy
cnVwdCBoYW5kbGVyCisjCitNRVRIT0QgaW50IHNldHVwX2ludHIgeworCWRldmljZV90CWJy
ZGV2OworCWRldmljZV90CXJlcWRldjsKKwlkcml2ZXJfaW50cl90CWZ1bjsKK307CisKKyMK
KyMgQWN0aXZhdGUgYW5kIGluc3RhbGwgYW4gaW50ZXJydXB0IGhhbmRsZXIKKyMKK01FVEhP
RCBpbnQgdGVhcmRvd25faW50ciB7CisJZGV2aWNlX3QJYnJkZXY7CisJZGV2aWNlX3QJcmVx
ZGV2OworfTsKKworCisKKwotLS0gL2Rldi9udWxsCTIwMTItMDYtMDEgMTY6NTg6MzQuMDAw
MDAwMDAwICswMTAwCisrKyBzZGlvX2Npcy5jCTIwMTItMDEtMjYgMTc6MzU6MjQuMDAwMDAw
MDAwICswMDAwCkBAIC0wLDAgKzEsMjcxIEBACisvKiAkRnJlZUJTRCQgKi8KKy8qCSROZXRC
U0Q6IHNkbW1jX2Npcy5jLHYgMS4zIDIwMTAvMTAvMDcgMTY6MjY6Mzcga2l5b2hhcmEgRXhw
ICQJKi8KKy8qCSRPcGVuQlNEOiBzZG1tY19jaXMuYyx2IDEuMSAyMDA2LzA2LzAxIDIxOjUz
OjQxIHV3ZSBFeHAgJAkqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2IFV3ZSBTdHVl
aGxlciA8dXdlQG9wZW5ic2Qub3JnPgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5
LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVy
cG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0
aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9u
IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMg
UFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJ
RVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4g
Tk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lB
TCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBE
QU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRB
IE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVH
TElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBP
UiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNP
RlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KK19fRkJTRElEKCIkRnJl
ZUJTRCQiKTsKKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9zeXN0
bS5oPgorI2luY2x1ZGUgPHN5cy9idXMuaD4KKyNpbmNsdWRlIDxzeXMvY29uZi5oPgorI2lu
Y2x1ZGUgPHN5cy9rZXJuZWwuaD4KKyNpbmNsdWRlIDxzeXMvbG9jay5oPgorI2luY2x1ZGUg
PHN5cy9tYWxsb2MuaD4KKyNpbmNsdWRlIDxzeXMvbW9kdWxlLmg+CisjaW5jbHVkZSA8c3lz
L211dGV4Lmg+CisKKyNpbmNsdWRlIDxkZXYvcGNjYXJkL3BjY2FyZF9jaXMuaD4KKyNpbmNs
dWRlIDxkZXYvbW1jL21tY3JlZy5oPgorI2luY2x1ZGUgPGRldi9tbWMvbW1jaW9yZWcuaD4K
KyNpbmNsdWRlIDxkZXYvbW1jL3NkaW8uaD4KKworCisKKyNkZWZpbmUgU0RNTUNDSVNERUJV
RworCisjaWZkZWYgU0RNTUNDSVNERUJVRworI2RlZmluZSBEUFJJTlRGKHMpCXByaW50ZiBz
CisjZWxzZQorI2RlZmluZSBEUFJJTlRGKHMpCS8qKi8KKyNlbmRpZgorCisKKworc3RhdGlj
IHVpbnQ4X3QKK3NkaW9fY2lzX3JlYWRiKGRldmljZV90IGRldiwgdWludDMyX3QgYWRyKQor
eworCXN0cnVjdCBzZGlvX3NvZnRjICpzYyA9IGRldmljZV9nZXRfc29mdGMoZGV2KTsKKwl1
aW50OF90IHZhbDsKKworCWlmIChzZGlvX3J3X2RpcmVjdChzYywgMCwgMCwgYWRyLCAmdmFs
KSAhPSBNTUNfRVJSX05PTkUpIHsKKwkJZGV2aWNlX3ByaW50ZihkZXYsICJTRElPIHJlYWQg
ZmFpbGVkIVxuIik7CisJCXJldHVybiAweGZmOworCX0KKwkKKwlyZXR1cm4gdmFsOworfQor
CisKK3N0YXRpYyB2b2lkCitkZWNvZGVfZnVuY2VfY29tbW9uKGRldmljZV90IGRldiwgc3Ry
dWN0IHNkaW9fY2lzICpjaXMsIGludCB0cGxsZW4sCisgICAgICAgICAgICAgICAgICAgIHVp
bnQzMl90IHJlZykKK3sKKwlzdGF0aWMgY29uc3QgaW50IHNwZWVkX3ZhbFtdID0KKwkgICAg
eyAwLCAxMCwgMTIsIDEzLCAxNSwgMjAsIDI1LCAzMCwgMzUsIDQwLCA0NSwgNTAsIDU1LCA2
MCwgNzAsIDgwIH07CisJc3RhdGljIGNvbnN0IGludCBzcGVlZF91bml0W10gPSB7IDEwLCAx
MDAsIDEwMDAsIDEwMDAwLCB9OworCXVpbnQ4X3QgbWF4X3RyYW5fc3BlZWQ7CisKKwlpZiAo
dHBsbGVuIDwgNCkgeworCQlkZXZpY2VfcHJpbnRmKGRldiwgIkNJU1RQTF9GVU5DRShjb21t
b24pIHRvbyBzaG9ydFxuIik7CisJCXJldHVybjsKKwl9CisKKwljaXMtPmZ1bmNlLmZuMC5i
bGtfc3ogPSBzZGlvX2Npc19yZWFkYihkZXYsIHJlZysrKTsKKwljaXMtPmZ1bmNlLmZuMC5i
bGtfc3ogfD0gc2Rpb19jaXNfcmVhZGIoZGV2LCByZWcrKykgPDwgODsKKwltYXhfdHJhbl9z
cGVlZCA9IHNkaW9fY2lzX3JlYWRiKGRldiwgcmVnKyspOworCWNpcy0+ZnVuY2UuZm4wLm1h
eF9zcGQgPQorCSAgICBzcGVlZF92YWxbbWF4X3RyYW5fc3BlZWQgPj4gM10gKiBzcGVlZF91
bml0W21heF90cmFuX3NwZWVkICYgN107CisKKwlEUFJJTlRGKAorCSAgICAoIkNJU1RQTF9G
VU5DRTogRk4wX0JMS19TSVpFPTB4JXgsIE1BWF9UUkFOX1NQRUVEPTB4JXgoJWRrSHopXG4i
LAorCSAgICBjaXMtPmZ1bmNlLmZuMC5ibGtfc3osIG1heF90cmFuX3NwZWVkLCBjaXMtPmZ1
bmNlLmZuMC5tYXhfc3BkKSk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWNvZGVfZnVuY2VfZnVu
Y3Rpb24oZGV2aWNlX3QgZGV2LCBzdHJ1Y3Qgc2Rpb19jaXMgKmNpcywKKwkJICAgICAgaW50
IHRwbGxlbiwgdWludDMyX3QgcmVnKQoreworCWludCBzZGlveF9jY2NyeCwgc2Rpb3g7CisK
KwlzZGlveF9jY2NyeCA9IHNkaW9fY2lzX3JlYWRiKGRldiwgU0RfSU9fQ0NDUl9DQ0NSX1NE
SU9fUkVWKTsKKwlzZGlveCA9IFNEX0lPX0NDQ1JfU0RJT19SRVYoc2Rpb3hfY2NjcngpOwor
CisJaWYgKHNkaW94ID09IENDQ1JfU0RJT19SRVZfMV8wMCAmJiB0cGxsZW4gPCAweDFjKSB7
CisJCWRldmljZV9wcmludGYoZGV2LAorCQkgICAgIkNJU1RQTF9GVU5DRShmdW5jdGlvbikg
dG9vIHNob3J0ICh2MS4wMClcbiIpOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChzZGlveCAh
PSBDQ0NSX1NESU9fUkVWXzFfMDAgJiYgdHBsbGVuIDwgMHgyYSkgeworCQlkZXZpY2VfcHJp
bnRmKGRldiwgIkNJU1RQTF9GVU5DRShmdW5jdGlvbikgdG9vIHNob3J0XG4iKTsKKwkJcmV0
dXJuOworCX0KKworCWNpcy0+ZnVuY2UuZm5zLnNlcmlhbF9udW0gPSBzZGlvX2Npc19yZWFk
YihkZXYsIHJlZyArIDIpOworCWNpcy0+ZnVuY2UuZm5zLnNlcmlhbF9udW0gfD0gc2Rpb19j
aXNfcmVhZGIoZGV2LCByZWcgKyAzKSA8PCA4OworCWNpcy0+ZnVuY2UuZm5zLnNlcmlhbF9u
dW0gfD0gc2Rpb19jaXNfcmVhZGIoZGV2LCByZWcgKyA0KSA8PCAxNjsKKwljaXMtPmZ1bmNl
LmZucy5zZXJpYWxfbnVtIHw9IHNkaW9fY2lzX3JlYWRiKGRldiwgcmVnICsgNSkgPDwgMjQ7
CisKKwljaXMtPmZ1bmNlLmZucy5tYXhfYmxrX3N6ID0gc2Rpb19jaXNfcmVhZGIoZGV2LCBy
ZWcgKyAxMSk7CisJY2lzLT5mdW5jZS5mbnMubWF4X2Jsa19zeiB8PSBzZGlvX2Npc19yZWFk
YihkZXYsIHJlZyArIDEyKSA8PCA4OworCisJY2lzLT5mdW5jZS5mbnMuc3RhcnR1cF90aW1l
b3V0X21zIHw9IHNkaW9fY2lzX3JlYWRiKGRldiwgcmVnICsgMjcpOworCWNpcy0+ZnVuY2Uu
Zm5zLnN0YXJ0dXBfdGltZW91dF9tcyB8PSBzZGlvX2Npc19yZWFkYihkZXYsIHJlZyArIDI4
KSA8PCA4OworCWNpcy0+ZnVuY2UuZm5zLnN0YXJ0dXBfdGltZW91dF9tcyAqPSAxMDsKKwkJ
CQorCWNpcy0+ZnVuY2UuZm5zLm9wX21pbl9wd3IgPSBzZGlvX2Npc19yZWFkYihkZXYsIHJl
ZyArIDE3KTsKKwljaXMtPmZ1bmNlLmZucy5vcF9hdmdfcHdyID0gc2Rpb19jaXNfcmVhZGIo
ZGV2LCByZWcgKyAxOCk7CisJY2lzLT5mdW5jZS5mbnMub3BfbWF4X3B3ciA9IHNkaW9fY2lz
X3JlYWRiKGRldiwgcmVnICsgMTkpOworCWNpcy0+ZnVuY2UuZm5zLnNiX21pbl9wd3IgPSBz
ZGlvX2Npc19yZWFkYihkZXYsIHJlZyArIDIwKTsKKwljaXMtPmZ1bmNlLmZucy5zYl9hdmdf
cHdyID0gc2Rpb19jaXNfcmVhZGIoZGV2LCByZWcgKyAyMSk7CisJY2lzLT5mdW5jZS5mbnMu
c2JfbWF4X3B3ciA9IHNkaW9fY2lzX3JlYWRiKGRldiwgcmVnICsgMjIpOworCQorCWNpcy0+
ZnVuY2UuZm5zLmhwX2F2Z19wd3IgPSBzZGlvX2Npc19yZWFkYihkZXYsIHJlZyArIDMzKTsK
KwljaXMtPmZ1bmNlLmZucy5ocF9tYXhfcHdyIHw9IHNkaW9fY2lzX3JlYWRiKGRldiwgcmVn
ICsgMzQpIDw8IDg7CisJY2lzLT5mdW5jZS5mbnMubHBfYXZnX3B3ciA9IHNkaW9fY2lzX3Jl
YWRiKGRldiwgcmVnICsgMzUpOworCWNpcy0+ZnVuY2UuZm5zLmxwX21heF9wd3IgfD0gc2Rp
b19jaXNfcmVhZGIoZGV2LCByZWcgKyAzNikgPDwgODsKKworCURQUklOVEYoKCJDSVNUUExf
RlVOQ0U6IE1BWF9CTEtfU0laRT0weCV4XG4iLCBjaXMtPmZ1bmNlLmZucy5tYXhfYmxrX3N6
KSk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWNvZGVfdmVyc18xKGRldmljZV90IGRldiwgc3Ry
dWN0IHNkaW9fY2lzICpjaXMsIGludCB0cGxsZW4sCisJICAgICAgdWludDMyX3QgcmVnKQor
eworCWlmICh0cGxsZW4gPCAyKSB7CisJCWRldmljZV9wcmludGYoZGV2LCAiQ0lTVFBMX1ZF
UlNfMSB0b28gc2hvcnRcbiIpOworCQlyZXR1cm47CisJfQorCisJY2lzLT5jaXMxX21ham9y
ID0gc2Rpb19jaXNfcmVhZGIoZGV2LCByZWcrKyk7CisJY2lzLT5jaXMxX21pbm9yID0gc2Rp
b19jaXNfcmVhZGIoZGV2LCByZWcrKyk7CisKKwlEUFJJTlRGKCgiQ0lTVFBMX1ZFUlNfMVxu
IikpOworfQorCitpbnQKK3NkaW9fY2lzX3JlYWQoZGV2aWNlX3QgZGV2LCB1aW50MzJfdCBj
aXNwdHIsIHN0cnVjdCBzZGlvX2NpcyAqY2lzKQoreworCXVpbnQzMl90IHJlZzsKKwl1aW50
OF90IHRwbGNvZGUsIHRwbGxlbjsKKworCW1lbXNldChjaXMsIDAsIHNpemVvZihzdHJ1Y3Qg
c2Rpb19jaXMpKTsKKwljaXMtPm1hbnVmYWN0dXJlciA9IFNESU9fVkVORE9SX0lOVkFMSUQ7
CisJY2lzLT5wcm9kdWN0ID0gU0RJT19QUk9EVUNUX0lOVkFMSUQ7CisKKwlyZWcgPSBjaXNw
dHI7CisJaWYgKChyZWcgPCBTRF9JT19DSVNfU1RBUlQpIHx8CisJICAgIChyZWcgPj0gKFNE
X0lPX0NJU19TVEFSVCArIFNEX0lPX0NJU19TSVpFIC0gMTYpKSkgeworCQlkZXZpY2VfcHJp
bnRmKGRldiwgImJhZCBDSVMgcHRyICUjeFxuIiwgcmVnKTsKKwkJcmV0dXJuIDE7CisJfQor
CisJRFBSSU5URigoIlJFQURJTkcgQ0lTVFBMIEFUIDB4JTA2eFxuIiwgcmVnKSk7CisJCisJ
Zm9yICg7OykgeworCQl0cGxjb2RlID0gc2Rpb19jaXNfcmVhZGIoZGV2LCByZWcrKyk7CisK
KwkJaWYgKHRwbGNvZGUgPT0gQ0lTVFBMX05VTEwpIHsKKwkJCURQUklOVEYoKCIgMDBcbkNJ
U1RQTF9OT05FXG4iKSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXRwbGxlbiA9IHNkaW9f
Y2lzX3JlYWRiKGRldiwgcmVnKyspOworCQlpZiAodHBsY29kZSA9PSBDSVNUUExfRU5EIHx8
IHRwbGxlbiA9PSAwKSB7CisJCQlpZiAodHBsY29kZSAhPSAweGZmKQorCQkJCWRldmljZV9w
cmludGYoZGV2LCAiQ0lTIHBhcnNlIGVycm9yIGF0ICVkLCAiCisJCQkJICAgICJ0dXBsZSBj
b2RlICUjeCwgbGVuZ3RoICVkXG4iLAorCQkJCSAgICByZWcsIHRwbGNvZGUsIHRwbGxlbik7
CisJCQllbHNlIHsKKwkJCQlEUFJJTlRGKCgiIGZmXG5DSVNUUExfRU5EXG4iKSk7CisJCQl9
CisJCQlicmVhazsKKwkJfQorCisjaWZkZWYgU0RNTUNDSVNERUJVRworCQl7IAorCQkJaW50
IGk7CisKKwkJCS8qIHByaW50IHRoZSB0dXBsZSAqLworCQkJRFBSSU5URigoIiAlMDJ4ICUw
MngiLCB0cGxjb2RlLCB0cGxsZW4pKTsKKworCQkJZm9yIChpID0gMDsgaSA8IHRwbGxlbjsg
aSsrKSB7CisJCQkJRFBSSU5URigoIiAlMDJ4IiwKKwkJCQkgICAgc2Rpb19jaXNfcmVhZGIo
ZGV2LCByZWcgKyBpKSkpOworCQkJCWlmICgoaSAlIDE2KSA9PSAxMykKKwkJCQkJRFBSSU5U
RigoIlxuIikpOworCQkJfQorCQkJaWYgKChpICUgMTYpICE9IDE0KQorCQkJCURQUklOVEYo
KCJcbiIpKTsKKwkJfQorI2VuZGlmCisKKwkJc3dpdGNoICh0cGxjb2RlKSB7CisJCWNhc2Ug
Q0lTVFBMX0ZVTkNFOgorCQkJaWYgKHNkaW9fY2lzX3JlYWRiKGRldiwgcmVnKyspID09IDAp
CisJCQkJZGVjb2RlX2Z1bmNlX2NvbW1vbihkZXYsIGNpcywgdHBsbGVuLCByZWcpOworCQkJ
ZWxzZQorCQkJCWRlY29kZV9mdW5jZV9mdW5jdGlvbihkZXYsIGNpcywgdHBsbGVuLCByZWcp
OworCQkJcmVnICs9ICh0cGxsZW4gLSAxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ0lTVFBM
X0ZVTkNJRDoKKwkJCWlmICh0cGxsZW4gPCAyKSB7CisJCQkJZGV2aWNlX3ByaW50ZihkZXYs
CisJCQkJICAgICJiYWQgQ0lTVFBMX0ZVTkNJRCBsZW5ndGhcbiIpOworCQkJCXJlZyArPSB0
cGxsZW47CisJCQkJYnJlYWs7CisJCQl9CisJCQlEUFJJTlRGKCgiQ0lTVFBMX0ZVTkNJRFxu
IikpOworCQkJcmVnICs9IHRwbGxlbjsKKwkJCWJyZWFrOworCisJCWNhc2UgQ0lTVFBMX01B
TkZJRDoKKwkJCWlmICh0cGxsZW4gPCA0KSB7CisJCQkJZGV2aWNlX3ByaW50ZihkZXYsCisJ
CQkJICAgICJiYWQgQ0lTVFBMX01BTkZJRCBsZW5ndGhcbiIpOworCQkJCXJlZyArPSB0cGxs
ZW47CisJCQkJYnJlYWs7CisJCQl9CisJCQljaXMtPm1hbnVmYWN0dXJlciA9IHNkaW9fY2lz
X3JlYWRiKGRldiwgcmVnKyspOworCQkJY2lzLT5tYW51ZmFjdHVyZXIgfD0gc2Rpb19jaXNf
cmVhZGIoZGV2LCByZWcrKykgPDwgODsKKwkJCWNpcy0+cHJvZHVjdCA9IHNkaW9fY2lzX3Jl
YWRiKGRldiwgcmVnKyspOworCQkJY2lzLT5wcm9kdWN0IHw9IHNkaW9fY2lzX3JlYWRiKGRl
diwgcmVnKyspIDw8IDg7CisJCQlEUFJJTlRGKCgiQ0lTVFBMX01BTkZJRFxuIikpOworCQkJ
YnJlYWs7CisKKwkJY2FzZSBDSVNUUExfVkVSU18xOgorCQkJZGVjb2RlX3ZlcnNfMShkZXYs
IGNpcywgdHBsbGVuLCByZWcpOworCQkJcmVnICs9IHRwbGxlbjsKKwkJCWJyZWFrOworCisJ
CWRlZmF1bHQ6CisJCQlkZXZpY2VfcHJpbnRmKGRldiwKKwkJCSAgICAidW5rbm93biB0dXBs
ZSBjb2RlICUjeCwgbGVuZ3RoICVkXG4iLAorCQkJICAgIHRwbGNvZGUsIHRwbGxlbik7CisJ
CQlyZWcgKz0gdHBsbGVuOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30K
Kwordm9pZAorc2Rpb19jaXNfcHJpbnQoZGV2aWNlX3QgZGV2LCBzdHJ1Y3Qgc2Rpb19jaXMg
KmNpcykKK3sKKwlkZXZpY2VfcHJpbnRmKGRldiwgIkNJUyB2ZXJzaW9uICV1LiV1XG4iLCBj
aXMtPmNpczFfbWFqb3IsCisJICAgIGNpcy0+Y2lzMV9taW5vcik7CisKKwlkZXZpY2VfcHJp
bnRmKGRldiwgIk1hbnVmYWN0dXJlciBjb2RlIDB4JXgsIHByb2R1Y3QgMHgleFxuIiwKKwkg
ICAgY2lzLT5tYW51ZmFjdHVyZXIsIGNpcy0+cHJvZHVjdCk7CisKKwlwcmludGYoIlxuIik7
Cit9CisKKwoK
--------------020001090707090709020601--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4FC92281.9010200>