Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 23 Apr 2015 18:07:25 +0000
From:      "zbb (Zbigniew Bodek)" <phabric-noreply@FreeBSD.org>
To:        freebsd-arm@freebsd.org
Subject:   [Differential] [Request, 1, 520 lines] D2357: Port x86 busdma to ARM64
Message-ID:  <differential-rev-PHID-DREV-h7f3zkqdq4qxyli7oe3v-req@FreeBSD.org>

next in thread | raw e-mail | index | archive | help

--b1_8438b44d4f3b7e535062a5c7553b260f
Content-Type: text/plain; charset = "utf-8"
Content-Transfer-Encoding: 8bit

zbb created this revision.
zbb added reviewers: emaste, ian, imp, andrew.
zbb added a subscriber: freebsd-arm.
Herald added a subscriber: emaste.

REVISION SUMMARY
  The x86 busdma subsystem allows using multiple implementations.
  By default the classic bounce buffer approach is used, however
  on systems with IOMMU it could be in runtime switched to more
  efficient hardware accelerated implementation.
  
  This commit adds ARM64 port of the x86 busdma framework and bounce
  buffer backend. It is ready to use on IO coherent systems. If the
  IO coherency cannot be guaranteed, the cache management operations have
  to be added to this code in places marked by /* XXX ARM64TODO (...) */
  comments. Also IOMMU support might be added by registering another
  busdma implementation like it is already done on the x86.
  
  Obtained from: Semihalf
  Sponsored by: The FreeBSD Foundation

REVISION DETAIL
  https://reviews.freebsd.org/D2357

AFFECTED FILES
  sys/arm64/arm64/busdma_bounce.c
  sys/arm64/arm64/busdma_machdep.c
  sys/arm64/include/bus_dma.h
  sys/arm64/include/bus_dma_impl.h
  sys/conf/files.arm64

EMAIL PREFERENCES
  https://reviews.freebsd.org/settings/panel/emailpreferences/

To: zbb, emaste, ian, imp, andrew
Cc: emaste, freebsd-arm

--b1_8438b44d4f3b7e535062a5c7553b260f
Content-Type: text/x-patch; charset=utf-8; name="D2357.4971.patch"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="D2357.4971.patch"

ZGlmZiAtLWdpdCBhL3N5cy9jb25mL2ZpbGVzLmFybTY0IGIvc3lzL2NvbmYvZmlsZXMuYXJtNjQK
LS0tIGEvc3lzL2NvbmYvZmlsZXMuYXJtNjQKKysrIGIvc3lzL2NvbmYvZmlsZXMuYXJtNjQKQEAg
LTUsNiArNSw3IEBACiBhcm02NC9hcm02NC9iY29weS5jCQlzdGFuZGFyZAogYXJtNjQvYXJtNjQv
YnVzX21hY2hkZXAuYwlzdGFuZGFyZAogYXJtNjQvYXJtNjQvYnVzX3NwYWNlX2FzbS5TCXN0YW5k
YXJkCithcm02NC9hcm02NC9idXNkbWFfYm91bmNlLmMJc3RhbmRhcmQKIGFybTY0L2FybTY0L2J1
c2RtYV9tYWNoZGVwLmMJc3RhbmRhcmQKIGFybTY0L2FybTY0L2Nsb2NrLmMJCXN0YW5kYXJkCiBh
cm02NC9hcm02NC9jb3B5aW5vdXQuUwkJc3RhbmRhcmQKZGlmZiAtLWdpdCBhL3N5cy9hcm02NC9p
bmNsdWRlL2J1c19kbWFfaW1wbC5oIGIvc3lzL2FybTY0L2luY2x1ZGUvYnVzX2RtYV9pbXBsLmgK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvYXJtNjQvaW5jbHVk
ZS9idXNfZG1hX2ltcGwuaApAQCAtMCwwICsxLDk2IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykg
MjAxMyBUaGUgRnJlZUJTRCBGb3VuZGF0aW9uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFRoaXMgc29mdHdhcmUgd2FzIGRldmVsb3BlZCBieSBLb25zdGFudGluIEJlbG91c292IDxr
aWJARnJlZUJTRC5vcmc+CisgKiB1bmRlciBzcG9uc29yc2hpcCBmcm9tIHRoZSBGcmVlQlNEIEZv
dW5kYXRpb24uCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBU
SEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERB
TUFHRS4KKyAqCisgKiAkRnJlZUJTRCQKKyAqLworCisjaWZuZGVmCV9fQVJNNjRfQlVTX0RNQV9J
TVBMX0gKKyNkZWZpbmUJX19BUk02NF9CVVNfRE1BX0lNUExfSAorCitzdHJ1Y3QgYnVzX2RtYV90
YWdfY29tbW9uIHsKKwlzdHJ1Y3QgYnVzX2RtYV9pbXBsICppbXBsOworCXN0cnVjdCBidXNfZG1h
X3RhZ19jb21tb24gKnBhcmVudDsKKwlidXNfc2l6ZV90CSAgYWxpZ25tZW50OworCWJ1c19hZGRy
X3QJICBib3VuZGFyeTsKKwlidXNfYWRkcl90CSAgbG93YWRkcjsKKwlidXNfYWRkcl90CSAgaGln
aGFkZHI7CisJYnVzX2RtYV9maWx0ZXJfdCAqZmlsdGVyOworCXZvaWQJCSAqZmlsdGVyYXJnOwor
CWJ1c19zaXplX3QJICBtYXhzaXplOworCXVfaW50CQkgIG5zZWdtZW50czsKKwlidXNfc2l6ZV90
CSAgbWF4c2Vnc3o7CisJaW50CQkgIGZsYWdzOworCWJ1c19kbWFfbG9ja190CSAqbG9ja2Z1bmM7
CisJdm9pZAkJICpsb2NrZnVuY2FyZzsKKwlpbnQJCSAgcmVmX2NvdW50OworfTsKKworc3RydWN0
IGJ1c19kbWFfaW1wbCB7CisJaW50ICgqdGFnX2NyZWF0ZSkoYnVzX2RtYV90YWdfdCBwYXJlbnQs
CisJICAgIGJ1c19zaXplX3QgYWxpZ25tZW50LCBidXNfYWRkcl90IGJvdW5kYXJ5LCBidXNfYWRk
cl90IGxvd2FkZHIsCisJICAgIGJ1c19hZGRyX3QgaGlnaGFkZHIsIGJ1c19kbWFfZmlsdGVyX3Qg
KmZpbHRlciwKKwkgICAgdm9pZCAqZmlsdGVyYXJnLCBidXNfc2l6ZV90IG1heHNpemUsIGludCBu
c2VnbWVudHMsCisJICAgIGJ1c19zaXplX3QgbWF4c2Vnc3osIGludCBmbGFncywgYnVzX2RtYV9s
b2NrX3QgKmxvY2tmdW5jLAorCSAgICB2b2lkICpsb2NrZnVuY2FyZywgYnVzX2RtYV90YWdfdCAq
ZG1hdCk7CisJaW50ICgqdGFnX2Rlc3Ryb3kpKGJ1c19kbWFfdGFnX3QgZG1hdCk7CisJaW50ICgq
bWFwX2NyZWF0ZSkoYnVzX2RtYV90YWdfdCBkbWF0LCBpbnQgZmxhZ3MsIGJ1c19kbWFtYXBfdCAq
bWFwcCk7CisJaW50ICgqbWFwX2Rlc3Ryb3kpKGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1h
cF90IG1hcCk7CisJaW50ICgqbWVtX2FsbG9jKShidXNfZG1hX3RhZ190IGRtYXQsIHZvaWQqKiB2
YWRkciwgaW50IGZsYWdzLAorCSAgICBidXNfZG1hbWFwX3QgKm1hcHApOworCXZvaWQgKCptZW1f
ZnJlZSkoYnVzX2RtYV90YWdfdCBkbWF0LCB2b2lkICp2YWRkciwgYnVzX2RtYW1hcF90IG1hcCk7
CisJaW50ICgqbG9hZF9tYSkoYnVzX2RtYV90YWdfdCBkbWF0LCBidXNfZG1hbWFwX3QgbWFwLAor
CSAgICBzdHJ1Y3Qgdm1fcGFnZSAqKm1hLCBidXNfc2l6ZV90IHRsZW4sIGludCBtYV9vZmZzLCBp
bnQgZmxhZ3MsCisJICAgIGJ1c19kbWFfc2VnbWVudF90ICpzZWdzLCBpbnQgKnNlZ3ApOworCWlu
dCAoKmxvYWRfcGh5cykoYnVzX2RtYV90YWdfdCBkbWF0LCBidXNfZG1hbWFwX3QgbWFwLAorCSAg
ICB2bV9wYWRkcl90IGJ1ZiwgYnVzX3NpemVfdCBidWZsZW4sIGludCBmbGFncywKKwkgICAgYnVz
X2RtYV9zZWdtZW50X3QgKnNlZ3MsIGludCAqc2VncCk7CisJaW50ICgqbG9hZF9idWZmZXIpKGJ1
c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCwKKwkgICAgdm9pZCAqYnVmLCBidXNf
c2l6ZV90IGJ1ZmxlbiwgcG1hcF90IHBtYXAsIGludCBmbGFncywKKwkgICAgYnVzX2RtYV9zZWdt
ZW50X3QgKnNlZ3MsIGludCAqc2VncCk7CisJdm9pZCAoKm1hcF93YWl0b2spKGJ1c19kbWFfdGFn
X3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCwKKwkgICAgc3RydWN0IG1lbWRlc2MgKm1lbSwgYnVz
X2RtYW1hcF9jYWxsYmFja190ICpjYWxsYmFjaywKKwkgICAgdm9pZCAqY2FsbGJhY2tfYXJnKTsK
KwlidXNfZG1hX3NlZ21lbnRfdCAqKCptYXBfY29tcGxldGUpKGJ1c19kbWFfdGFnX3QgZG1hdCwg
YnVzX2RtYW1hcF90IG1hcCwKKwkgICAgYnVzX2RtYV9zZWdtZW50X3QgKnNlZ3MsIGludCBuc2Vn
cywgaW50IGVycm9yKTsKKwl2b2lkICgqbWFwX3VubG9hZCkoYnVzX2RtYV90YWdfdCBkbWF0LCBi
dXNfZG1hbWFwX3QgbWFwKTsKKwl2b2lkICgqbWFwX3N5bmMpKGJ1c19kbWFfdGFnX3QgZG1hdCwg
YnVzX2RtYW1hcF90IG1hcCwKKwkgICAgYnVzX2RtYXN5bmNfb3BfdCBvcCk7Cit9OworCit2b2lk
IGJ1c19kbWFfZGZsdF9sb2NrKHZvaWQgKmFyZywgYnVzX2RtYV9sb2NrX29wX3Qgb3ApOworaW50
IGJ1c19kbWFfcnVuX2ZpbHRlcihzdHJ1Y3QgYnVzX2RtYV90YWdfY29tbW9uICpkbWF0LCBidXNf
YWRkcl90IHBhZGRyKTsKK2ludCBjb21tb25fYnVzX2RtYV90YWdfY3JlYXRlKHN0cnVjdCBidXNf
ZG1hX3RhZ19jb21tb24gKnBhcmVudCwKKyAgICBidXNfc2l6ZV90IGFsaWdubWVudCwKKyAgICBi
dXNfYWRkcl90IGJvdW5kYXJ5LCBidXNfYWRkcl90IGxvd2FkZHIsIGJ1c19hZGRyX3QgaGlnaGFk
ZHIsCisgICAgYnVzX2RtYV9maWx0ZXJfdCAqZmlsdGVyLCB2b2lkICpmaWx0ZXJhcmcsIGJ1c19z
aXplX3QgbWF4c2l6ZSwKKyAgICBpbnQgbnNlZ21lbnRzLCBidXNfc2l6ZV90IG1heHNlZ3N6LCBp
bnQgZmxhZ3MsIGJ1c19kbWFfbG9ja190ICpsb2NrZnVuYywKKyAgICB2b2lkICpsb2NrZnVuY2Fy
Zywgc2l6ZV90IHN6LCB2b2lkICoqZG1hdCk7CisKK2V4dGVybiBzdHJ1Y3QgYnVzX2RtYV9pbXBs
IGJ1c19kbWFfYm91bmNlX2ltcGw7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzL2FybTY0L2lu
Y2x1ZGUvYnVzX2RtYS5oIGIvc3lzL2FybTY0L2luY2x1ZGUvYnVzX2RtYS5oCi0tLSBhL3N5cy9h
cm02NC9pbmNsdWRlL2J1c19kbWEuaAorKysgYi9zeXMvYXJtNjQvaW5jbHVkZS9idXNfZG1hLmgK
QEAgLTEsOCArMSwzNCBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgU2NvdHQgTG9uZwor
ICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIFRIRSBORVRCU0QgRk9VTkRBVElPTiwgSU5DLiBBTkQgQ09OVFJJQlVUT1JT
CisgKiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyAqIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEZPVU5EQVRJT04gT1IgQ09O
VFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCiAvKiAkRnJl
ZUJTRCQgKi8KIAotI2lmbmRlZiBfTUFDSElORV9CVVNfRE1BX0hfCi0jZGVmaW5lCV9NQUNISU5F
X0JVU19ETUFfSF8KKyNpZm5kZWYgX0FSTTY0X0JVU19ETUFfSF8KKyNkZWZpbmUgX0FSTTY0X0JV
U19ETUFfSF8KIAogI2luY2x1ZGUgPHN5cy9idXNfZG1hLmg+CiAKLSNlbmRpZiAvKiAhX01BQ0hJ
TkVfQlVTX0RNQV9IXyAqLworI2VuZGlmIC8qIF9BUk02NF9CVVNfRE1BX0hfICovCmRpZmYgLS1n
aXQgYS9zeXMvYXJtNjQvYXJtNjQvYnVzZG1hX21hY2hkZXAuYyBiL3N5cy9hcm02NC9hcm02NC9i
dXNkbWFfbWFjaGRlcC5jCi0tLSBhL3N5cy9hcm02NC9hcm02NC9idXNkbWFfbWFjaGRlcC5jCisr
KyBiL3N5cy9hcm02NC9hcm02NC9idXNkbWFfbWFjaGRlcC5jCkBAIC0xLDY4ICsxLDM1NSBAQAot
LyogJEZyZWVCU0QkICovCisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5NywgMTk5OCBKdXN0aW4g
VC4gR2liYnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTUgVGhlIEZyZWVCU0QgRm91bmRh
dGlvbgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIHdhcyBk
ZXZlbG9wZWQgYnkgS29uc3RhbnRpbiBCZWxvdXNvdiA8a2liQEZyZWVCU0Qub3JnPgorICogdW5k
ZXIgc3BvbnNvcnNoaXAgZnJvbSB0aGUgRnJlZUJTRCBGb3VuZGF0aW9uLgorICoKKyAqIFBvcnRp
b25zIG9mIHRoaXMgc29mdHdhcmUgd2VyZSBkZXZlbG9wZWQgYnkgU2VtaWhhbGYKKyAqIHVuZGVy
IHNwb25zb3JzaGlwIG9mIHRoZSBGcmVlQlNEIEZvdW5kYXRpb24uCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAq
ICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBpbW1lZGlhdGVseSBhdCB0aGUgYmVnaW5uaW5nIG9m
IHRoZSBmaWxlLgorICogMi4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQg
dG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBz
b2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9S
UyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisg
KiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMK
KyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1Ig
VE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCiAKICNpbmNsdWRlIDxz
eXMvY2RlZnMuaD4KIF9fRkJTRElEKCIkRnJlZUJTRCQiKTsKIAogI2luY2x1ZGUgPHN5cy9wYXJh
bS5oPgogI2luY2x1ZGUgPHN5cy9zeXN0bS5oPgotCisjaW5jbHVkZSA8c3lzL21hbGxvYy5oPgor
I2luY2x1ZGUgPHN5cy9idXMuaD4KKyNpbmNsdWRlIDxzeXMva2VybmVsLmg+CisjaW5jbHVkZSA8
c3lzL2t0ci5oPgorI2luY2x1ZGUgPHN5cy9sb2NrLmg+CisjaW5jbHVkZSA8c3lzL21lbWRlc2Mu
aD4KKyNpbmNsdWRlIDxzeXMvbXV0ZXguaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CiAjaW5jbHVk
ZSA8dm0vdm0uaD4KKyNpbmNsdWRlIDx2bS92bV9leHRlcm4uaD4KICNpbmNsdWRlIDx2bS9wbWFw
Lmg+CiAKICNpbmNsdWRlIDxtYWNoaW5lL2J1cy5oPgorI2luY2x1ZGUgPGFybTY0L2luY2x1ZGUv
YnVzX2RtYV9pbXBsLmg+CisKKy8qCisgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgbWFuaXB1
bGF0aW5nIGRyaXZlciBsb2NrcyBmcm9tIGJ1c2RtYSAoZHVyaW5nCisgKiBidXNkbWFfc3dpLCBm
b3IgZXhhbXBsZSkuICBEcml2ZXJzIHRoYXQgZG9uJ3QgcHJvdmlkZSB0aGVpciBvd24gbG9ja3MK
KyAqIHNob3VsZCBzcGVjaWZ5ICZHaWFudCB0byBkbWF0LT5sb2NrZnVuY2FyZy4gIERyaXZlcnMg
dGhhdCB1c2UgdGhlaXIgb3duCisgKiBub24tbXV0ZXggbG9ja2luZyBzY2hlbWUgZG9uJ3QgaGF2
ZSB0byB1c2UgdGhpcyBhdCBhbGwuCisgKi8KK3ZvaWQKK2J1c2RtYV9sb2NrX211dGV4KHZvaWQg
KmFyZywgYnVzX2RtYV9sb2NrX29wX3Qgb3ApCit7CisJc3RydWN0IG10eCAqZG10eDsKKworCWRt
dHggPSAoc3RydWN0IG10eCAqKWFyZzsKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBCVVNfRE1BX0xP
Q0s6CisJCW10eF9sb2NrKGRtdHgpOworCQlicmVhazsKKwljYXNlIEJVU19ETUFfVU5MT0NLOgor
CQltdHhfdW5sb2NrKGRtdHgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwYW5pYygiVW5rbm93
biBvcGVyYXRpb24gMHgleCBmb3IgYnVzZG1hX2xvY2tfbXV0ZXghIiwgb3ApOworCX0KK30KKwor
LyoKKyAqIGRmbHRfbG9jayBzaG91bGQgbmV2ZXIgZ2V0IGNhbGxlZC4gIEl0IGdldHMgcHV0IGlu
dG8gdGhlIGRtYSB0YWcgd2hlbgorICogbG9ja2Z1bmMgPT0gTlVMTCwgd2hpY2ggaXMgb25seSB2
YWxpZCBpZiB0aGUgbWFwcyB0aGF0IGFyZSBhc3NvY2lhdGVkCisgKiB3aXRoIHRoZSB0YWcgYXJl
IG1lYW50IHRvIG5ldmVyIGJlIGRlZmVyZWQuCisgKiBYWFggU2hvdWxkIGhhdmUgYSB3YXkgdG8g
aWRlbnRpZnkgd2hpY2ggZHJpdmVyIGlzIHJlc3BvbnNpYmxlIGhlcmUuCisgKi8KK3ZvaWQKK2J1
c19kbWFfZGZsdF9sb2NrKHZvaWQgKmFyZywgYnVzX2RtYV9sb2NrX29wX3Qgb3ApCit7CisKKwlw
YW5pYygiZHJpdmVyIGVycm9yOiBidXNkbWEgZGZsdF9sb2NrIGNhbGxlZCIpOworfQorCisvKgor
ICogUmV0dXJuIHRydWUgaWYgYSBtYXRjaCBpcyBtYWRlLgorICoKKyAqIFRvIGZpbmQgYSBtYXRj
aCB3YWxrIHRoZSBjaGFpbiBvZiBidXNfZG1hX3RhZ190J3MgbG9va2luZyBmb3IgJ3BhZGRyJy4K
KyAqCisgKiBJZiBwYWRkciBpcyB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGUgZG1hIHRhZyB0aGVu
IGNhbGwgdGhlIGZpbHRlciBjYWxsYmFjaworICogdG8gY2hlY2sgZm9yIGEgbWF0Y2gsIGlmIHRo
ZXJlIGlzIG5vIGZpbHRlciBjYWxsYmFjayB0aGVuIGFzc3VtZSBhIG1hdGNoLgorICovCitpbnQK
K2J1c19kbWFfcnVuX2ZpbHRlcihzdHJ1Y3QgYnVzX2RtYV90YWdfY29tbW9uICp0YywgYnVzX2Fk
ZHJfdCBwYWRkcikKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gMDsKKwlkbyB7CisJCWlm
ICgoKHBhZGRyID4gdGMtPmxvd2FkZHIgJiYgcGFkZHIgPD0gdGMtPmhpZ2hhZGRyKSB8fAorCQkg
ICAgKChwYWRkciAmICh0Yy0+YWxpZ25tZW50IC0gMSkpICE9IDApKSAmJgorCQkgICAgKHRjLT5m
aWx0ZXIgPT0gTlVMTCB8fAorCQkgICAgKCp0Yy0+ZmlsdGVyKSh0Yy0+ZmlsdGVyYXJnLCBwYWRk
cikgIT0gMCkpCisJCQlyZXR2YWwgPSAxOworCisJCXRjID0gdGMtPnBhcmVudDsJCQorCX0gd2hp
bGUgKHJldHZhbCA9PSAwICYmIHRjICE9IE5VTEwpOworCXJldHVybiAocmV0dmFsKTsKK30KKwor
aW50Citjb21tb25fYnVzX2RtYV90YWdfY3JlYXRlKHN0cnVjdCBidXNfZG1hX3RhZ19jb21tb24g
KnBhcmVudCwKKyAgICBidXNfc2l6ZV90IGFsaWdubWVudCwgYnVzX2FkZHJfdCBib3VuZGFyeSwg
YnVzX2FkZHJfdCBsb3dhZGRyLAorICAgIGJ1c19hZGRyX3QgaGlnaGFkZHIsIGJ1c19kbWFfZmls
dGVyX3QgKmZpbHRlciwgdm9pZCAqZmlsdGVyYXJnLAorICAgIGJ1c19zaXplX3QgbWF4c2l6ZSwg
aW50IG5zZWdtZW50cywgYnVzX3NpemVfdCBtYXhzZWdzeiwgaW50IGZsYWdzLAorICAgIGJ1c19k
bWFfbG9ja190ICpsb2NrZnVuYywgdm9pZCAqbG9ja2Z1bmNhcmcsIHNpemVfdCBzeiwgdm9pZCAq
KmRtYXQpCit7CisJdm9pZCAqbmV3dGFnOworCXN0cnVjdCBidXNfZG1hX3RhZ19jb21tb24gKmNv
bW1vbjsKKworCUtBU1NFUlQoc3ogPj0gc2l6ZW9mKHN0cnVjdCBidXNfZG1hX3RhZ19jb21tb24p
LCAoInN6IikpOworCS8qIEJhc2ljIHNhbml0eSBjaGVja2luZyAqLworCWlmIChib3VuZGFyeSAh
PSAwICYmIGJvdW5kYXJ5IDwgbWF4c2Vnc3opCisJCW1heHNlZ3N6ID0gYm91bmRhcnk7CisJaWYg
KG1heHNlZ3N6ID09IDApCisJCXJldHVybiAoRUlOVkFMKTsKKwkvKiBSZXR1cm4gYSBOVUxMIHRh
ZyBvbiBmYWlsdXJlICovCisJKmRtYXQgPSBOVUxMOworCisJbmV3dGFnID0gbWFsbG9jKHN6LCBN
X0RFVkJVRiwgTV9aRVJPIHwgTV9OT1dBSVQpOworCWlmIChuZXd0YWcgPT0gTlVMTCkgeworCQlD
VFI0KEtUUl9CVVNETUEsICIlcyByZXR1cm5lZCB0YWcgJXAgdGFnIGZsYWdzIDB4JXggZXJyb3Ig
JWQiLAorCQkgICAgX19mdW5jX18sIG5ld3RhZywgMCwgRU5PTUVNKTsKKwkJcmV0dXJuIChFTk9N
RU0pOworCX0KKworCWNvbW1vbiA9IG5ld3RhZzsKKwljb21tb24tPmltcGwgPSAmYnVzX2RtYV9i
b3VuY2VfaW1wbDsKKwljb21tb24tPnBhcmVudCA9IHBhcmVudDsKKwljb21tb24tPmFsaWdubWVu
dCA9IGFsaWdubWVudDsKKwljb21tb24tPmJvdW5kYXJ5ID0gYm91bmRhcnk7CisJY29tbW9uLT5s
b3dhZGRyID0gdHJ1bmNfcGFnZSgodm1fcGFkZHJfdClsb3dhZGRyKSArIChQQUdFX1NJWkUgLSAx
KTsKKwljb21tb24tPmhpZ2hhZGRyID0gdHJ1bmNfcGFnZSgodm1fcGFkZHJfdCloaWdoYWRkcikg
KyAoUEFHRV9TSVpFIC0gMSk7CisJY29tbW9uLT5maWx0ZXIgPSBmaWx0ZXI7CisJY29tbW9uLT5m
aWx0ZXJhcmcgPSBmaWx0ZXJhcmc7CisJY29tbW9uLT5tYXhzaXplID0gbWF4c2l6ZTsKKwljb21t
b24tPm5zZWdtZW50cyA9IG5zZWdtZW50czsKKwljb21tb24tPm1heHNlZ3N6ID0gbWF4c2Vnc3o7
CisJY29tbW9uLT5mbGFncyA9IGZsYWdzOworCWNvbW1vbi0+cmVmX2NvdW50ID0gMTsgLyogQ291
bnQgb3Vyc2VsZiAqLworCWlmIChsb2NrZnVuYyAhPSBOVUxMKSB7CisJCWNvbW1vbi0+bG9ja2Z1
bmMgPSBsb2NrZnVuYzsKKwkJY29tbW9uLT5sb2NrZnVuY2FyZyA9IGxvY2tmdW5jYXJnOworCX0g
ZWxzZSB7CisJCWNvbW1vbi0+bG9ja2Z1bmMgPSBidXNfZG1hX2RmbHRfbG9jazsKKwkJY29tbW9u
LT5sb2NrZnVuY2FyZyA9IE5VTEw7CisJfQorCisJLyogVGFrZSBpbnRvIGFjY291bnQgYW55IHJl
c3RyaWN0aW9ucyBpbXBvc2VkIGJ5IG91ciBwYXJlbnQgdGFnICovCisJaWYgKHBhcmVudCAhPSBO
VUxMKSB7CisJCWNvbW1vbi0+aW1wbCA9IHBhcmVudC0+aW1wbDsKKwkJY29tbW9uLT5sb3dhZGRy
ID0gTUlOKHBhcmVudC0+bG93YWRkciwgY29tbW9uLT5sb3dhZGRyKTsKKwkJY29tbW9uLT5oaWdo
YWRkciA9IE1BWChwYXJlbnQtPmhpZ2hhZGRyLCBjb21tb24tPmhpZ2hhZGRyKTsKKwkJaWYgKGNv
bW1vbi0+Ym91bmRhcnkgPT0gMCkKKwkJCWNvbW1vbi0+Ym91bmRhcnkgPSBwYXJlbnQtPmJvdW5k
YXJ5OworCQllbHNlIGlmIChwYXJlbnQtPmJvdW5kYXJ5ICE9IDApIHsKKwkJCWNvbW1vbi0+Ym91
bmRhcnkgPSBNSU4ocGFyZW50LT5ib3VuZGFyeSwKKwkJCSAgICBjb21tb24tPmJvdW5kYXJ5KTsK
KwkJfQorCQlpZiAoY29tbW9uLT5maWx0ZXIgPT0gTlVMTCkgeworCQkJLyoKKwkJCSAqIFNob3J0
IGNpcmN1aXQgbG9va2luZyBhdCBvdXIgcGFyZW50IGRpcmVjdGx5CisJCQkgKiBzaW5jZSB3ZSBo
YXZlIGVuY2Fwc3VsYXRlZCBhbGwgb2YgaXRzIGluZm9ybWF0aW9uCisJCQkgKi8KKwkJCWNvbW1v
bi0+ZmlsdGVyID0gcGFyZW50LT5maWx0ZXI7CisJCQljb21tb24tPmZpbHRlcmFyZyA9IHBhcmVu
dC0+ZmlsdGVyYXJnOworCQkJY29tbW9uLT5wYXJlbnQgPSBwYXJlbnQtPnBhcmVudDsKKwkJfQor
CQlhdG9taWNfYWRkX2ludCgmcGFyZW50LT5yZWZfY291bnQsIDEpOworCX0KKwkqZG1hdCA9IGNv
bW1vbjsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogQWxsb2NhdGUgYSBkZXZpY2Ugc3BlY2lm
aWMgZG1hX3RhZy4KKyAqLworaW50CitidXNfZG1hX3RhZ19jcmVhdGUoYnVzX2RtYV90YWdfdCBw
YXJlbnQsIGJ1c19zaXplX3QgYWxpZ25tZW50LAorICAgIGJ1c19hZGRyX3QgYm91bmRhcnksIGJ1
c19hZGRyX3QgbG93YWRkciwgYnVzX2FkZHJfdCBoaWdoYWRkciwKKyAgICBidXNfZG1hX2ZpbHRl
cl90ICpmaWx0ZXIsIHZvaWQgKmZpbHRlcmFyZywgYnVzX3NpemVfdCBtYXhzaXplLAorICAgIGlu
dCBuc2VnbWVudHMsIGJ1c19zaXplX3QgbWF4c2Vnc3osIGludCBmbGFncywgYnVzX2RtYV9sb2Nr
X3QgKmxvY2tmdW5jLAorICAgIHZvaWQgKmxvY2tmdW5jYXJnLCBidXNfZG1hX3RhZ190ICpkbWF0
KQoreworCXN0cnVjdCBidXNfZG1hX3RhZ19jb21tb24gKnRjOworCWludCBlcnJvcjsKKworCWlm
IChwYXJlbnQgPT0gTlVMTCkgeworCQllcnJvciA9IGJ1c19kbWFfYm91bmNlX2ltcGwudGFnX2Ny
ZWF0ZShwYXJlbnQsIGFsaWdubWVudCwKKwkJICAgIGJvdW5kYXJ5LCBsb3dhZGRyLCBoaWdoYWRk
ciwgZmlsdGVyLCBmaWx0ZXJhcmcsIG1heHNpemUsCisJCSAgICBuc2VnbWVudHMsIG1heHNlZ3N6
LCBmbGFncywgbG9ja2Z1bmMsIGxvY2tmdW5jYXJnLCBkbWF0KTsKKwl9IGVsc2UgeworCQl0YyA9
IChzdHJ1Y3QgYnVzX2RtYV90YWdfY29tbW9uICopcGFyZW50OworCQllcnJvciA9IHRjLT5pbXBs
LT50YWdfY3JlYXRlKHBhcmVudCwgYWxpZ25tZW50LAorCQkgICAgYm91bmRhcnksIGxvd2FkZHIs
IGhpZ2hhZGRyLCBmaWx0ZXIsIGZpbHRlcmFyZywgbWF4c2l6ZSwKKwkJICAgIG5zZWdtZW50cywg
bWF4c2Vnc3osIGZsYWdzLCBsb2NrZnVuYywgbG9ja2Z1bmNhcmcsIGRtYXQpOworCX0KKwlyZXR1
cm4gKGVycm9yKTsKK30KKworaW50CitidXNfZG1hX3RhZ19kZXN0cm95KGJ1c19kbWFfdGFnX3Qg
ZG1hdCkKK3sKKwlzdHJ1Y3QgYnVzX2RtYV90YWdfY29tbW9uICp0YzsKKworCXRjID0gKHN0cnVj
dCBidXNfZG1hX3RhZ19jb21tb24gKilkbWF0OworCXJldHVybiAodGMtPmltcGwtPnRhZ19kZXN0
cm95KGRtYXQpKTsKK30KKworLyoKKyAqIEFsbG9jYXRlIGEgaGFuZGxlIGZvciBtYXBwaW5nIGZy
b20ga3ZhL3V2YS9waHlzaWNhbAorICogYWRkcmVzcyBzcGFjZSBpbnRvIGJ1cyBkZXZpY2Ugc3Bh
Y2UuCisgKi8KK2ludAorYnVzX2RtYW1hcF9jcmVhdGUoYnVzX2RtYV90YWdfdCBkbWF0LCBpbnQg
ZmxhZ3MsIGJ1c19kbWFtYXBfdCAqbWFwcCkKK3sKKwlzdHJ1Y3QgYnVzX2RtYV90YWdfY29tbW9u
ICp0YzsKKworCXRjID0gKHN0cnVjdCBidXNfZG1hX3RhZ19jb21tb24gKilkbWF0OworCXJldHVy
biAodGMtPmltcGwtPm1hcF9jcmVhdGUoZG1hdCwgZmxhZ3MsIG1hcHApKTsKK30KKworLyoKKyAq
IERlc3Ryb3kgYSBoYW5kbGUgZm9yIG1hcHBpbmcgZnJvbSBrdmEvdXZhL3BoeXNpY2FsCisgKiBh
ZGRyZXNzIHNwYWNlIGludG8gYnVzIGRldmljZSBzcGFjZS4KKyAqLworaW50CitidXNfZG1hbWFw
X2Rlc3Ryb3koYnVzX2RtYV90YWdfdCBkbWF0LCBidXNfZG1hbWFwX3QgbWFwKQoreworCXN0cnVj
dCBidXNfZG1hX3RhZ19jb21tb24gKnRjOworCisJdGMgPSAoc3RydWN0IGJ1c19kbWFfdGFnX2Nv
bW1vbiAqKWRtYXQ7CisJcmV0dXJuICh0Yy0+aW1wbC0+bWFwX2Rlc3Ryb3koZG1hdCwgbWFwKSk7
Cit9CisKKworLyoKKyAqIEFsbG9jYXRlIGEgcGllY2Ugb2YgbWVtb3J5IHRoYXQgY2FuIGJlIGVm
ZmljaWVudGx5IG1hcHBlZCBpbnRvCisgKiBidXMgZGV2aWNlIHNwYWNlIGJhc2VkIG9uIHRoZSBj
b25zdHJhaW50cyBsaXN0ZWQgaW4gdGhlIGRtYSB0YWcuCisgKiBBIGRtYW1hcCB0byBmb3IgdXNl
IHdpdGggZG1hbWFwX2xvYWQgaXMgYWxzbyBhbGxvY2F0ZWQuCisgKi8KK2ludAorYnVzX2RtYW1l
bV9hbGxvYyhidXNfZG1hX3RhZ190IGRtYXQsIHZvaWQqKiB2YWRkciwgaW50IGZsYWdzLAorICAg
IGJ1c19kbWFtYXBfdCAqbWFwcCkKK3sKKwlzdHJ1Y3QgYnVzX2RtYV90YWdfY29tbW9uICp0YzsK
KworCXRjID0gKHN0cnVjdCBidXNfZG1hX3RhZ19jb21tb24gKilkbWF0OworCXJldHVybiAodGMt
PmltcGwtPm1lbV9hbGxvYyhkbWF0LCB2YWRkciwgZmxhZ3MsIG1hcHApKTsKK30KKworLyoKKyAq
IEZyZWUgYSBwaWVjZSBvZiBtZW1vcnkgYW5kIGl0J3MgYWxsb2NpYXRlZCBkbWFtYXAsIHRoYXQg
d2FzIGFsbG9jYXRlZAorICogdmlhIGJ1c19kbWFtZW1fYWxsb2MuICBNYWtlIHRoZSBzYW1lIGNo
b2ljZSBmb3IgZnJlZS9jb250aWdmcmVlLgorICovCit2b2lkCitidXNfZG1hbWVtX2ZyZWUoYnVz
X2RtYV90YWdfdCBkbWF0LCB2b2lkICp2YWRkciwgYnVzX2RtYW1hcF90IG1hcCkKK3sKKwlzdHJ1
Y3QgYnVzX2RtYV90YWdfY29tbW9uICp0YzsKKworCXRjID0gKHN0cnVjdCBidXNfZG1hX3RhZ19j
b21tb24gKilkbWF0OworCXRjLT5pbXBsLT5tZW1fZnJlZShkbWF0LCB2YWRkciwgbWFwKTsKK30K
IAogaW50CiBfYnVzX2RtYW1hcF9sb2FkX3BoeXMoYnVzX2RtYV90YWdfdCBkbWF0LCBidXNfZG1h
bWFwX3QgbWFwLCB2bV9wYWRkcl90IGJ1ZiwKICAgICBidXNfc2l6ZV90IGJ1ZmxlbiwgaW50IGZs
YWdzLCBidXNfZG1hX3NlZ21lbnRfdCAqc2VncywgaW50ICpzZWdwKQogeworCXN0cnVjdCBidXNf
ZG1hX3RhZ19jb21tb24gKnRjOwogCi0JcGFuaWMoIl9idXNfZG1hbWFwX2xvYWRfcGh5cyIpOwor
CXRjID0gKHN0cnVjdCBidXNfZG1hX3RhZ19jb21tb24gKilkbWF0OworCXJldHVybiAodGMtPmlt
cGwtPmxvYWRfcGh5cyhkbWF0LCBtYXAsIGJ1ZiwgYnVmbGVuLCBmbGFncywgc2VncywKKwkgICAg
c2VncCkpOwogfQogCiBpbnQKIF9idXNfZG1hbWFwX2xvYWRfbWEoYnVzX2RtYV90YWdfdCBkbWF0
LCBidXNfZG1hbWFwX3QgbWFwLCBzdHJ1Y3Qgdm1fcGFnZSAqKm1hLAogICAgIGJ1c19zaXplX3Qg
dGxlbiwgaW50IG1hX29mZnMsIGludCBmbGFncywgYnVzX2RtYV9zZWdtZW50X3QgKnNlZ3MsCiAg
ICAgaW50ICpzZWdwKQogeworCXN0cnVjdCBidXNfZG1hX3RhZ19jb21tb24gKnRjOwogCi0JcGFu
aWMoIl9idXNfZG1hbWFwX2xvYWRfbWEiKTsKKwl0YyA9IChzdHJ1Y3QgYnVzX2RtYV90YWdfY29t
bW9uICopZG1hdDsKKwlyZXR1cm4gKHRjLT5pbXBsLT5sb2FkX21hKGRtYXQsIG1hcCwgbWEsIHRs
ZW4sIG1hX29mZnMsIGZsYWdzLAorCSAgICBzZWdzLCBzZWdwKSk7CiB9CiAKIGludAogX2J1c19k
bWFtYXBfbG9hZF9idWZmZXIoYnVzX2RtYV90YWdfdCBkbWF0LCBidXNfZG1hbWFwX3QgbWFwLCB2
b2lkICpidWYsCiAgICAgYnVzX3NpemVfdCBidWZsZW4sIHBtYXBfdCBwbWFwLCBpbnQgZmxhZ3Ms
IGJ1c19kbWFfc2VnbWVudF90ICpzZWdzLAogICAgIGludCAqc2VncCkKIHsKKwlzdHJ1Y3QgYnVz
X2RtYV90YWdfY29tbW9uICp0YzsKIAotCXBhbmljKCJfYnVzX2RtYW1hcF9sb2FkX2J1ZmZlciIp
OworCXRjID0gKHN0cnVjdCBidXNfZG1hX3RhZ19jb21tb24gKilkbWF0OworCXJldHVybiAodGMt
PmltcGwtPmxvYWRfYnVmZmVyKGRtYXQsIG1hcCwgYnVmLCBidWZsZW4sIHBtYXAsIGZsYWdzLCBz
ZWdzLAorCSAgICBzZWdwKSk7CiB9CiAKIHZvaWQKIF9fYnVzX2RtYW1hcF93YWl0b2soYnVzX2Rt
YV90YWdfdCBkbWF0LCBidXNfZG1hbWFwX3QgbWFwLAogICAgIHN0cnVjdCBtZW1kZXNjICptZW0s
IGJ1c19kbWFtYXBfY2FsbGJhY2tfdCAqY2FsbGJhY2ssIHZvaWQgKmNhbGxiYWNrX2FyZykKIHsK
KwlzdHJ1Y3QgYnVzX2RtYV90YWdfY29tbW9uICp0YzsKIAotCXBhbmljKCJfX2J1c19kbWFtYXBf
d2FpdG9rIik7CisJdGMgPSAoc3RydWN0IGJ1c19kbWFfdGFnX2NvbW1vbiAqKWRtYXQ7CisJdGMt
PmltcGwtPm1hcF93YWl0b2soZG1hdCwgbWFwLCBtZW0sIGNhbGxiYWNrLCBjYWxsYmFja19hcmcp
OwogfQogCiBidXNfZG1hX3NlZ21lbnRfdCAqCiBfYnVzX2RtYW1hcF9jb21wbGV0ZShidXNfZG1h
X3RhZ190IGRtYXQsIGJ1c19kbWFtYXBfdCBtYXAsCiAgICAgYnVzX2RtYV9zZWdtZW50X3QgKnNl
Z3MsIGludCBuc2VncywgaW50IGVycm9yKQogeworCXN0cnVjdCBidXNfZG1hX3RhZ19jb21tb24g
KnRjOwogCi0JcGFuaWMoIl9idXNfZG1hbWFwX2NvbXBsZXRlIik7CisJdGMgPSAoc3RydWN0IGJ1
c19kbWFfdGFnX2NvbW1vbiAqKWRtYXQ7CisJcmV0dXJuICh0Yy0+aW1wbC0+bWFwX2NvbXBsZXRl
KGRtYXQsIG1hcCwgc2VncywgbnNlZ3MsIGVycm9yKSk7CiB9CiAKKy8qCisgKiBSZWxlYXNlIHRo
ZSBtYXBwaW5nIGhlbGQgYnkgbWFwLgorICovCiB2b2lkCiBfYnVzX2RtYW1hcF91bmxvYWQoYnVz
X2RtYV90YWdfdCBkbWF0LCBidXNfZG1hbWFwX3QgbWFwKQogeworCXN0cnVjdCBidXNfZG1hX3Rh
Z19jb21tb24gKnRjOwogCi0JcGFuaWMoIl9idXNfZG1hbWFwX3VubG9hZCIpOworCXRjID0gKHN0
cnVjdCBidXNfZG1hX3RhZ19jb21tb24gKilkbWF0OworCXRjLT5pbXBsLT5tYXBfdW5sb2FkKGRt
YXQsIG1hcCk7CiB9CiAKIHZvaWQKIF9idXNfZG1hbWFwX3N5bmMoYnVzX2RtYV90YWdfdCBkbWF0
LCBidXNfZG1hbWFwX3QgbWFwLCBidXNfZG1hc3luY19vcF90IG9wKQogeworCXN0cnVjdCBidXNf
ZG1hX3RhZ19jb21tb24gKnRjOwogCi0JcGFuaWMoIl9idXNfZG1hbWFwX3N5bmMiKTsKKwl0YyA9
IChzdHJ1Y3QgYnVzX2RtYV90YWdfY29tbW9uICopZG1hdDsKKwl0Yy0+aW1wbC0+bWFwX3N5bmMo
ZG1hdCwgbWFwLCBvcCk7CiB9CmRpZmYgLS1naXQgYS9zeXMvYXJtNjQvYXJtNjQvYnVzZG1hX2Jv
dW5jZS5jIGIvc3lzL2FybTY0L2FybTY0L2J1c2RtYV9ib3VuY2UuYwpuZXcgZmlsZSBtb2RlIDEw
MDY0NAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9hcm02NC9hcm02NC9idXNkbWFfYm91bmNlLmMK
QEAgLTAsMCArMSwxMDg2IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5NywgMTk5OCBKdXN0
aW4gVC4gR2liYnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIEZyZWVCU0QgRm91bmRhdGlv
bgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3
YXJlIHdlcmUgZGV2ZWxvcGVkIGJ5IFNlbWloYWxmCisgKiB1bmRlciBzcG9uc29yc2hpcCBvZiB0
aGUgRnJlZUJTRCBGb3VuZGF0aW9uLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlm
aWNhdGlvbiwgaW1tZWRpYXRlbHkgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KKyAqIDIu
IFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJv
bW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBz
cGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAor
ICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikK
KyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhF
IFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CitfX0ZC
U0RJRCgiJEZyZWVCU0QkIik7CisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxz
eXMvc3lzdG0uaD4KKyNpbmNsdWRlIDxzeXMvbWFsbG9jLmg+CisjaW5jbHVkZSA8c3lzL2J1cy5o
PgorI2luY2x1ZGUgPHN5cy9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxzeXMva2VybmVsLmg+Cisj
aW5jbHVkZSA8c3lzL2t0ci5oPgorI2luY2x1ZGUgPHN5cy9sb2NrLmg+CisjaW5jbHVkZSA8c3lz
L3Byb2MuaD4KKyNpbmNsdWRlIDxzeXMvbWVtZGVzYy5oPgorI2luY2x1ZGUgPHN5cy9tdXRleC5o
PgorI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisKKyNpbmNs
dWRlIDx2bS92bS5oPgorI2luY2x1ZGUgPHZtL3ZtX2V4dGVybi5oPgorI2luY2x1ZGUgPHZtL3Zt
X2tlcm4uaD4KKyNpbmNsdWRlIDx2bS92bV9wYWdlLmg+CisjaW5jbHVkZSA8dm0vdm1fbWFwLmg+
CisKKyNpbmNsdWRlIDxtYWNoaW5lL2F0b21pYy5oPgorI2luY2x1ZGUgPG1hY2hpbmUvYnVzLmg+
CisjaW5jbHVkZSA8bWFjaGluZS9tZF92YXIuaD4KKyNpbmNsdWRlIDxhcm02NC9pbmNsdWRlL2J1
c19kbWFfaW1wbC5oPgorCisjZGVmaW5lIE1BWF9CUEFHRVMgNDA5NgorCitlbnVtIHsKKwlCVVNf
RE1BX0NPVUxEX0JPVU5DRQk9IDB4MDEsCisJQlVTX0RNQV9NSU5fQUxMT0NfQ09NUAk9IDB4MDIs
CisJQlVTX0RNQV9LTUVNX0FMTE9DCT0gMHgwNCwKK307CisKK3N0cnVjdCBib3VuY2Vfem9uZTsK
Kworc3RydWN0IGJ1c19kbWFfdGFnIHsKKwlzdHJ1Y3QgYnVzX2RtYV90YWdfY29tbW9uIGNvbW1v
bjsKKwlpbnQJCQltYXBfY291bnQ7CisJaW50CQkJYm91bmNlX2ZsYWdzOworCWJ1c19kbWFfc2Vn
bWVudF90CSpzZWdtZW50czsKKwlzdHJ1Y3QgYm91bmNlX3pvbmUJKmJvdW5jZV96b25lOworfTsK
Kworc3RydWN0IGJvdW5jZV9wYWdlIHsKKwl2bV9vZmZzZXRfdAl2YWRkcjsJCS8qIGt2YSBvZiBi
b3VuY2UgYnVmZmVyICovCisJYnVzX2FkZHJfdAlidXNhZGRyOwkvKiBQaHlzaWNhbCBhZGRyZXNz
ICovCisJdm1fb2Zmc2V0X3QJZGF0YXZhZGRyOwkvKiBrdmEgb2YgY2xpZW50IGRhdGEgKi8KKwli
dXNfYWRkcl90CWRhdGFhZGRyOwkvKiBjbGllbnQgcGh5c2ljYWwgYWRkcmVzcyAqLworCWJ1c19z
aXplX3QJZGF0YWNvdW50OwkvKiBjbGllbnQgZGF0YSBjb3VudCAqLworCVNUQUlMUV9FTlRSWShi
b3VuY2VfcGFnZSkgbGlua3M7Cit9OworCitpbnQgYnVzZG1hX3N3aV9wZW5kaW5nOworCitzdHJ1
Y3QgYm91bmNlX3pvbmUgeworCVNUQUlMUV9FTlRSWShib3VuY2Vfem9uZSkgbGlua3M7CisJU1RB
SUxRX0hFQUQoYnBfbGlzdCwgYm91bmNlX3BhZ2UpIGJvdW5jZV9wYWdlX2xpc3Q7CisJaW50CQl0
b3RhbF9icGFnZXM7CisJaW50CQlmcmVlX2JwYWdlczsKKwlpbnQJCXJlc2VydmVkX2JwYWdlczsK
KwlpbnQJCWFjdGl2ZV9icGFnZXM7CisJaW50CQl0b3RhbF9ib3VuY2VkOworCWludAkJdG90YWxf
ZGVmZXJyZWQ7CisJaW50CQltYXBfY291bnQ7CisJYnVzX3NpemVfdAlhbGlnbm1lbnQ7CisJYnVz
X2FkZHJfdAlsb3dhZGRyOworCWNoYXIJCXpvbmVpZFs4XTsKKwljaGFyCQlsb3dhZGRyaWRbMjBd
OworCXN0cnVjdCBzeXNjdGxfY3R4X2xpc3Qgc3lzY3RsX3RyZWU7CisJc3RydWN0IHN5c2N0bF9v
aWQgKnN5c2N0bF90cmVlX3RvcDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXR4IGJvdW5jZV9sb2Nr
Oworc3RhdGljIGludCB0b3RhbF9icGFnZXM7CitzdGF0aWMgaW50IGJ1c2RtYV96b25lY291bnQ7
CitzdGF0aWMgU1RBSUxRX0hFQUQoLCBib3VuY2Vfem9uZSkgYm91bmNlX3pvbmVfbGlzdDsKKwor
c3RhdGljIFNZU0NUTF9OT0RFKF9odywgT0lEX0FVVE8sIGJ1c2RtYSwgQ1RMRkxBR19SRCwgMCwg
IkJ1c2RtYSBwYXJhbWV0ZXJzIik7CitTWVNDVExfSU5UKF9od19idXNkbWEsIE9JRF9BVVRPLCB0
b3RhbF9icGFnZXMsIENUTEZMQUdfUkQsICZ0b3RhbF9icGFnZXMsIDAsCisJICAgIlRvdGFsIGJv
dW5jZSBwYWdlcyIpOworCitzdHJ1Y3QgYnVzX2RtYW1hcCB7CisJc3RydWN0IGJwX2xpc3QJICAg
ICAgIGJwYWdlczsKKwlpbnQJCSAgICAgICBwYWdlc25lZWRlZDsKKwlpbnQJCSAgICAgICBwYWdl
c3Jlc2VydmVkOworCWJ1c19kbWFfdGFnX3QJICAgICAgIGRtYXQ7CisJc3RydWN0IG1lbWRlc2MJ
ICAgICAgIG1lbTsKKwlidXNfZG1hbWFwX2NhbGxiYWNrX3QgKmNhbGxiYWNrOworCXZvaWQJCSAg
ICAgICpjYWxsYmFja19hcmc7CisJU1RBSUxRX0VOVFJZKGJ1c19kbWFtYXApIGxpbmtzOworfTsK
Kworc3RhdGljIFNUQUlMUV9IRUFEKCwgYnVzX2RtYW1hcCkgYm91bmNlX21hcF93YWl0aW5nbGlz
dDsKK3N0YXRpYyBTVEFJTFFfSEVBRCgsIGJ1c19kbWFtYXApIGJvdW5jZV9tYXBfY2FsbGJhY2ts
aXN0Oworc3RhdGljIHN0cnVjdCBidXNfZG1hbWFwIG5vYm91bmNlX2RtYW1hcDsKKworc3RhdGlj
IHZvaWQgaW5pdF9ib3VuY2VfcGFnZXModm9pZCAqZHVtbXkpOworc3RhdGljIGludCBhbGxvY19i
b3VuY2Vfem9uZShidXNfZG1hX3RhZ190IGRtYXQpOworc3RhdGljIGludCBhbGxvY19ib3VuY2Vf
cGFnZXMoYnVzX2RtYV90YWdfdCBkbWF0LCB1X2ludCBudW1wYWdlcyk7CitzdGF0aWMgaW50IHJl
c2VydmVfYm91bmNlX3BhZ2VzKGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCwK
KwkJCQlpbnQgY29tbWl0KTsKK3N0YXRpYyBidXNfYWRkcl90IGFkZF9ib3VuY2VfcGFnZShidXNf
ZG1hX3RhZ190IGRtYXQsIGJ1c19kbWFtYXBfdCBtYXAsCisJCQkJICB2bV9vZmZzZXRfdCB2YWRk
ciwgYnVzX2FkZHJfdCBhZGRyLAorCQkJCSAgYnVzX3NpemVfdCBzaXplKTsKK3N0YXRpYyB2b2lk
IGZyZWVfYm91bmNlX3BhZ2UoYnVzX2RtYV90YWdfdCBkbWF0LCBzdHJ1Y3QgYm91bmNlX3BhZ2Ug
KmJwYWdlKTsKK2ludCBydW5fZmlsdGVyKGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2FkZHJfdCBw
YWRkcik7CitzdGF0aWMgdm9pZCBfYnVzX2RtYW1hcF9jb3VudF9wYWdlcyhidXNfZG1hX3RhZ190
IGRtYXQsIGJ1c19kbWFtYXBfdCBtYXAsCisJCQkJICAgIHBtYXBfdCBwbWFwLCB2b2lkICpidWYs
IGJ1c19zaXplX3QgYnVmbGVuLAorCQkJCSAgICBpbnQgZmxhZ3MpOworc3RhdGljIHZvaWQgX2J1
c19kbWFtYXBfY291bnRfcGh5cyhidXNfZG1hX3RhZ190IGRtYXQsIGJ1c19kbWFtYXBfdCBtYXAs
CisJCQkJICAgdm1fcGFkZHJfdCBidWYsIGJ1c19zaXplX3QgYnVmbGVuLAorCQkJCSAgIGludCBm
bGFncyk7CitzdGF0aWMgaW50IF9idXNfZG1hbWFwX3Jlc2VydmVfcGFnZXMoYnVzX2RtYV90YWdf
dCBkbWF0LCBidXNfZG1hbWFwX3QgbWFwLAorCQkJCSAgICAgaW50IGZsYWdzKTsKKworLyoKKyAq
IEFsbG9jYXRlIGEgZGV2aWNlIHNwZWNpZmljIGRtYV90YWcuCisgKi8KK3N0YXRpYyBpbnQKK2Jv
dW5jZV9idXNfZG1hX3RhZ19jcmVhdGUoYnVzX2RtYV90YWdfdCBwYXJlbnQsIGJ1c19zaXplX3Qg
YWxpZ25tZW50LAorICAgIGJ1c19hZGRyX3QgYm91bmRhcnksIGJ1c19hZGRyX3QgbG93YWRkciwg
YnVzX2FkZHJfdCBoaWdoYWRkciwKKyAgICBidXNfZG1hX2ZpbHRlcl90ICpmaWx0ZXIsIHZvaWQg
KmZpbHRlcmFyZywgYnVzX3NpemVfdCBtYXhzaXplLAorICAgIGludCBuc2VnbWVudHMsIGJ1c19z
aXplX3QgbWF4c2Vnc3osIGludCBmbGFncywgYnVzX2RtYV9sb2NrX3QgKmxvY2tmdW5jLAorICAg
IHZvaWQgKmxvY2tmdW5jYXJnLCBidXNfZG1hX3RhZ190ICpkbWF0KQoreworCWJ1c19kbWFfdGFn
X3QgbmV3dGFnOworCWludCBlcnJvcjsKKworCSpkbWF0ID0gTlVMTDsKKwllcnJvciA9IGNvbW1v
bl9idXNfZG1hX3RhZ19jcmVhdGUocGFyZW50ICE9IE5VTEwgPyAmcGFyZW50LT5jb21tb24gOgor
CSAgICBOVUxMLCBhbGlnbm1lbnQsIGJvdW5kYXJ5LCBsb3dhZGRyLCBoaWdoYWRkciwgZmlsdGVy
LCBmaWx0ZXJhcmcsCisJICAgIG1heHNpemUsIG5zZWdtZW50cywgbWF4c2Vnc3osIGZsYWdzLCBs
b2NrZnVuYywgbG9ja2Z1bmNhcmcsCisJICAgIHNpemVvZiAoc3RydWN0IGJ1c19kbWFfdGFnKSwg
KHZvaWQgKiopJm5ld3RhZyk7CisJaWYgKGVycm9yICE9IDApCisJCXJldHVybiAoZXJyb3IpOwor
CisJbmV3dGFnLT5jb21tb24uaW1wbCA9ICZidXNfZG1hX2JvdW5jZV9pbXBsOworCW5ld3RhZy0+
bWFwX2NvdW50ID0gMDsKKwluZXd0YWctPnNlZ21lbnRzID0gTlVMTDsKKworCWlmIChwYXJlbnQg
IT0gTlVMTCAmJiAoKG5ld3RhZy0+Y29tbW9uLmZpbHRlciAhPSBOVUxMKSB8fAorCSAgICAoKHBh
cmVudC0+Ym91bmNlX2ZsYWdzICYgQlVTX0RNQV9DT1VMRF9CT1VOQ0UpICE9IDApKSkKKwkJbmV3
dGFnLT5ib3VuY2VfZmxhZ3MgfD0gQlVTX0RNQV9DT1VMRF9CT1VOQ0U7CisKKwlpZiAobmV3dGFn
LT5jb21tb24ubG93YWRkciA8IHB0b2EoKHZtX3BhZGRyX3QpTWF4bWVtKSB8fAorCSAgICBuZXd0
YWctPmNvbW1vbi5hbGlnbm1lbnQgPiAxKQorCQluZXd0YWctPmJvdW5jZV9mbGFncyB8PSBCVVNf
RE1BX0NPVUxEX0JPVU5DRTsKKworCWlmICgoKG5ld3RhZy0+Ym91bmNlX2ZsYWdzICYgQlVTX0RN
QV9DT1VMRF9CT1VOQ0UpICE9IDApICYmCisJICAgIChmbGFncyAmIEJVU19ETUFfQUxMT0NOT1cp
ICE9IDApIHsKKwkJc3RydWN0IGJvdW5jZV96b25lICpiejsKKworCQkvKiBNdXN0IGJvdW5jZSAq
LworCQlpZiAoKGVycm9yID0gYWxsb2NfYm91bmNlX3pvbmUobmV3dGFnKSkgIT0gMCkgeworCQkJ
ZnJlZShuZXd0YWcsIE1fREVWQlVGKTsKKwkJCXJldHVybiAoZXJyb3IpOworCQl9CisJCWJ6ID0g
bmV3dGFnLT5ib3VuY2Vfem9uZTsKKworCQlpZiAocHRvYShiei0+dG90YWxfYnBhZ2VzKSA8IG1h
eHNpemUpIHsKKwkJCWludCBwYWdlczsKKworCQkJcGFnZXMgPSBhdG9wKG1heHNpemUpIC0gYnot
PnRvdGFsX2JwYWdlczsKKworCQkJLyogQWRkIHBhZ2VzIHRvIG91ciBib3VuY2UgcG9vbCAqLwor
CQkJaWYgKGFsbG9jX2JvdW5jZV9wYWdlcyhuZXd0YWcsIHBhZ2VzKSA8IHBhZ2VzKQorCQkJCWVy
cm9yID0gRU5PTUVNOworCQl9CisJCS8qIFBlcmZvcm1lZCBpbml0aWFsIGFsbG9jYXRpb24gKi8K
KwkJbmV3dGFnLT5ib3VuY2VfZmxhZ3MgfD0gQlVTX0RNQV9NSU5fQUxMT0NfQ09NUDsKKwl9IGVs
c2UKKwkJZXJyb3IgPSAwOworCQorCWlmIChlcnJvciAhPSAwKQorCQlmcmVlKG5ld3RhZywgTV9E
RVZCVUYpOworCWVsc2UKKwkJKmRtYXQgPSBuZXd0YWc7CisJQ1RSNChLVFJfQlVTRE1BLCAiJXMg
cmV0dXJuZWQgdGFnICVwIHRhZyBmbGFncyAweCV4IGVycm9yICVkIiwKKwkgICAgX19mdW5jX18s
IG5ld3RhZywgKG5ld3RhZyAhPSBOVUxMID8gbmV3dGFnLT5jb21tb24uZmxhZ3MgOiAwKSwKKwkg
ICAgZXJyb3IpOworCXJldHVybiAoZXJyb3IpOworfQorCitzdGF0aWMgaW50Citib3VuY2VfYnVz
X2RtYV90YWdfZGVzdHJveShidXNfZG1hX3RhZ190IGRtYXQpCit7CisJYnVzX2RtYV90YWdfdCBk
bWF0X2NvcHksIHBhcmVudDsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IDA7CisJZG1hdF9jb3B5
ID0gZG1hdDsKKworCWlmIChkbWF0ICE9IE5VTEwpIHsKKwkJaWYgKGRtYXQtPm1hcF9jb3VudCAh
PSAwKSB7CisJCQllcnJvciA9IEVCVVNZOworCQkJZ290byBvdXQ7CisJCX0KKwkJd2hpbGUgKGRt
YXQgIT0gTlVMTCkgeworCQkJcGFyZW50ID0gKGJ1c19kbWFfdGFnX3QpZG1hdC0+Y29tbW9uLnBh
cmVudDsKKwkJCWF0b21pY19zdWJ0cmFjdF9pbnQoJmRtYXQtPmNvbW1vbi5yZWZfY291bnQsIDEp
OworCQkJaWYgKGRtYXQtPmNvbW1vbi5yZWZfY291bnQgPT0gMCkgeworCQkJCWlmIChkbWF0LT5z
ZWdtZW50cyAhPSBOVUxMKQorCQkJCQlmcmVlKGRtYXQtPnNlZ21lbnRzLCBNX0RFVkJVRik7CisJ
CQkJZnJlZShkbWF0LCBNX0RFVkJVRik7CisJCQkJLyoKKwkJCQkgKiBMYXN0IHJlZmVyZW5jZSBj
b3VudCwgc28KKwkJCQkgKiByZWxlYXNlIG91ciByZWZlcmVuY2UKKwkJCQkgKiBjb3VudCBvbiBv
dXIgcGFyZW50LgorCQkJCSAqLworCQkJCWRtYXQgPSBwYXJlbnQ7CisJCQl9IGVsc2UKKwkJCQlk
bWF0ID0gTlVMTDsKKwkJfQorCX0KK291dDoKKwlDVFIzKEtUUl9CVVNETUEsICIlcyB0YWcgJXAg
ZXJyb3IgJWQiLCBfX2Z1bmNfXywgZG1hdF9jb3B5LCBlcnJvcik7CisJcmV0dXJuIChlcnJvcik7
Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhIGhhbmRsZSBmb3IgbWFwcGluZyBmcm9tIGt2YS91dmEv
cGh5c2ljYWwKKyAqIGFkZHJlc3Mgc3BhY2UgaW50byBidXMgZGV2aWNlIHNwYWNlLgorICovCitz
dGF0aWMgaW50Citib3VuY2VfYnVzX2RtYW1hcF9jcmVhdGUoYnVzX2RtYV90YWdfdCBkbWF0LCBp
bnQgZmxhZ3MsIGJ1c19kbWFtYXBfdCAqbWFwcCkKK3sKKwlzdHJ1Y3QgYm91bmNlX3pvbmUgKmJ6
OworCWludCBlcnJvciwgbWF4cGFnZXMsIHBhZ2VzOworCisJZXJyb3IgPSAwOworCisJaWYgKGRt
YXQtPnNlZ21lbnRzID09IE5VTEwpIHsKKwkJZG1hdC0+c2VnbWVudHMgPSAoYnVzX2RtYV9zZWdt
ZW50X3QgKiltYWxsb2MoCisJCSAgICBzaXplb2YoYnVzX2RtYV9zZWdtZW50X3QpICogZG1hdC0+
Y29tbW9uLm5zZWdtZW50cywKKwkJICAgIE1fREVWQlVGLCBNX05PV0FJVCk7CisJCWlmIChkbWF0
LT5zZWdtZW50cyA9PSBOVUxMKSB7CisJCQlDVFIzKEtUUl9CVVNETUEsICIlczogdGFnICVwIGVy
cm9yICVkIiwKKwkJCSAgICBfX2Z1bmNfXywgZG1hdCwgRU5PTUVNKTsKKwkJCXJldHVybiAoRU5P
TUVNKTsKKwkJfQorCX0KKworCS8qCisJICogQm91bmNpbmcgbWlnaHQgYmUgcmVxdWlyZWQgaWYg
dGhlIGRyaXZlciBhc2tzIGZvciBhbiBhY3RpdmUKKwkgKiBleGNsdXNpb24gcmVnaW9uLCBhIGRh
dGEgYWxpZ25tZW50IHRoYXQgaXMgc3RyaWN0ZXIgdGhhbiAxLCBhbmQvb3IKKwkgKiBhbiBhY3Rp
dmUgYWRkcmVzcyBib3VuZGFyeS4KKwkgKi8KKwlpZiAoZG1hdC0+Ym91bmNlX2ZsYWdzICYgQlVT
X0RNQV9DT1VMRF9CT1VOQ0UpIHsKKwkJLyogTXVzdCBib3VuY2UgKi8KKwkJaWYgKGRtYXQtPmJv
dW5jZV96b25lID09IE5VTEwpIHsKKwkJCWlmICgoZXJyb3IgPSBhbGxvY19ib3VuY2Vfem9uZShk
bWF0KSkgIT0gMCkKKwkJCQlyZXR1cm4gKGVycm9yKTsKKwkJfQorCQlieiA9IGRtYXQtPmJvdW5j
ZV96b25lOworCisJCSptYXBwID0gKGJ1c19kbWFtYXBfdCltYWxsb2Moc2l6ZW9mKCoqbWFwcCks
IE1fREVWQlVGLAorCQkgICAgTV9OT1dBSVQgfCBNX1pFUk8pOworCQlpZiAoKm1hcHAgPT0gTlVM
TCkgeworCQkJQ1RSMyhLVFJfQlVTRE1BLCAiJXM6IHRhZyAlcCBlcnJvciAlZCIsCisJCQkgICAg
X19mdW5jX18sIGRtYXQsIEVOT01FTSk7CisJCQlyZXR1cm4gKEVOT01FTSk7CisJCX0KKworCQkv
KiBJbml0aWFsaXplIHRoZSBuZXcgbWFwICovCisJCVNUQUlMUV9JTklUKCYoKCptYXBwKS0+YnBh
Z2VzKSk7CisKKwkJLyoKKwkJICogQXR0ZW1wdCB0byBhZGQgcGFnZXMgdG8gb3VyIHBvb2wgb24g
YSBwZXItaW5zdGFuY2UKKwkJICogYmFzaXMgdXAgdG8gYSBzYW5lIGxpbWl0LgorCQkgKi8KKwkJ
aWYgKGRtYXQtPmNvbW1vbi5hbGlnbm1lbnQgPiAxKQorCQkJbWF4cGFnZXMgPSBNQVhfQlBBR0VT
OworCQllbHNlCisJCQltYXhwYWdlcyA9IE1JTihNQVhfQlBBR0VTLCBNYXhtZW0gLQorCQkJICAg
IGF0b3AoZG1hdC0+Y29tbW9uLmxvd2FkZHIpKTsKKwkJaWYgKChkbWF0LT5ib3VuY2VfZmxhZ3Mg
JiBCVVNfRE1BX01JTl9BTExPQ19DT01QKSA9PSAwIHx8CisJCSAgICAoYnotPm1hcF9jb3VudCA+
IDAgJiYgYnotPnRvdGFsX2JwYWdlcyA8IG1heHBhZ2VzKSkgeworCQkJcGFnZXMgPSBNQVgoYXRv
cChkbWF0LT5jb21tb24ubWF4c2l6ZSksIDEpOworCQkJcGFnZXMgPSBNSU4obWF4cGFnZXMgLSBi
ei0+dG90YWxfYnBhZ2VzLCBwYWdlcyk7CisJCQlwYWdlcyA9IE1BWChwYWdlcywgMSk7CisJCQlp
ZiAoYWxsb2NfYm91bmNlX3BhZ2VzKGRtYXQsIHBhZ2VzKSA8IHBhZ2VzKQorCQkJCWVycm9yID0g
RU5PTUVNOworCQkJaWYgKChkbWF0LT5ib3VuY2VfZmxhZ3MgJiBCVVNfRE1BX01JTl9BTExPQ19D
T01QKQorCQkJICAgID09IDApIHsKKwkJCQlpZiAoZXJyb3IgPT0gMCkgeworCQkJCQlkbWF0LT5i
b3VuY2VfZmxhZ3MgfD0KKwkJCQkJICAgIEJVU19ETUFfTUlOX0FMTE9DX0NPTVA7CisJCQkJfQor
CQkJfSBlbHNlCisJCQkJZXJyb3IgPSAwOworCQl9CisJCWJ6LT5tYXBfY291bnQrKzsKKwl9IGVs
c2UgeworCQkqbWFwcCA9IE5VTEw7CisJfQorCWlmIChlcnJvciA9PSAwKQorCQlkbWF0LT5tYXBf
Y291bnQrKzsKKwlDVFI0KEtUUl9CVVNETUEsICIlczogdGFnICVwIHRhZyBmbGFncyAweCV4IGVy
cm9yICVkIiwKKwkgICAgX19mdW5jX18sIGRtYXQsIGRtYXQtPmNvbW1vbi5mbGFncywgZXJyb3Ip
OworCXJldHVybiAoZXJyb3IpOworfQorCisvKgorICogRGVzdHJveSBhIGhhbmRsZSBmb3IgbWFw
cGluZyBmcm9tIGt2YS91dmEvcGh5c2ljYWwKKyAqIGFkZHJlc3Mgc3BhY2UgaW50byBidXMgZGV2
aWNlIHNwYWNlLgorICovCitzdGF0aWMgaW50Citib3VuY2VfYnVzX2RtYW1hcF9kZXN0cm95KGJ1
c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCkKK3sKKworCWlmIChtYXAgIT0gTlVM
TCAmJiBtYXAgIT0gJm5vYm91bmNlX2RtYW1hcCkgeworCQlpZiAoU1RBSUxRX0ZJUlNUKCZtYXAt
PmJwYWdlcykgIT0gTlVMTCkgeworCQkJQ1RSMyhLVFJfQlVTRE1BLCAiJXM6IHRhZyAlcCBlcnJv
ciAlZCIsCisJCQkgICAgX19mdW5jX18sIGRtYXQsIEVCVVNZKTsKKwkJCXJldHVybiAoRUJVU1kp
OworCQl9CisJCWlmIChkbWF0LT5ib3VuY2Vfem9uZSkKKwkJCWRtYXQtPmJvdW5jZV96b25lLT5t
YXBfY291bnQtLTsKKwkJZnJlZShtYXAsIE1fREVWQlVGKTsKKwl9CisJZG1hdC0+bWFwX2NvdW50
LS07CisJQ1RSMihLVFJfQlVTRE1BLCAiJXM6IHRhZyAlcCBlcnJvciAwIiwgX19mdW5jX18sIGRt
YXQpOworCXJldHVybiAoMCk7Cit9CisKKworLyoKKyAqIEFsbG9jYXRlIGEgcGllY2Ugb2YgbWVt
b3J5IHRoYXQgY2FuIGJlIGVmZmljaWVudGx5IG1hcHBlZCBpbnRvCisgKiBidXMgZGV2aWNlIHNw
YWNlIGJhc2VkIG9uIHRoZSBjb25zdHJhaW50cyBsaXRlZCBpbiB0aGUgZG1hIHRhZy4KKyAqIEEg
ZG1hbWFwIHRvIGZvciB1c2Ugd2l0aCBkbWFtYXBfbG9hZCBpcyBhbHNvIGFsbG9jYXRlZC4KKyAq
Lworc3RhdGljIGludAorYm91bmNlX2J1c19kbWFtZW1fYWxsb2MoYnVzX2RtYV90YWdfdCBkbWF0
LCB2b2lkKiogdmFkZHIsIGludCBmbGFncywKKyAgICBidXNfZG1hbWFwX3QgKm1hcHApCit7CisJ
LyoKKwkgKiBYWFggQVJNNjRUT0RPOgorCSAqIFRoaXMgYnVzX2RtYSBpbXBsZW1lbnRhdGlvbiBy
ZXF1aXJlcyBJTy1Db2hlcmVudCBhcmNoaXRlY3V0cmUuCisJICogSWYgSU8tQ29oZXJlbmN5IGlz
IG5vdCBndWFyYW50ZWVkLCB0aGUgQlVTX0RNQV9DT0hFUkVOVCBmbGFnIGhhcworCSAqIHRvIGJl
IGltcGxlbnRlZCB1c2luZyBub24tY2FjaGVhYmxlIG1lbW9yeS4KKwkgKi8KKworCXZtX21lbWF0
dHJfdCBhdHRyOworCWludCBtZmxhZ3M7CisKKwlpZiAoZmxhZ3MgJiBCVVNfRE1BX05PV0FJVCkK
KwkJbWZsYWdzID0gTV9OT1dBSVQ7CisJZWxzZQorCQltZmxhZ3MgPSBNX1dBSVRPSzsKKworCS8q
IElmIHdlIHN1Y2NlZWQsIG5vIG1hcHBpbmcvYm91bmNpbmcgd2lsbCBiZSByZXF1aXJlZCAqLwor
CSptYXBwID0gTlVMTDsKKworCWlmIChkbWF0LT5zZWdtZW50cyA9PSBOVUxMKSB7CisJCWRtYXQt
PnNlZ21lbnRzID0gKGJ1c19kbWFfc2VnbWVudF90ICopbWFsbG9jKAorCQkgICAgc2l6ZW9mKGJ1
c19kbWFfc2VnbWVudF90KSAqIGRtYXQtPmNvbW1vbi5uc2VnbWVudHMsCisJCSAgICBNX0RFVkJV
RiwgbWZsYWdzKTsKKwkJaWYgKGRtYXQtPnNlZ21lbnRzID09IE5VTEwpIHsKKwkJCUNUUjQoS1RS
X0JVU0RNQSwgIiVzOiB0YWcgJXAgdGFnIGZsYWdzIDB4JXggZXJyb3IgJWQiLAorCQkJICAgIF9f
ZnVuY19fLCBkbWF0LCBkbWF0LT5jb21tb24uZmxhZ3MsIEVOT01FTSk7CisJCQlyZXR1cm4gKEVO
T01FTSk7CisJCX0KKwl9CisJaWYgKGZsYWdzICYgQlVTX0RNQV9aRVJPKQorCQltZmxhZ3MgfD0g
TV9aRVJPOworCWlmIChmbGFncyAmIEJVU19ETUFfTk9DQUNIRSkKKwkJYXR0ciA9IFZNX01FTUFU
VFJfVU5DQUNIRUFCTEU7CisJZWxzZQorCQlhdHRyID0gVk1fTUVNQVRUUl9ERUZBVUxUOworCisJ
LyogCisJICogWFhYOgorCSAqIChkbWF0LT5hbGlnbm1lbnQgPCBkbWF0LT5tYXhzaXplKSBpcyBq
dXN0IGEgcXVpY2sgaGFjazsgdGhlIGV4YWN0CisJICogYWxpZ25tZW50IGd1YXJhbnRlZXMgb2Yg
bWFsbG9jIG5lZWQgdG8gYmUgbmFpbGVkIGRvd24sIGFuZCB0aGUKKwkgKiBjb2RlIGJlbG93IHNo
b3VsZCBiZSByZXdyaXR0ZW4gdG8gdGFrZSB0aGF0IGludG8gYWNjb3VudC4KKwkgKgorCSAqIElu
IHRoZSBtZWFudGltZSwgd2UnbGwgd2FybiB0aGUgdXNlciBpZiBtYWxsb2MgZ2V0cyBpdCB3cm9u
Zy4KKwkgKi8KKwlpZiAoKGRtYXQtPmNvbW1vbi5tYXhzaXplIDw9IFBBR0VfU0laRSkgJiYKKwkg
ICAoZG1hdC0+Y29tbW9uLmFsaWdubWVudCA8IGRtYXQtPmNvbW1vbi5tYXhzaXplKSAmJgorCSAg
ICBkbWF0LT5jb21tb24ubG93YWRkciA+PSBwdG9hKCh2bV9wYWRkcl90KU1heG1lbSkgJiYKKwkg
ICAgYXR0ciA9PSBWTV9NRU1BVFRSX0RFRkFVTFQpIHsKKwkJKnZhZGRyID0gbWFsbG9jKGRtYXQt
PmNvbW1vbi5tYXhzaXplLCBNX0RFVkJVRiwgbWZsYWdzKTsKKwl9IGVsc2UgaWYgKGRtYXQtPmNv
bW1vbi5uc2VnbWVudHMgPj0gYnRvYyhkbWF0LT5jb21tb24ubWF4c2l6ZSkgJiYKKwkgICAgZG1h
dC0+Y29tbW9uLmFsaWdubWVudCA8PSBQQUdFX1NJWkUgJiYKKwkgICAgKGRtYXQtPmNvbW1vbi5i
b3VuZGFyeSA9PSAwIHx8CisJICAgIGRtYXQtPmNvbW1vbi5ib3VuZGFyeSA+PSBkbWF0LT5jb21t
b24ubG93YWRkcikpIHsKKwkJLyogUGFnZS1iYXNlZCBtdWx0aS1zZWdtZW50IGFsbG9jYXRpb25z
IGFsbG93ZWQgKi8KKwkJKnZhZGRyID0gKHZvaWQgKilrbWVtX2FsbG9jX2F0dHIoa2VybmVsX2Fy
ZW5hLAorCQkgICAgZG1hdC0+Y29tbW9uLm1heHNpemUsIG1mbGFncywgMHVsLCBkbWF0LT5jb21t
b24ubG93YWRkciwKKwkJICAgIGF0dHIpOworCQlkbWF0LT5ib3VuY2VfZmxhZ3MgfD0gQlVTX0RN
QV9LTUVNX0FMTE9DOworCX0gZWxzZSB7CisJCSp2YWRkciA9ICh2b2lkICopa21lbV9hbGxvY19j
b250aWcoa2VybmVsX2FyZW5hLAorCQkgICAgZG1hdC0+Y29tbW9uLm1heHNpemUsIG1mbGFncywg
MHVsLCBkbWF0LT5jb21tb24ubG93YWRkciwKKwkJICAgIGRtYXQtPmNvbW1vbi5hbGlnbm1lbnQg
IT0gMCA/IGRtYXQtPmNvbW1vbi5hbGlnbm1lbnQgOiAxdWwsCisJCSAgICBkbWF0LT5jb21tb24u
Ym91bmRhcnksIGF0dHIpOworCQlkbWF0LT5ib3VuY2VfZmxhZ3MgfD0gQlVTX0RNQV9LTUVNX0FM
TE9DOworCX0KKwlpZiAoKnZhZGRyID09IE5VTEwpIHsKKwkJQ1RSNChLVFJfQlVTRE1BLCAiJXM6
IHRhZyAlcCB0YWcgZmxhZ3MgMHgleCBlcnJvciAlZCIsCisJCSAgICBfX2Z1bmNfXywgZG1hdCwg
ZG1hdC0+Y29tbW9uLmZsYWdzLCBFTk9NRU0pOworCQlyZXR1cm4gKEVOT01FTSk7CisJfSBlbHNl
IGlmICh2dG9waHlzKCp2YWRkcikgJiAoZG1hdC0+Y29tbW9uLmFsaWdubWVudCAtIDEpKSB7CisJ
CXByaW50ZigiYnVzX2RtYW1lbV9hbGxvYyBmYWlsZWQgdG8gYWxpZ24gbWVtb3J5IHByb3Blcmx5
LlxuIik7CisJfQorCUNUUjQoS1RSX0JVU0RNQSwgIiVzOiB0YWcgJXAgdGFnIGZsYWdzIDB4JXgg
ZXJyb3IgJWQiLAorCSAgICBfX2Z1bmNfXywgZG1hdCwgZG1hdC0+Y29tbW9uLmZsYWdzLCAwKTsK
KwlyZXR1cm4gKDApOworfQorCisvKgorICogRnJlZSBhIHBpZWNlIG9mIG1lbW9yeSBhbmQgaXQn
cyBhbGxvY2lhdGVkIGRtYW1hcCwgdGhhdCB3YXMgYWxsb2NhdGVkCisgKiB2aWEgYnVzX2RtYW1l
bV9hbGxvYy4gIE1ha2UgdGhlIHNhbWUgY2hvaWNlIGZvciBmcmVlL2NvbnRpZ2ZyZWUuCisgKi8K
K3N0YXRpYyB2b2lkCitib3VuY2VfYnVzX2RtYW1lbV9mcmVlKGJ1c19kbWFfdGFnX3QgZG1hdCwg
dm9pZCAqdmFkZHIsIGJ1c19kbWFtYXBfdCBtYXApCit7CisJLyoKKwkgKiBkbWFtZW0gZG9lcyBu
b3QgbmVlZCB0byBiZSBib3VuY2VkLCBzbyB0aGUgbWFwIHNob3VsZCBiZQorCSAqIE5VTEwgYW5k
IHRoZSBCVVNfRE1BX0tNRU1fQUxMT0MgZmxhZyBjbGVhcmVkIGlmIG1hbGxvYygpCisJICogd2Fz
IHVzZWQgYW5kIHNldCBpZiBrbWVtX2FsbG9jX2NvbnRpZygpIHdhcyB1c2VkLgorCSAqLworCWlm
IChtYXAgIT0gTlVMTCkKKwkJcGFuaWMoImJ1c19kbWFtZW1fZnJlZTogSW52YWxpZCBtYXAgZnJl
ZWRcbiIpOworCWlmICgoZG1hdC0+Ym91bmNlX2ZsYWdzICYgQlVTX0RNQV9LTUVNX0FMTE9DKSA9
PSAwKQorCQlmcmVlKHZhZGRyLCBNX0RFVkJVRik7CisJZWxzZQorCQlrbWVtX2ZyZWUoa2VybmVs
X2FyZW5hLCAodm1fb2Zmc2V0X3QpdmFkZHIsCisJCSAgICBkbWF0LT5jb21tb24ubWF4c2l6ZSk7
CisJQ1RSMyhLVFJfQlVTRE1BLCAiJXM6IHRhZyAlcCBmbGFncyAweCV4IiwgX19mdW5jX18sIGRt
YXQsCisJICAgIGRtYXQtPmJvdW5jZV9mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCitfYnVzX2Rt
YW1hcF9jb3VudF9waHlzKGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCwgdm1f
cGFkZHJfdCBidWYsCisgICAgYnVzX3NpemVfdCBidWZsZW4sIGludCBmbGFncykKK3sKKwlidXNf
YWRkcl90IGN1cmFkZHI7CisJYnVzX3NpemVfdCBzZ3NpemU7CisKKwlpZiAoKG1hcCAhPSAmbm9i
b3VuY2VfZG1hbWFwICYmIG1hcC0+cGFnZXNuZWVkZWQgPT0gMCkpIHsKKwkJLyoKKwkJICogQ291
bnQgdGhlIG51bWJlciBvZiBib3VuY2UgcGFnZXMKKwkJICogbmVlZGVkIGluIG9yZGVyIHRvIGNv
bXBsZXRlIHRoaXMgdHJhbnNmZXIKKwkJICovCisJCWN1cmFkZHIgPSBidWY7CisJCXdoaWxlIChi
dWZsZW4gIT0gMCkgeworCQkJc2dzaXplID0gTUlOKGJ1ZmxlbiwgZG1hdC0+Y29tbW9uLm1heHNl
Z3N6KTsKKwkJCWlmIChidXNfZG1hX3J1bl9maWx0ZXIoJmRtYXQtPmNvbW1vbiwgY3VyYWRkcikp
IHsKKwkJCQlzZ3NpemUgPSBNSU4oc2dzaXplLCBQQUdFX1NJWkUpOworCQkJCW1hcC0+cGFnZXNu
ZWVkZWQrKzsKKwkJCX0KKwkJCWN1cmFkZHIgKz0gc2dzaXplOworCQkJYnVmbGVuIC09IHNnc2l6
ZTsKKwkJfQorCQlDVFIxKEtUUl9CVVNETUEsICJwYWdlc25lZWRlZD0gJWRcbiIsIG1hcC0+cGFn
ZXNuZWVkZWQpOworCX0KK30KKworc3RhdGljIHZvaWQKK19idXNfZG1hbWFwX2NvdW50X3BhZ2Vz
KGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCwgcG1hcF90IHBtYXAsCisgICAg
dm9pZCAqYnVmLCBidXNfc2l6ZV90IGJ1ZmxlbiwgaW50IGZsYWdzKQoreworCXZtX29mZnNldF90
IHZhZGRyOworCXZtX29mZnNldF90IHZlbmRhZGRyOworCWJ1c19hZGRyX3QgcGFkZHI7CisJYnVz
X3NpemVfdCBzZ19sZW47CisKKwlpZiAoKG1hcCAhPSAmbm9ib3VuY2VfZG1hbWFwICYmIG1hcC0+
cGFnZXNuZWVkZWQgPT0gMCkpIHsKKwkJQ1RSNChLVFJfQlVTRE1BLCAibG93YWRkcj0gJWQgTWF4
bWVtPSAlZCwgYm91bmRhcnk9ICVkLCAiCisJCSAgICAiYWxpZ25tZW50PSAlZCIsIGRtYXQtPmNv
bW1vbi5sb3dhZGRyLAorCQkgICAgcHRvYSgodm1fcGFkZHJfdClNYXhtZW0pLAorCQkgICAgZG1h
dC0+Y29tbW9uLmJvdW5kYXJ5LCBkbWF0LT5jb21tb24uYWxpZ25tZW50KTsKKwkJQ1RSMyhLVFJf
QlVTRE1BLCAibWFwPSAlcCwgbm9ib3VuY2VtYXA9ICVwLCBwYWdlc25lZWRlZD0gJWQiLAorCQkg
ICAgbWFwLCAmbm9ib3VuY2VfZG1hbWFwLCBtYXAtPnBhZ2VzbmVlZGVkKTsKKwkJLyoKKwkJICog
Q291bnQgdGhlIG51bWJlciBvZiBib3VuY2UgcGFnZXMKKwkJICogbmVlZGVkIGluIG9yZGVyIHRv
IGNvbXBsZXRlIHRoaXMgdHJhbnNmZXIKKwkJICovCisJCXZhZGRyID0gKHZtX29mZnNldF90KWJ1
ZjsKKwkJdmVuZGFkZHIgPSAodm1fb2Zmc2V0X3QpYnVmICsgYnVmbGVuOworCisJCXdoaWxlICh2
YWRkciA8IHZlbmRhZGRyKSB7CisJCQlzZ19sZW4gPSBQQUdFX1NJWkUgLSAoKHZtX29mZnNldF90
KXZhZGRyICYgUEFHRV9NQVNLKTsKKwkJCWlmIChwbWFwID09IGtlcm5lbF9wbWFwKQorCQkJCXBh
ZGRyID0gcG1hcF9rZXh0cmFjdCh2YWRkcik7CisJCQllbHNlCisJCQkJcGFkZHIgPSBwbWFwX2V4
dHJhY3QocG1hcCwgdmFkZHIpOworCQkJaWYgKGJ1c19kbWFfcnVuX2ZpbHRlcigmZG1hdC0+Y29t
bW9uLCBwYWRkcikgIT0gMCkgeworCQkJCXNnX2xlbiA9IHJvdW5kdXAyKHNnX2xlbiwKKwkJCQkg
ICAgZG1hdC0+Y29tbW9uLmFsaWdubWVudCk7CisJCQkJbWFwLT5wYWdlc25lZWRlZCsrOworCQkJ
fQorCQkJdmFkZHIgKz0gc2dfbGVuOworCQl9CisJCUNUUjEoS1RSX0JVU0RNQSwgInBhZ2VzbmVl
ZGVkPSAlZFxuIiwgbWFwLT5wYWdlc25lZWRlZCk7CisJfQorfQorCitzdGF0aWMgaW50CitfYnVz
X2RtYW1hcF9yZXNlcnZlX3BhZ2VzKGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1h
cCwgaW50IGZsYWdzKQoreworCisJLyogUmVzZXJ2ZSBOZWNlc3NhcnkgQm91bmNlIFBhZ2VzICov
CisJbXR4X2xvY2soJmJvdW5jZV9sb2NrKTsKKwlpZiAoZmxhZ3MgJiBCVVNfRE1BX05PV0FJVCkg
eworCQlpZiAocmVzZXJ2ZV9ib3VuY2VfcGFnZXMoZG1hdCwgbWFwLCAwKSAhPSAwKSB7CisJCQlt
dHhfdW5sb2NrKCZib3VuY2VfbG9jayk7CisJCQlyZXR1cm4gKEVOT01FTSk7CisJCX0KKwl9IGVs
c2UgeworCQlpZiAocmVzZXJ2ZV9ib3VuY2VfcGFnZXMoZG1hdCwgbWFwLCAxKSAhPSAwKSB7CisJ
CQkvKiBRdWV1ZSB1cyBmb3IgcmVzb3VyY2VzICovCisJCQlTVEFJTFFfSU5TRVJUX1RBSUwoJmJv
dW5jZV9tYXBfd2FpdGluZ2xpc3QsIG1hcCwgbGlua3MpOworCQkJbXR4X3VubG9jaygmYm91bmNl
X2xvY2spOworCQkJcmV0dXJuIChFSU5QUk9HUkVTUyk7CisJCX0KKwl9CisJbXR4X3VubG9jaygm
Ym91bmNlX2xvY2spOworCisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIEFkZCBhIHNpbmdsZSBj
b250aWd1b3VzIHBoeXNpY2FsIHJhbmdlIHRvIHRoZSBzZWdtZW50IGxpc3QuCisgKi8KK3N0YXRp
YyBpbnQKK19idXNfZG1hbWFwX2FkZHNlZyhidXNfZG1hX3RhZ190IGRtYXQsIGJ1c19kbWFtYXBf
dCBtYXAsIGJ1c19hZGRyX3QgY3VyYWRkciwKKyAgICBidXNfc2l6ZV90IHNnc2l6ZSwgYnVzX2Rt
YV9zZWdtZW50X3QgKnNlZ3MsIGludCAqc2VncCkKK3sKKwlidXNfYWRkcl90IGJhZGRyLCBibWFz
azsKKwlpbnQgc2VnOworCisJLyoKKwkgKiBNYWtlIHN1cmUgd2UgZG9uJ3QgY3Jvc3MgYW55IGJv
dW5kYXJpZXMuCisJICovCisJYm1hc2sgPSB+KGRtYXQtPmNvbW1vbi5ib3VuZGFyeSAtIDEpOwor
CWlmIChkbWF0LT5jb21tb24uYm91bmRhcnkgPiAwKSB7CisJCWJhZGRyID0gKGN1cmFkZHIgKyBk
bWF0LT5jb21tb24uYm91bmRhcnkpICYgYm1hc2s7CisJCWlmIChzZ3NpemUgPiAoYmFkZHIgLSBj
dXJhZGRyKSkKKwkJCXNnc2l6ZSA9IChiYWRkciAtIGN1cmFkZHIpOworCX0KKworCS8qCisJICog
SW5zZXJ0IGNodW5rIGludG8gYSBzZWdtZW50LCBjb2FsZXNjaW5nIHdpdGgKKwkgKiBwcmV2aW91
cyBzZWdtZW50IGlmIHBvc3NpYmxlLgorCSAqLworCXNlZyA9ICpzZWdwOworCWlmIChzZWcgPT0g
LTEpIHsKKwkJc2VnID0gMDsKKwkJc2Vnc1tzZWddLmRzX2FkZHIgPSBjdXJhZGRyOworCQlzZWdz
W3NlZ10uZHNfbGVuID0gc2dzaXplOworCX0gZWxzZSB7CisJCWlmIChjdXJhZGRyID09IHNlZ3Nb
c2VnXS5kc19hZGRyICsgc2Vnc1tzZWddLmRzX2xlbiAmJgorCQkgICAgKHNlZ3Nbc2VnXS5kc19s
ZW4gKyBzZ3NpemUpIDw9IGRtYXQtPmNvbW1vbi5tYXhzZWdzeiAmJgorCQkgICAgKGRtYXQtPmNv
bW1vbi5ib3VuZGFyeSA9PSAwIHx8CisJCSAgICAgKHNlZ3Nbc2VnXS5kc19hZGRyICYgYm1hc2sp
ID09IChjdXJhZGRyICYgYm1hc2spKSkKKwkJCXNlZ3Nbc2VnXS5kc19sZW4gKz0gc2dzaXplOwor
CQllbHNlIHsKKwkJCWlmICgrK3NlZyA+PSBkbWF0LT5jb21tb24ubnNlZ21lbnRzKQorCQkJCXJl
dHVybiAoMCk7CisJCQlzZWdzW3NlZ10uZHNfYWRkciA9IGN1cmFkZHI7CisJCQlzZWdzW3NlZ10u
ZHNfbGVuID0gc2dzaXplOworCQl9CisJfQorCSpzZWdwID0gc2VnOworCXJldHVybiAoc2dzaXpl
KTsKK30KKworLyoKKyAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gbG9hZCBhIHBoeXNpY2FsIGJ1ZmZl
ci4gIHNlZ3AgY29udGFpbnMKKyAqIHRoZSBzdGFydGluZyBzZWdtZW50IG9uIGVudHJhY2UsIGFu
ZCB0aGUgZW5kaW5nIHNlZ21lbnQgb24gZXhpdC4KKyAqLworc3RhdGljIGludAorYm91bmNlX2J1
c19kbWFtYXBfbG9hZF9waHlzKGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCwK
KyAgICB2bV9wYWRkcl90IGJ1ZiwgYnVzX3NpemVfdCBidWZsZW4sIGludCBmbGFncywgYnVzX2Rt
YV9zZWdtZW50X3QgKnNlZ3MsCisgICAgaW50ICpzZWdwKQoreworCWJ1c19zaXplX3Qgc2dzaXpl
OworCWJ1c19hZGRyX3QgY3VyYWRkcjsKKwlpbnQgZXJyb3I7CisKKwlpZiAobWFwID09IE5VTEwp
CisJCW1hcCA9ICZub2JvdW5jZV9kbWFtYXA7CisKKwlpZiAoc2VncyA9PSBOVUxMKQorCQlzZWdz
ID0gZG1hdC0+c2VnbWVudHM7CisKKwlpZiAoKGRtYXQtPmJvdW5jZV9mbGFncyAmIEJVU19ETUFf
Q09VTERfQk9VTkNFKSAhPSAwKSB7CisJCV9idXNfZG1hbWFwX2NvdW50X3BoeXMoZG1hdCwgbWFw
LCBidWYsIGJ1ZmxlbiwgZmxhZ3MpOworCQlpZiAobWFwLT5wYWdlc25lZWRlZCAhPSAwKSB7CisJ
CQllcnJvciA9IF9idXNfZG1hbWFwX3Jlc2VydmVfcGFnZXMoZG1hdCwgbWFwLCBmbGFncyk7CisJ
CQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuIChlcnJvcik7CisJCX0KKwl9CisKKwl3aGlsZSAoYnVm
bGVuID4gMCkgeworCQljdXJhZGRyID0gYnVmOworCQlzZ3NpemUgPSBNSU4oYnVmbGVuLCBkbWF0
LT5jb21tb24ubWF4c2Vnc3opOworCQlpZiAoKChkbWF0LT5ib3VuY2VfZmxhZ3MgJiBCVVNfRE1B
X0NPVUxEX0JPVU5DRSkgIT0gMCkgJiYKKwkJICAgIG1hcC0+cGFnZXNuZWVkZWQgIT0gMCAmJgor
CQkgICAgYnVzX2RtYV9ydW5fZmlsdGVyKCZkbWF0LT5jb21tb24sIGN1cmFkZHIpKSB7CisJCQlz
Z3NpemUgPSBNSU4oc2dzaXplLCBQQUdFX1NJWkUpOworCQkJY3VyYWRkciA9IGFkZF9ib3VuY2Vf
cGFnZShkbWF0LCBtYXAsIDAsIGN1cmFkZHIsCisJCQkgICAgc2dzaXplKTsKKwkJfQorCQlzZ3Np
emUgPSBfYnVzX2RtYW1hcF9hZGRzZWcoZG1hdCwgbWFwLCBjdXJhZGRyLCBzZ3NpemUsIHNlZ3Ms
CisJCSAgICBzZWdwKTsKKwkJaWYgKHNnc2l6ZSA9PSAwKQorCQkJYnJlYWs7CisJCWJ1ZiArPSBz
Z3NpemU7CisJCWJ1ZmxlbiAtPSBzZ3NpemU7CisJfQorCisJLyoKKwkgKiBEaWQgd2UgZml0Pwor
CSAqLworCXJldHVybiAoYnVmbGVuICE9IDAgPyBFRkJJRyA6IDApOyAvKiBYWFggYmV0dGVyIHJl
dHVybiB2YWx1ZSBoZXJlPyAqLworfQorCisvKgorICogVXRpbGl0eSBmdW5jdGlvbiB0byBsb2Fk
IGEgbGluZWFyIGJ1ZmZlci4gIHNlZ3AgY29udGFpbnMKKyAqIHRoZSBzdGFydGluZyBzZWdtZW50
IG9uIGVudHJhY2UsIGFuZCB0aGUgZW5kaW5nIHNlZ21lbnQgb24gZXhpdC4KKyAqLworc3RhdGlj
IGludAorYm91bmNlX2J1c19kbWFtYXBfbG9hZF9idWZmZXIoYnVzX2RtYV90YWdfdCBkbWF0LCBi
dXNfZG1hbWFwX3QgbWFwLCB2b2lkICpidWYsCisgICAgYnVzX3NpemVfdCBidWZsZW4sIHBtYXBf
dCBwbWFwLCBpbnQgZmxhZ3MsIGJ1c19kbWFfc2VnbWVudF90ICpzZWdzLAorICAgIGludCAqc2Vn
cCkKK3sKKwlidXNfc2l6ZV90IHNnc2l6ZSwgbWF4X3Nnc2l6ZTsKKwlidXNfYWRkcl90IGN1cmFk
ZHI7CisJdm1fb2Zmc2V0X3QgdmFkZHI7CisJaW50IGVycm9yOworCisJaWYgKG1hcCA9PSBOVUxM
KQorCQltYXAgPSAmbm9ib3VuY2VfZG1hbWFwOworCisJaWYgKHNlZ3MgPT0gTlVMTCkKKwkJc2Vn
cyA9IGRtYXQtPnNlZ21lbnRzOworCisJaWYgKChkbWF0LT5ib3VuY2VfZmxhZ3MgJiBCVVNfRE1B
X0NPVUxEX0JPVU5DRSkgIT0gMCkgeworCQlfYnVzX2RtYW1hcF9jb3VudF9wYWdlcyhkbWF0LCBt
YXAsIHBtYXAsIGJ1ZiwgYnVmbGVuLCBmbGFncyk7CisJCWlmIChtYXAtPnBhZ2VzbmVlZGVkICE9
IDApIHsKKwkJCWVycm9yID0gX2J1c19kbWFtYXBfcmVzZXJ2ZV9wYWdlcyhkbWF0LCBtYXAsIGZs
YWdzKTsKKwkJCWlmIChlcnJvcikKKwkJCQlyZXR1cm4gKGVycm9yKTsKKwkJfQorCX0KKworCXZh
ZGRyID0gKHZtX29mZnNldF90KWJ1ZjsKKwl3aGlsZSAoYnVmbGVuID4gMCkgeworCQkvKgorCQkg
KiBHZXQgdGhlIHBoeXNpY2FsIGFkZHJlc3MgZm9yIHRoaXMgc2VnbWVudC4KKwkJICovCisJCWlm
IChwbWFwID09IGtlcm5lbF9wbWFwKQorCQkJY3VyYWRkciA9IHBtYXBfa2V4dHJhY3QodmFkZHIp
OworCQllbHNlCisJCQljdXJhZGRyID0gcG1hcF9leHRyYWN0KHBtYXAsIHZhZGRyKTsKKworCQkv
KgorCQkgKiBDb21wdXRlIHRoZSBzZWdtZW50IHNpemUsIGFuZCBhZGp1c3QgY291bnRzLgorCQkg
Ki8KKwkJbWF4X3Nnc2l6ZSA9IE1JTihidWZsZW4sIGRtYXQtPmNvbW1vbi5tYXhzZWdzeik7CisJ
CXNnc2l6ZSA9IFBBR0VfU0laRSAtICgodm1fb2Zmc2V0X3QpY3VyYWRkciAmIFBBR0VfTUFTSyk7
CisJCWlmICgoKGRtYXQtPmJvdW5jZV9mbGFncyAmIEJVU19ETUFfQ09VTERfQk9VTkNFKSAhPSAw
KSAmJgorCQkgICAgbWFwLT5wYWdlc25lZWRlZCAhPSAwICYmCisJCSAgICBidXNfZG1hX3J1bl9m
aWx0ZXIoJmRtYXQtPmNvbW1vbiwgY3VyYWRkcikpIHsKKwkJCXNnc2l6ZSA9IHJvdW5kdXAyKHNn
c2l6ZSwgZG1hdC0+Y29tbW9uLmFsaWdubWVudCk7CisJCQlzZ3NpemUgPSBNSU4oc2dzaXplLCBt
YXhfc2dzaXplKTsKKwkJCWN1cmFkZHIgPSBhZGRfYm91bmNlX3BhZ2UoZG1hdCwgbWFwLCB2YWRk
ciwgY3VyYWRkciwKKwkJCSAgICBzZ3NpemUpOworCQl9IGVsc2UgeworCQkJc2dzaXplID0gTUlO
KHNnc2l6ZSwgbWF4X3Nnc2l6ZSk7CisJCX0KKwkJc2dzaXplID0gX2J1c19kbWFtYXBfYWRkc2Vn
KGRtYXQsIG1hcCwgY3VyYWRkciwgc2dzaXplLCBzZWdzLAorCQkgICAgc2VncCk7CisJCWlmIChz
Z3NpemUgPT0gMCkKKwkJCWJyZWFrOworCQl2YWRkciArPSBzZ3NpemU7CisJCWJ1ZmxlbiAtPSBz
Z3NpemU7CisJfQorCisJLyoKKwkgKiBEaWQgd2UgZml0PworCSAqLworCXJldHVybiAoYnVmbGVu
ICE9IDAgPyBFRkJJRyA6IDApOyAvKiBYWFggYmV0dGVyIHJldHVybiB2YWx1ZSBoZXJlPyAqLwor
fQorCitzdGF0aWMgdm9pZAorYm91bmNlX2J1c19kbWFtYXBfd2FpdG9rKGJ1c19kbWFfdGFnX3Qg
ZG1hdCwgYnVzX2RtYW1hcF90IG1hcCwKKyAgICBzdHJ1Y3QgbWVtZGVzYyAqbWVtLCBidXNfZG1h
bWFwX2NhbGxiYWNrX3QgKmNhbGxiYWNrLCB2b2lkICpjYWxsYmFja19hcmcpCit7CisKKwlpZiAo
bWFwID09IE5VTEwpCisJCXJldHVybjsKKwltYXAtPm1lbSA9ICptZW07CisJbWFwLT5kbWF0ID0g
ZG1hdDsKKwltYXAtPmNhbGxiYWNrID0gY2FsbGJhY2s7CisJbWFwLT5jYWxsYmFja19hcmcgPSBj
YWxsYmFja19hcmc7Cit9CisKK3N0YXRpYyBidXNfZG1hX3NlZ21lbnRfdCAqCitib3VuY2VfYnVz
X2RtYW1hcF9jb21wbGV0ZShidXNfZG1hX3RhZ190IGRtYXQsIGJ1c19kbWFtYXBfdCBtYXAsCisg
ICAgYnVzX2RtYV9zZWdtZW50X3QgKnNlZ3MsIGludCBuc2VncywgaW50IGVycm9yKQoreworCisJ
aWYgKHNlZ3MgPT0gTlVMTCkKKwkJc2VncyA9IGRtYXQtPnNlZ21lbnRzOworCXJldHVybiAoc2Vn
cyk7Cit9CisKKy8qCisgKiBSZWxlYXNlIHRoZSBtYXBwaW5nIGhlbGQgYnkgbWFwLgorICovCitz
dGF0aWMgdm9pZAorYm91bmNlX2J1c19kbWFtYXBfdW5sb2FkKGJ1c19kbWFfdGFnX3QgZG1hdCwg
YnVzX2RtYW1hcF90IG1hcCkKK3sKKwlzdHJ1Y3QgYm91bmNlX3BhZ2UgKmJwYWdlOworCisJd2hp
bGUgKChicGFnZSA9IFNUQUlMUV9GSVJTVCgmbWFwLT5icGFnZXMpKSAhPSBOVUxMKSB7CisJCVNU
QUlMUV9SRU1PVkVfSEVBRCgmbWFwLT5icGFnZXMsIGxpbmtzKTsKKwkJZnJlZV9ib3VuY2VfcGFn
ZShkbWF0LCBicGFnZSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYm91bmNlX2J1c19kbWFtYXBf
c3luYyhidXNfZG1hX3RhZ190IGRtYXQsIGJ1c19kbWFtYXBfdCBtYXAsCisgICAgYnVzX2RtYXN5
bmNfb3BfdCBvcCkKK3sKKwlzdHJ1Y3QgYm91bmNlX3BhZ2UgKmJwYWdlOworCisJLyoKKwkgKiBY
WFggQVJNNjRUT0RPOgorCSAqIFRoaXMgYnVzX2RtYSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyBJ
Ty1Db2hlcmVudCBhcmNoaXRlY3V0cmUuCisJICogSWYgSU8tQ29oZXJlbmN5IGlzIG5vdCBndWFy
YW50ZWVkLCBjYWNoZSBvcGVyYXRpb25zIGhhdmUgdG8gYmUKKwkgKiBhZGRlZCB0byB0aGlzIGZ1
bmN0aW9uLgorCSAqLworCisJaWYgKChicGFnZSA9IFNUQUlMUV9GSVJTVCgmbWFwLT5icGFnZXMp
KSAhPSBOVUxMKSB7CisJCS8qCisJCSAqIEhhbmRsZSBkYXRhIGJvdW5jaW5nLiAgV2UgbWlnaHQg
YWxzbworCQkgKiB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBpbnZhbGlkYXRpbmcKKwkJICogdGhl
IGNhY2hlcyBvbiBicm9rZW4gaGFyZHdhcmUKKwkJICovCisJCUNUUjQoS1RSX0JVU0RNQSwgIiVz
OiB0YWcgJXAgdGFnIGZsYWdzIDB4JXggb3AgMHgleCAiCisJCSAgICAicGVyZm9ybWluZyBib3Vu
Y2UiLCBfX2Z1bmNfXywgZG1hdCwKKwkJICAgIGRtYXQtPmNvbW1vbi5mbGFncywgb3ApOworCisJ
CWlmICgob3AgJiBCVVNfRE1BU1lOQ19QUkVXUklURSkgIT0gMCkgeworCQkJd2hpbGUgKGJwYWdl
ICE9IE5VTEwpIHsKKwkJCQlpZiAoYnBhZ2UtPmRhdGF2YWRkciAhPSAwKSB7CisJCQkJCWJjb3B5
KCh2b2lkICopYnBhZ2UtPmRhdGF2YWRkciwKKwkJCQkJICAgICh2b2lkICopYnBhZ2UtPnZhZGRy
LAorCQkJCQkgICAgYnBhZ2UtPmRhdGFjb3VudCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcGh5c2Nv
cHlvdXQoYnBhZ2UtPmRhdGFhZGRyLAorCQkJCQkgICAgKHZvaWQgKilicGFnZS0+dmFkZHIsCisJ
CQkJCSAgICBicGFnZS0+ZGF0YWNvdW50KTsKKwkJCQl9CisJCQkJYnBhZ2UgPSBTVEFJTFFfTkVY
VChicGFnZSwgbGlua3MpOworCQkJfQorCQkJZG1hdC0+Ym91bmNlX3pvbmUtPnRvdGFsX2JvdW5j
ZWQrKzsKKwkJfQorCisJCWlmICgob3AgJiBCVVNfRE1BU1lOQ19QT1NUUkVBRCkgIT0gMCkgewor
CQkJd2hpbGUgKGJwYWdlICE9IE5VTEwpIHsKKwkJCQlpZiAoYnBhZ2UtPmRhdGF2YWRkciAhPSAw
KSB7CisJCQkJCWJjb3B5KCh2b2lkICopYnBhZ2UtPnZhZGRyLAorCQkJCQkgICAgKHZvaWQgKili
cGFnZS0+ZGF0YXZhZGRyLAorCQkJCQkgICAgYnBhZ2UtPmRhdGFjb3VudCk7CisJCQkJfSBlbHNl
IHsKKwkJCQkJcGh5c2NvcHlpbigodm9pZCAqKWJwYWdlLT52YWRkciwKKwkJCQkJICAgIGJwYWdl
LT5kYXRhYWRkciwKKwkJCQkJICAgIGJwYWdlLT5kYXRhY291bnQpOworCQkJCX0KKwkJCQlicGFn
ZSA9IFNUQUlMUV9ORVhUKGJwYWdlLCBsaW5rcyk7CisJCQl9CisJCQlkbWF0LT5ib3VuY2Vfem9u
ZS0+dG90YWxfYm91bmNlZCsrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAoraW5pdF9ib3Vu
Y2VfcGFnZXModm9pZCAqZHVtbXkgX191bnVzZWQpCit7CisKKwl0b3RhbF9icGFnZXMgPSAwOwor
CVNUQUlMUV9JTklUKCZib3VuY2Vfem9uZV9saXN0KTsKKwlTVEFJTFFfSU5JVCgmYm91bmNlX21h
cF93YWl0aW5nbGlzdCk7CisJU1RBSUxRX0lOSVQoJmJvdW5jZV9tYXBfY2FsbGJhY2tsaXN0KTsK
KwltdHhfaW5pdCgmYm91bmNlX2xvY2ssICJib3VuY2UgcGFnZXMgbG9jayIsIE5VTEwsIE1UWF9E
RUYpOworfQorU1lTSU5JVChicGFnZXMsIFNJX1NVQl9MT0NLLCBTSV9PUkRFUl9BTlksIGluaXRf
Ym91bmNlX3BhZ2VzLCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBzeXNjdGxfY3R4X2xpc3QgKgor
YnVzZG1hX3N5c2N0bF90cmVlKHN0cnVjdCBib3VuY2Vfem9uZSAqYnopCit7CisJcmV0dXJuICgm
YnotPnN5c2N0bF90cmVlKTsKK30KKworc3RhdGljIHN0cnVjdCBzeXNjdGxfb2lkICoKK2J1c2Rt
YV9zeXNjdGxfdHJlZV90b3Aoc3RydWN0IGJvdW5jZV96b25lICpieikKK3sKKwlyZXR1cm4gKGJ6
LT5zeXNjdGxfdHJlZV90b3ApOworfQorCitzdGF0aWMgaW50CithbGxvY19ib3VuY2Vfem9uZShi
dXNfZG1hX3RhZ190IGRtYXQpCit7CisJc3RydWN0IGJvdW5jZV96b25lICpiejsKKworCS8qIENo
ZWNrIHRvIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBzdWl0YWJsZSB6b25lICovCisJU1RBSUxR
X0ZPUkVBQ0goYnosICZib3VuY2Vfem9uZV9saXN0LCBsaW5rcykgeworCQlpZiAoKGRtYXQtPmNv
bW1vbi5hbGlnbm1lbnQgPD0gYnotPmFsaWdubWVudCkgJiYKKwkJICAgIChkbWF0LT5jb21tb24u
bG93YWRkciA+PSBiei0+bG93YWRkcikpIHsKKwkJCWRtYXQtPmJvdW5jZV96b25lID0gYno7CisJ
CQlyZXR1cm4gKDApOworCQl9CisJfQorCisJaWYgKChieiA9IChzdHJ1Y3QgYm91bmNlX3pvbmUg
KiltYWxsb2Moc2l6ZW9mKCpieiksIE1fREVWQlVGLAorCSAgICBNX05PV0FJVCB8IE1fWkVSTykp
ID09IE5VTEwpCisJCXJldHVybiAoRU5PTUVNKTsKKworCVNUQUlMUV9JTklUKCZiei0+Ym91bmNl
X3BhZ2VfbGlzdCk7CisJYnotPmZyZWVfYnBhZ2VzID0gMDsKKwliei0+cmVzZXJ2ZWRfYnBhZ2Vz
ID0gMDsKKwliei0+YWN0aXZlX2JwYWdlcyA9IDA7CisJYnotPmxvd2FkZHIgPSBkbWF0LT5jb21t
b24ubG93YWRkcjsKKwliei0+YWxpZ25tZW50ID0gTUFYKGRtYXQtPmNvbW1vbi5hbGlnbm1lbnQs
IFBBR0VfU0laRSk7CisJYnotPm1hcF9jb3VudCA9IDA7CisJc25wcmludGYoYnotPnpvbmVpZCwg
OCwgInpvbmUlZCIsIGJ1c2RtYV96b25lY291bnQpOworCWJ1c2RtYV96b25lY291bnQrKzsKKwlz
bnByaW50Zihiei0+bG93YWRkcmlkLCAxOCwgIiUjangiLCAodWludG1heF90KWJ6LT5sb3dhZGRy
KTsKKwlTVEFJTFFfSU5TRVJUX1RBSUwoJmJvdW5jZV96b25lX2xpc3QsIGJ6LCBsaW5rcyk7CisJ
ZG1hdC0+Ym91bmNlX3pvbmUgPSBiejsKKworCXN5c2N0bF9jdHhfaW5pdCgmYnotPnN5c2N0bF90
cmVlKTsKKwliei0+c3lzY3RsX3RyZWVfdG9wID0gU1lTQ1RMX0FERF9OT0RFKCZiei0+c3lzY3Rs
X3RyZWUsCisJICAgIFNZU0NUTF9TVEFUSUNfQ0hJTERSRU4oX2h3X2J1c2RtYSksIE9JRF9BVVRP
LCBiei0+em9uZWlkLAorCSAgICBDVExGTEFHX1JELCAwLCAiIik7CisJaWYgKGJ6LT5zeXNjdGxf
dHJlZV90b3AgPT0gTlVMTCkgeworCQlzeXNjdGxfY3R4X2ZyZWUoJmJ6LT5zeXNjdGxfdHJlZSk7
CisJCXJldHVybiAoMCk7CS8qIFhYWCBlcnJvciBjb2RlPyAqLworCX0KKworCVNZU0NUTF9BRERf
SU5UKGJ1c2RtYV9zeXNjdGxfdHJlZShieiksCisJICAgIFNZU0NUTF9DSElMRFJFTihidXNkbWFf
c3lzY3RsX3RyZWVfdG9wKGJ6KSksIE9JRF9BVVRPLAorCSAgICAidG90YWxfYnBhZ2VzIiwgQ1RM
RkxBR19SRCwgJmJ6LT50b3RhbF9icGFnZXMsIDAsCisJICAgICJUb3RhbCBib3VuY2UgcGFnZXMi
KTsKKwlTWVNDVExfQUREX0lOVChidXNkbWFfc3lzY3RsX3RyZWUoYnopLAorCSAgICBTWVNDVExf
Q0hJTERSRU4oYnVzZG1hX3N5c2N0bF90cmVlX3RvcChieikpLCBPSURfQVVUTywKKwkgICAgImZy
ZWVfYnBhZ2VzIiwgQ1RMRkxBR19SRCwgJmJ6LT5mcmVlX2JwYWdlcywgMCwKKwkgICAgIkZyZWUg
Ym91bmNlIHBhZ2VzIik7CisJU1lTQ1RMX0FERF9JTlQoYnVzZG1hX3N5c2N0bF90cmVlKGJ6KSwK
KwkgICAgU1lTQ1RMX0NISUxEUkVOKGJ1c2RtYV9zeXNjdGxfdHJlZV90b3AoYnopKSwgT0lEX0FV
VE8sCisJICAgICJyZXNlcnZlZF9icGFnZXMiLCBDVExGTEFHX1JELCAmYnotPnJlc2VydmVkX2Jw
YWdlcywgMCwKKwkgICAgIlJlc2VydmVkIGJvdW5jZSBwYWdlcyIpOworCVNZU0NUTF9BRERfSU5U
KGJ1c2RtYV9zeXNjdGxfdHJlZShieiksCisJICAgIFNZU0NUTF9DSElMRFJFTihidXNkbWFfc3lz
Y3RsX3RyZWVfdG9wKGJ6KSksIE9JRF9BVVRPLAorCSAgICAiYWN0aXZlX2JwYWdlcyIsIENUTEZM
QUdfUkQsICZiei0+YWN0aXZlX2JwYWdlcywgMCwKKwkgICAgIkFjdGl2ZSBib3VuY2UgcGFnZXMi
KTsKKwlTWVNDVExfQUREX0lOVChidXNkbWFfc3lzY3RsX3RyZWUoYnopLAorCSAgICBTWVNDVExf
Q0hJTERSRU4oYnVzZG1hX3N5c2N0bF90cmVlX3RvcChieikpLCBPSURfQVVUTywKKwkgICAgInRv
dGFsX2JvdW5jZWQiLCBDVExGTEFHX1JELCAmYnotPnRvdGFsX2JvdW5jZWQsIDAsCisJICAgICJU
b3RhbCBib3VuY2UgcmVxdWVzdHMiKTsKKwlTWVNDVExfQUREX0lOVChidXNkbWFfc3lzY3RsX3Ry
ZWUoYnopLAorCSAgICBTWVNDVExfQ0hJTERSRU4oYnVzZG1hX3N5c2N0bF90cmVlX3RvcChieikp
LCBPSURfQVVUTywKKwkgICAgInRvdGFsX2RlZmVycmVkIiwgQ1RMRkxBR19SRCwgJmJ6LT50b3Rh
bF9kZWZlcnJlZCwgMCwKKwkgICAgIlRvdGFsIGJvdW5jZSByZXF1ZXN0cyB0aGF0IHdlcmUgZGVm
ZXJyZWQiKTsKKwlTWVNDVExfQUREX1NUUklORyhidXNkbWFfc3lzY3RsX3RyZWUoYnopLAorCSAg
ICBTWVNDVExfQ0hJTERSRU4oYnVzZG1hX3N5c2N0bF90cmVlX3RvcChieikpLCBPSURfQVVUTywK
KwkgICAgImxvd2FkZHIiLCBDVExGTEFHX1JELCBiei0+bG93YWRkcmlkLCAwLCAiIik7CisJU1lT
Q1RMX0FERF9VQVVUTyhidXNkbWFfc3lzY3RsX3RyZWUoYnopLAorCSAgICBTWVNDVExfQ0hJTERS
RU4oYnVzZG1hX3N5c2N0bF90cmVlX3RvcChieikpLCBPSURfQVVUTywKKwkgICAgImFsaWdubWVu
dCIsIENUTEZMQUdfUkQsICZiei0+YWxpZ25tZW50LCAiIik7CisKKwlyZXR1cm4gKDApOworfQor
CitzdGF0aWMgaW50CithbGxvY19ib3VuY2VfcGFnZXMoYnVzX2RtYV90YWdfdCBkbWF0LCB1X2lu
dCBudW1wYWdlcykKK3sKKwlzdHJ1Y3QgYm91bmNlX3pvbmUgKmJ6OworCWludCBjb3VudDsKKwor
CWJ6ID0gZG1hdC0+Ym91bmNlX3pvbmU7CisJY291bnQgPSAwOworCXdoaWxlIChudW1wYWdlcyA+
IDApIHsKKwkJc3RydWN0IGJvdW5jZV9wYWdlICpicGFnZTsKKworCQlicGFnZSA9IChzdHJ1Y3Qg
Ym91bmNlX3BhZ2UgKiltYWxsb2Moc2l6ZW9mKCpicGFnZSksIE1fREVWQlVGLAorCQkJCQkJICAg
ICBNX05PV0FJVCB8IE1fWkVSTyk7CisKKwkJaWYgKGJwYWdlID09IE5VTEwpCisJCQlicmVhazsK
KwkJYnBhZ2UtPnZhZGRyID0gKHZtX29mZnNldF90KWNvbnRpZ21hbGxvYyhQQUdFX1NJWkUsIE1f
REVWQlVGLAorCQkJCQkJCSBNX05PV0FJVCwgMHVsLAorCQkJCQkJCSBiei0+bG93YWRkciwKKwkJ
CQkJCQkgUEFHRV9TSVpFLAorCQkJCQkJCSAwKTsKKwkJaWYgKGJwYWdlLT52YWRkciA9PSAwKSB7
CisJCQlmcmVlKGJwYWdlLCBNX0RFVkJVRik7CisJCQlicmVhazsKKwkJfQorCQlicGFnZS0+YnVz
YWRkciA9IHBtYXBfa2V4dHJhY3QoYnBhZ2UtPnZhZGRyKTsKKwkJbXR4X2xvY2soJmJvdW5jZV9s
b2NrKTsKKwkJU1RBSUxRX0lOU0VSVF9UQUlMKCZiei0+Ym91bmNlX3BhZ2VfbGlzdCwgYnBhZ2Us
IGxpbmtzKTsKKwkJdG90YWxfYnBhZ2VzKys7CisJCWJ6LT50b3RhbF9icGFnZXMrKzsKKwkJYnot
PmZyZWVfYnBhZ2VzKys7CisJCW10eF91bmxvY2soJmJvdW5jZV9sb2NrKTsKKwkJY291bnQrKzsK
KwkJbnVtcGFnZXMtLTsKKwl9CisJcmV0dXJuIChjb3VudCk7Cit9CisKK3N0YXRpYyBpbnQKK3Jl
c2VydmVfYm91bmNlX3BhZ2VzKGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCwg
aW50IGNvbW1pdCkKK3sKKwlzdHJ1Y3QgYm91bmNlX3pvbmUgKmJ6OworCWludCBwYWdlczsKKwor
CW10eF9hc3NlcnQoJmJvdW5jZV9sb2NrLCBNQV9PV05FRCk7CisJYnogPSBkbWF0LT5ib3VuY2Vf
em9uZTsKKwlwYWdlcyA9IE1JTihiei0+ZnJlZV9icGFnZXMsIG1hcC0+cGFnZXNuZWVkZWQgLSBt
YXAtPnBhZ2VzcmVzZXJ2ZWQpOworCWlmIChjb21taXQgPT0gMCAmJiBtYXAtPnBhZ2VzbmVlZGVk
ID4gKG1hcC0+cGFnZXNyZXNlcnZlZCArIHBhZ2VzKSkKKwkJcmV0dXJuIChtYXAtPnBhZ2VzbmVl
ZGVkIC0gKG1hcC0+cGFnZXNyZXNlcnZlZCArIHBhZ2VzKSk7CisJYnotPmZyZWVfYnBhZ2VzIC09
IHBhZ2VzOworCWJ6LT5yZXNlcnZlZF9icGFnZXMgKz0gcGFnZXM7CisJbWFwLT5wYWdlc3Jlc2Vy
dmVkICs9IHBhZ2VzOworCXBhZ2VzID0gbWFwLT5wYWdlc25lZWRlZCAtIG1hcC0+cGFnZXNyZXNl
cnZlZDsKKworCXJldHVybiAocGFnZXMpOworfQorCitzdGF0aWMgYnVzX2FkZHJfdAorYWRkX2Jv
dW5jZV9wYWdlKGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCwgdm1fb2Zmc2V0
X3QgdmFkZHIsCisJCWJ1c19hZGRyX3QgYWRkciwgYnVzX3NpemVfdCBzaXplKQoreworCXN0cnVj
dCBib3VuY2Vfem9uZSAqYno7CisJc3RydWN0IGJvdW5jZV9wYWdlICpicGFnZTsKKworCUtBU1NF
UlQoZG1hdC0+Ym91bmNlX3pvbmUgIT0gTlVMTCwgKCJubyBib3VuY2Ugem9uZSBpbiBkbWEgdGFn
IikpOworCUtBU1NFUlQobWFwICE9IE5VTEwgJiYgbWFwICE9ICZub2JvdW5jZV9kbWFtYXAsCisJ
ICAgICgiYWRkX2JvdW5jZV9wYWdlOiBiYWQgbWFwICVwIiwgbWFwKSk7CisKKwlieiA9IGRtYXQt
PmJvdW5jZV96b25lOworCWlmIChtYXAtPnBhZ2VzbmVlZGVkID09IDApCisJCXBhbmljKCJhZGRf
Ym91bmNlX3BhZ2U6IG1hcCBkb2Vzbid0IG5lZWQgYW55IHBhZ2VzIik7CisJbWFwLT5wYWdlc25l
ZWRlZC0tOworCisJaWYgKG1hcC0+cGFnZXNyZXNlcnZlZCA9PSAwKQorCQlwYW5pYygiYWRkX2Jv
dW5jZV9wYWdlOiBtYXAgZG9lc24ndCBuZWVkIGFueSBwYWdlcyIpOworCW1hcC0+cGFnZXNyZXNl
cnZlZC0tOworCisJbXR4X2xvY2soJmJvdW5jZV9sb2NrKTsKKwlicGFnZSA9IFNUQUlMUV9GSVJT
VCgmYnotPmJvdW5jZV9wYWdlX2xpc3QpOworCWlmIChicGFnZSA9PSBOVUxMKQorCQlwYW5pYygi
YWRkX2JvdW5jZV9wYWdlOiBmcmVlIHBhZ2UgbGlzdCBpcyBlbXB0eSIpOworCisJU1RBSUxRX1JF
TU9WRV9IRUFEKCZiei0+Ym91bmNlX3BhZ2VfbGlzdCwgbGlua3MpOworCWJ6LT5yZXNlcnZlZF9i
cGFnZXMtLTsKKwliei0+YWN0aXZlX2JwYWdlcysrOworCW10eF91bmxvY2soJmJvdW5jZV9sb2Nr
KTsKKworCWlmIChkbWF0LT5jb21tb24uZmxhZ3MgJiBCVVNfRE1BX0tFRVBfUEdfT0ZGU0VUKSB7
CisJCS8qIFBhZ2Ugb2Zmc2V0IG5lZWRzIHRvIGJlIHByZXNlcnZlZC4gKi8KKwkJYnBhZ2UtPnZh
ZGRyIHw9IHZhZGRyICYgUEFHRV9NQVNLOworCQlicGFnZS0+YnVzYWRkciB8PSB2YWRkciAmIFBB
R0VfTUFTSzsKKwl9CisJYnBhZ2UtPmRhdGF2YWRkciA9IHZhZGRyOworCWJwYWdlLT5kYXRhYWRk
ciA9IGFkZHI7CisJYnBhZ2UtPmRhdGFjb3VudCA9IHNpemU7CisJU1RBSUxRX0lOU0VSVF9UQUlM
KCYobWFwLT5icGFnZXMpLCBicGFnZSwgbGlua3MpOworCXJldHVybiAoYnBhZ2UtPmJ1c2FkZHIp
OworfQorCitzdGF0aWMgdm9pZAorZnJlZV9ib3VuY2VfcGFnZShidXNfZG1hX3RhZ190IGRtYXQs
IHN0cnVjdCBib3VuY2VfcGFnZSAqYnBhZ2UpCit7CisJc3RydWN0IGJ1c19kbWFtYXAgKm1hcDsK
KwlzdHJ1Y3QgYm91bmNlX3pvbmUgKmJ6OworCisJYnogPSBkbWF0LT5ib3VuY2Vfem9uZTsKKwli
cGFnZS0+ZGF0YXZhZGRyID0gMDsKKwlicGFnZS0+ZGF0YWNvdW50ID0gMDsKKwlpZiAoZG1hdC0+
Y29tbW9uLmZsYWdzICYgQlVTX0RNQV9LRUVQX1BHX09GRlNFVCkgeworCQkvKgorCQkgKiBSZXNl
dCB0aGUgYm91bmNlIHBhZ2UgdG8gc3RhcnQgYXQgb2Zmc2V0IDAuICBPdGhlciB1c2VzCisJCSAq
IG9mIHRoaXMgYm91bmNlIHBhZ2UgbWF5IG5lZWQgdG8gc3RvcmUgYSBmdWxsIHBhZ2Ugb2YKKwkJ
ICogZGF0YSBhbmQvb3IgYXNzdW1lIGl0IHN0YXJ0cyBvbiBhIHBhZ2UgYm91bmRhcnkuCisJCSAq
LworCQlicGFnZS0+dmFkZHIgJj0gflBBR0VfTUFTSzsKKwkJYnBhZ2UtPmJ1c2FkZHIgJj0gflBB
R0VfTUFTSzsKKwl9CisKKwltdHhfbG9jaygmYm91bmNlX2xvY2spOworCVNUQUlMUV9JTlNFUlRf
SEVBRCgmYnotPmJvdW5jZV9wYWdlX2xpc3QsIGJwYWdlLCBsaW5rcyk7CisJYnotPmZyZWVfYnBh
Z2VzKys7CisJYnotPmFjdGl2ZV9icGFnZXMtLTsKKwlpZiAoKG1hcCA9IFNUQUlMUV9GSVJTVCgm
Ym91bmNlX21hcF93YWl0aW5nbGlzdCkpICE9IE5VTEwpIHsKKwkJaWYgKHJlc2VydmVfYm91bmNl
X3BhZ2VzKG1hcC0+ZG1hdCwgbWFwLCAxKSA9PSAwKSB7CisJCQlTVEFJTFFfUkVNT1ZFX0hFQUQo
JmJvdW5jZV9tYXBfd2FpdGluZ2xpc3QsIGxpbmtzKTsKKwkJCVNUQUlMUV9JTlNFUlRfVEFJTCgm
Ym91bmNlX21hcF9jYWxsYmFja2xpc3QsCisJCQkgICAgbWFwLCBsaW5rcyk7CisJCQlidXNkbWFf
c3dpX3BlbmRpbmcgPSAxOworCQkJYnotPnRvdGFsX2RlZmVycmVkKys7CisJCQlzd2lfc2NoZWQo
dm1faWgsIDApOworCQl9CisJfQorCW10eF91bmxvY2soJmJvdW5jZV9sb2NrKTsKK30KKwordm9p
ZAorYnVzZG1hX3N3aSh2b2lkKQoreworCWJ1c19kbWFfdGFnX3QgZG1hdDsKKwlzdHJ1Y3QgYnVz
X2RtYW1hcCAqbWFwOworCisJbXR4X2xvY2soJmJvdW5jZV9sb2NrKTsKKwl3aGlsZSAoKG1hcCA9
IFNUQUlMUV9GSVJTVCgmYm91bmNlX21hcF9jYWxsYmFja2xpc3QpKSAhPSBOVUxMKSB7CisJCVNU
QUlMUV9SRU1PVkVfSEVBRCgmYm91bmNlX21hcF9jYWxsYmFja2xpc3QsIGxpbmtzKTsKKwkJbXR4
X3VubG9jaygmYm91bmNlX2xvY2spOworCQlkbWF0ID0gbWFwLT5kbWF0OworCQkoZG1hdC0+Y29t
bW9uLmxvY2tmdW5jKShkbWF0LT5jb21tb24ubG9ja2Z1bmNhcmcsIEJVU19ETUFfTE9DSyk7CisJ
CWJ1c19kbWFtYXBfbG9hZF9tZW0obWFwLT5kbWF0LCBtYXAsICZtYXAtPm1lbSwKKwkJICAgIG1h
cC0+Y2FsbGJhY2ssIG1hcC0+Y2FsbGJhY2tfYXJnLCBCVVNfRE1BX1dBSVRPSyk7CisJCShkbWF0
LT5jb21tb24ubG9ja2Z1bmMpKGRtYXQtPmNvbW1vbi5sb2NrZnVuY2FyZywKKwkJICAgIEJVU19E
TUFfVU5MT0NLKTsKKwkJbXR4X2xvY2soJmJvdW5jZV9sb2NrKTsKKwl9CisJbXR4X3VubG9jaygm
Ym91bmNlX2xvY2spOworfQorCitzdHJ1Y3QgYnVzX2RtYV9pbXBsIGJ1c19kbWFfYm91bmNlX2lt
cGwgPSB7CisJLnRhZ19jcmVhdGUgPSBib3VuY2VfYnVzX2RtYV90YWdfY3JlYXRlLAorCS50YWdf
ZGVzdHJveSA9IGJvdW5jZV9idXNfZG1hX3RhZ19kZXN0cm95LAorCS5tYXBfY3JlYXRlID0gYm91
bmNlX2J1c19kbWFtYXBfY3JlYXRlLAorCS5tYXBfZGVzdHJveSA9IGJvdW5jZV9idXNfZG1hbWFw
X2Rlc3Ryb3ksCisJLm1lbV9hbGxvYyA9IGJvdW5jZV9idXNfZG1hbWVtX2FsbG9jLAorCS5tZW1f
ZnJlZSA9IGJvdW5jZV9idXNfZG1hbWVtX2ZyZWUsCisJLmxvYWRfcGh5cyA9IGJvdW5jZV9idXNf
ZG1hbWFwX2xvYWRfcGh5cywKKwkubG9hZF9idWZmZXIgPSBib3VuY2VfYnVzX2RtYW1hcF9sb2Fk
X2J1ZmZlciwKKwkubG9hZF9tYSA9IGJ1c19kbWFtYXBfbG9hZF9tYV90cml2LAorCS5tYXBfd2Fp
dG9rID0gYm91bmNlX2J1c19kbWFtYXBfd2FpdG9rLAorCS5tYXBfY29tcGxldGUgPSBib3VuY2Vf
YnVzX2RtYW1hcF9jb21wbGV0ZSwKKwkubWFwX3VubG9hZCA9IGJvdW5jZV9idXNfZG1hbWFwX3Vu
bG9hZCwKKwkubWFwX3N5bmMgPSBib3VuY2VfYnVzX2RtYW1hcF9zeW5jCit9OwoK


--b1_8438b44d4f3b7e535062a5c7553b260f--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?differential-rev-PHID-DREV-h7f3zkqdq4qxyli7oe3v-req>