Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 4 Aug 2010 01:14:42 +0530
From:      "Jayachandran C." <c.jayachandran@gmail.com>
To:        Juli Mallett <jmallett@freebsd.org>, "M. Warner Losh" <imp@bsdimp.com>, freebsd-mips@freebsd.org
Subject:   Merged pmap.c - Re: Support for 64bit userspace.
Message-ID:  <AANLkTimOr-JGU_jxFZ5QP2QSM-jWKJDXRc7O3ZTaoALX@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
--001485f6c88a730961048cf08cb7
Content-Type: text/plain; charset=windows-1252
Content-Transfer-Encoding: quoted-printable

On Sat, Jul 31, 2010 at 5:17 AM, Jayachandran C.
<c.jayachandran@gmail.com>wrote:

> On Fri, Jul 30, 2010 at 2:07 PM, Juli Mallett <jmallett@freebsd.org>wrote=
:
>
>> On Fri, Jul 30, 2010 at 01:15, Jayachandran C. <c.jayachandran@gmail.com=
>
>> wrote:
>> > I will look at merging them without too many ifdefs. Another
>> > possibility is to have a pmap.c, pmap32.c and pmap64.c, so that the
>> > common code is not duplicated, but that too (as far as I can see) will
>> > require a config option.
>>
>> I'm not really sure what the aversion to ifdefs is =97 they kind of come
>> with the territory and this is exactly the part of the system where
>> you expect to have them to conditionalize exactly this kind of
>> behavior.  If you were going to split out some subroutines for 32-bit
>> and 64-bit, there are two ways you can do it without a config option
>> (and I agree with you that avoiding one is very desirable =97 we already
>> use too many knobs to get the right ABI in kernel configs).  You could
>> do:
>>
>> #ifndef __mips_n64
>> #include "pmap32.c"
>> #else
>> #include "pmap64.c"
>> #endif
>>
>> Or you could wrap the whole 32/64 files (modulo a "struct __hack;" or
>> whatever to avoid an empty translation unit) with ifdefs.
>>
>> Personally, I find having two implementations of a function a lot
>> harder to read and keep track of than a single implementation with
>> ifdefs in the body =97 there's very few places in the kernel where we do
>> the former.  If you do split out functions into separate files I would
>> beg you to only split out the really big functions that are actually
>> doing things based on different levels of page tables and then it's
>> obvious why those things have two implementations and what needs to be
>> abstracted to merge them.  Having two copies of trivial functions or
>> non-trivial functions that are mostly identical is a bad thing.
>>
>> You're doing the work, so at some point it's kind of your call, but I
>> feel like you're making style changes to things that I cleaned up and
>> tried to unify in pmap.c and that the way that they're done is pretty
>> significant given how intimidating people find pmap.  If we were going
>> to support different kinds of MMUs (e.g. adding support for BAT-based
>> MMUs) I'd be in favor of splitting things up, but then I'd want to
>> follow PowerPC's lead.  For now I think the appropriate thing to do is
>> to follow the lead of my 64-bit work in the MIPS pmap and the PAE work
>> in the i386 pmap and to use ifdefs and to try to abstract out the
>> page-table differences.
>>
>
> I had not looked at merging the files so far (mostly because it was easie=
r
> to do it this way), so I will see how best this can be done.
>
> I'm really thrilled with the work you're doing and can't wait for it
>> to be in head =97 I'm quite eager to move everything on Octeon to n64 :)
>>
>
> I have checked in everything except the page table implementation code.
>
> If you like to try the current code, the attached patch has the rest of t=
he
> changes.  This has a few more issues fixed, n64 mostly works for me, exce=
pt
> a csh crash I'm looking at.
>
> I'll have a look at merging pmap.c with pmap64.c, and have another look a=
t
> the PAE.
>


Here's is the merged version of n64 changes. I had to change the existing
pmap.c style a bit, so that merging the 32 bit and 64 bit versions was
easier.

On the n64 compilation, I have done a few more fixes, and the current code
comes up multi-user and holds up pretty well on XLR.

I'm doing some stress testing on o32 to see that I have not broken anything
there during the changes.

Let me know your comments. Also note that PTEs are still 32 bit and KSEG0
addresses are still used for page table pages, but these can be added...

Thanks,
JC.

--001485f6c88a730961048cf08cb7
Content-Type: application/octet-stream; name="mips-3lvl-pt.patch"
Content-Disposition: attachment; filename="mips-3lvl-pt.patch"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gcf5mpts1

SW5kZXg6IHN5cy9taXBzL2luY2x1ZGUvcGFyYW0uaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbWlwcy9p
bmNsdWRlL3BhcmFtLmgJKHJldmlzaW9uIDIxMDc5NikKKysrIHN5cy9taXBzL2luY2x1ZGUvcGFy
YW0uaAkod29ya2luZyBjb3B5KQpAQCAtMTA3LDggKzEwNywxOCBAQAogI2RlZmluZQlOUFRFUEcJ
CShQQUdFX1NJWkUvKHNpemVvZiAocHRfZW50cnlfdCkpKQogI2RlZmluZQlOUERFUEcJCShQQUdF
X1NJWkUvKHNpemVvZiAocGRfZW50cnlfdCkpKQogCisjaWYgZGVmaW5lZChfX21pcHNfbjY0KQor
I2RlZmluZQlTRUdTSElGVAkzMQkJLyogTE9HMihOQlNFRykgKi8KKyNkZWZpbmUJTkJTRUcJCSgx
dWwgPDwgU0VHU0hJRlQpCS8qIGJ5dGVzL3NlZ21lbnQgKi8KKyNkZWZpbmUJUERSU0hJRlQJMjIg
ICAgICAgICAgICAgIC8qIHNlY29uZCBsZXZlbCAqLworI2RlZmluZQlQRFJNQVNLCQkoKDEgPDwg
UERSU0hJRlQpIC0gMSkKKyNlbHNlCiAjZGVmaW5lCVNFR1NISUZUCTIyCQkvKiBMT0cyKE5CU0VH
KSAqLwogI2RlZmluZQlOQlNFRwkJKDEgPDwgU0VHU0hJRlQpCS8qIGJ5dGVzL3NlZ21lbnQgKi8K
KyNkZWZpbmUJUERSU0hJRlQJU0VHU0hJRlQJLyogYWxpYXMgZm9yIFNFRyBpbiAzMiBiaXQgKi8K
KyNkZWZpbmUJUERSTUFTSwkJKCgxIDw8IFBEUlNISUZUKSAtIDEpCisjZW5kaWYKKyNkZWZpbmUJ
TkJQRFIJCSgxIDw8IFBEUlNISUZUKQkvKiBieXRlcy9wYWdlZGlyICovCiAjZGVmaW5lCVNFR01B
U0sJCShOQlNFRy0xKQkvKiBieXRlIG9mZnNldCBpbnRvIHNlZ21lbnQgKi8KIAogI2RlZmluZQlN
QVhQQUdFU0laRVMJMQkJLyogbWF4aW11bSBudW1iZXIgb2Ygc3VwcG9ydGVkIHBhZ2Ugc2l6ZXMg
Ki8KQEAgLTExOSw3ICsxMjksNyBAQAogLyoKICAqIFRoZSBrZXJuZWwgc3RhY2sgbmVlZHMgdG8g
YmUgYWxpZ25lZCBvbiBhIChQQUdFX1NJWkUgKiAyKSBib3VuZGFyeS4KICAqLwotI2RlZmluZQlL
U1RBQ0tfUEFHRVMJCTIJLyoga2VybmVsIHN0YWNrKi8KKyNkZWZpbmUJS1NUQUNLX1BBR0VTCQky
CS8qIGtlcm5lbCBzdGFjayAqLwogI2RlZmluZQlLU1RBQ0tfR1VBUkRfUEFHRVMJMgkvKiBwYWdl
cyBvZiBrc3RhY2sgZ3VhcmQ7IDAgZGlzYWJsZXMgKi8KIAogI2RlZmluZQlVUEFHRVMJCQkyCklu
ZGV4OiBzeXMvbWlwcy9pbmNsdWRlL3ZtcGFyYW0uaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbWlwcy9p
bmNsdWRlL3ZtcGFyYW0uaAkocmV2aXNpb24gMjEwNzk2KQorKysgc3lzL21pcHMvaW5jbHVkZS92
bXBhcmFtLmgJKHdvcmtpbmcgY29weSkKQEAgLTE4NSw3ICsxODUsNyBAQAogICoJICBhbGxvY2F0
aW9ucyB1c2UgSElHSE1FTSBpZiBhdmFpbGFibGUsIGFuZCB0aGVuIERFRkFVTFQuIAogICoJLSBI
SUdITUVNIGZvciBvdGhlciBwYWdlcyAKICAqLwotI2lmZGVmIF9fbWlwc19uNjQKKyNpZiAwIC8q
IE5vdCB5ZXQsIGNoYW5nZSBuNjQgdG8gdXNlIHhrcGh5cyAqLwogI2RlZmluZQlWTV9ORlJFRUxJ
U1QJCTEKICNkZWZpbmUJVk1fRlJFRUxJU1RfREVGQVVMVAkwCiAjZGVmaW5lCVZNX0ZSRUVMSVNU
X0RJUkVDVAlWTV9GUkVFTElTVF9ERUZBVUxUCkluZGV4OiBzeXMvbWlwcy9taXBzL2V4Y2VwdGlv
bi5TCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIHN5cy9taXBzL21pcHMvZXhjZXB0aW9uLlMJKHJldmlzaW9uIDIx
MDc5NikKKysrIHN5cy9taXBzL21pcHMvZXhjZXB0aW9uLlMJKHdvcmtpbmcgY29weSkKQEAgLTEz
Nyw3ICsxMzcsMTUgQEAKIAlQVFJfTAkJazEsIDAoazEpCQkJIzA4OiBrMT1zZWcgZW50cnkKIAlN
RkMwCQlrMCwgTUlQU19DT1BfMF9CQURfVkFERFIJIzA5OiBrMD1iYWQgYWRkcmVzcyAoYWdhaW4p
CiAJYmVxCQlrMSwgemVybywgMmYJCQkjMGE6ID09MCAtLSBubyBwYWdlIHRhYmxlCi0Jc3JsCQlr
MCwgUEFHRV9TSElGVCAtIDIJCSMwYjogazA9VlBOIChha2EgdmE+PjEwKQorI2lmZGVmIF9fbWlw
c19uNjQKKwlQVFJfU1JMCQlrMCwgUERSU0hJRlQgLSBQVFJTSElGVAkJIyBrMD1WUE4KKwlhbmRp
CQlrMCwgazAsIFBUUk1BU0sJCQkjIGswPXBkZSBvZmZzZXQKKwlQVFJfQUREVQlrMSwgazAsIGsx
CQkJIyBrMT1wZGUgZW50cnkgYWRkcmVzcworCVBUUl9MCQlrMSwgMChrMSkJCQkjIGsxPXBkZSBl
bnRyeQorCU1GQzAJCWswLCBNSVBTX0NPUF8wX0JBRF9WQUREUgkjIGswPWJhZCBhZGRyZXNzIChh
Z2FpbikKKwliZXEJCWsxLCB6ZXJvLCAyZgkJCSMgPT0wIC0tIG5vIHBhZ2UgdGFibGUKKyNlbmRp
ZgorCVBUUl9TUkwJCWswLCBQQUdFX1NISUZUIC0gMgkJIzBiOiBrMD1WUE4gKGFrYSB2YT4+MTAp
CiAJYW5kaQkJazAsIGswLCAweGZmOAkJCSMwYzogazA9cGFnZSB0YWIgb2Zmc2V0CiAJUFRSX0FE
RFUJazEsIGsxLCBrMAkJCSMwZDogazE9cHRlIGFkZHJlc3MKIAlsdwkJazAsIDAoazEpCQkJIzBl
OiBrMD1sbzAgcHRlCkBAIC04MzYsNiArODQ0LDE4IEBACiAJYmVxegkJazEsIDNmCiAJbm9wCiAK
KyNpZmRlZiBfX21pcHNfbjY0CisJTUZDMAkJazAsIE1JUFNfQ09QXzBfQkFEX1ZBRERSCisJUFRS
X1NSTAkJazAsIFBEUlNISUZUIC0gUFRSU0hJRlQJCSMgazA9cGRlIG9mZnNldCAoYWxtb3N0KQor
CWJlcQkJazEsIHplcm8sIE1pcHNLZXJuR2VuRXhjZXB0aW9uCSMgPT0wIC0tIG5vIHBkZSB0YWIK
KwlhbmRpCQlrMCwgazAsIFBUUk1BU0sJCQkjIGswPXBkZSBvZmZzZXQKKwlQVFJfQUREVQlrMSwg
azAsIGsxCQkJIyBrMT1wZGUgZW50cnkgYWRkcmVzcworCVBUUl9MCQlrMSwgMChrMSkJCQkjIGsx
PXBkZSBlbnRyeQorCisJLyogVmFsaWRhdGUgcGRlIHRhYmxlIHBvaW50ZXIuICAqLworCWJlcXoJ
CWsxLCAzZgorCW5vcAorI2VuZGlmCiAJTUZDMAkJazAsIE1JUFNfQ09QXzBfQkFEX1ZBRERSCSMg
azA9YmFkIGFkZHJlc3MgKGFnYWluKQogCVBUUl9TUkwJCWswLCBQQUdFX1NISUZUIC0gMgkJIyBr
MD1WUE4KIAlhbmRpCQlrMCwgazAsIDB4ZmZjCQkJIyBrMD1wYWdlIHRhYiBvZmZzZXQKQEAgLTk5
Niw2ICsxMDE2LDE0IEBACiAJUFRSX0wJCWsxLCAwKGsxKQkJCSMgazE9c2VnIGVudHJ5CiAJTUZD
MAkJazAsIE1JUFNfQ09QXzBfQkFEX1ZBRERSCSMgazA9YmFkIGFkZHJlc3MgKGFnYWluKQogCWJl
cQkJazEsIHplcm8sIE1pcHNLZXJuR2VuRXhjZXB0aW9uCSMgPT0wIC0tIG5vIHBhZ2UgdGFibGUK
KyNpZmRlZiBfX21pcHNfbjY0CisJUFRSX1NSTAkJazAsIFBEUlNISUZUIC0gUFRSU0hJRlQJCSMg
azA9VlBOCisJYW5kaQkJazAsIGswLCBQVFJNQVNLCQkJIyBrMD1wZGUgb2Zmc2V0CisJUFRSX0FE
RFUJazEsIGswLCBrMQkJCSMgazE9cGRlIGVudHJ5IGFkZHJlc3MKKwlQVFJfTAkJazEsIDAoazEp
CQkJIyBrMT1wZGUgZW50cnkKKwlNRkMwCQlrMCwgTUlQU19DT1BfMF9CQURfVkFERFIJIyBrMD1i
YWQgYWRkcmVzcyAoYWdhaW4pCisgIAliZXEJCWsxLCB6ZXJvLCBNaXBzS2VybkdlbkV4Y2VwdGlv
bgkjID09MCAtLSBubyBwYWdlIHRhYmxlCisjZW5kaWYKIAlQVFJfU1JMCQlrMCwgUEFHRV9TSElG
VCAtIDIJCSMgazA9VlBOCiAJYW5kaQkJazAsIGswLCAweGZmOAkJCSMgazA9cGFnZSB0YWIgb2Zm
c2V0CiAJUFRSX0FERFUJazEsIGsxLCBrMAkJCSMgazE9cHRlIGFkZHJlc3MKSW5kZXg6IHN5cy9t
aXBzL21pcHMvZ2VuYXNzeW0uYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbWlwcy9taXBzL2dlbmFzc3lt
LmMJKHJldmlzaW9uIDIxMDc5NikKKysrIHN5cy9taXBzL21pcHMvZ2VuYXNzeW0uYwkod29ya2lu
ZyBjb3B5KQpAQCAtOTMsNiArOTMsNyBAQAogQVNTWU0oUEFHRV9TSElGVCwgUEFHRV9TSElGVCk7
CiBBU1NZTShQQUdFX1NJWkUsIFBBR0VfU0laRSk7CiBBU1NZTShQQUdFX01BU0ssIFBBR0VfTUFT
Syk7CitBU1NZTShQRFJTSElGVCwgUERSU0hJRlQpOwogQVNTWU0oU0VHU0hJRlQsIFNFR1NISUZU
KTsKIEFTU1lNKE5QVEVQRywgTlBURVBHKTsKIEFTU1lNKFRERl9ORUVEUkVTQ0hFRCwgVERGX05F
RURSRVNDSEVEKTsKSW5kZXg6IHN5cy9taXBzL21pcHMvcG1hcC5jCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5
cy9taXBzL21pcHMvcG1hcC5jCShyZXZpc2lvbiAyMTA3OTYpCisrKyBzeXMvbWlwcy9taXBzL3Bt
YXAuYwkod29ya2luZyBjb3B5KQpAQCAtNjksNiArNjksOCBAQAogX19GQlNESUQoIiRGcmVlQlNE
JCIpOwogCiAjaW5jbHVkZSAib3B0X21zZ2J1Zi5oIgorI2luY2x1ZGUgIm9wdF9kZGIuaCIKKwog
I2luY2x1ZGUgPHN5cy9wYXJhbS5oPgogI2luY2x1ZGUgPHN5cy9zeXN0bS5oPgogI2luY2x1ZGUg
PHN5cy9wcm9jLmg+CkBAIC03Niw2ICs3OCw5IEBACiAjaW5jbHVkZSA8c3lzL3ZtbWV0ZXIuaD4K
ICNpbmNsdWRlIDxzeXMvbW1hbi5oPgogI2luY2x1ZGUgPHN5cy9zbXAuaD4KKyNpZmRlZiBEREIK
KyNpbmNsdWRlIDxkZGIvZGRiLmg+CisjZW5kaWYKIAogI2luY2x1ZGUgPHZtL3ZtLmg+CiAjaW5j
bHVkZSA8dm0vdm1fcGFyYW0uaD4KQEAgLTEyNSwyMyArMTMwLDIxIEBACiAgKiAgICAgaXMgZGVm
aW5lZCBzdWNoIHRoYXQgaXQgZW5kcyBpbW1lZGlhdGVseSBhZnRlciBOUERFUEcqTlBURVBHKlBB
R0VfU0laRSwKICAqICAgICBzbyB3ZSBlbmQgdXAgZ2V0dGluZyBOVVNFUlBHVEJMUyBvZiAwLgog
ICovCi0jZGVmaW5lCXBtYXBfc2Vnc2hpZnQodikJKCgodikgPj4gU0VHU0hJRlQpICYgKE5QREVQ
RyAtIDEpKQotI2RlZmluZQlzZWd0YWJfcGRlKG0sIHYpCSgobSlbcG1hcF9zZWdzaGlmdCgodikp
XSkKKyNkZWZpbmUJcG1hcF9zZWdfaW5kZXgodikJKCgodikgPj4gU0VHU0hJRlQpICYgKE5QREVQ
RyAtIDEpKQorI2RlZmluZQlwbWFwX3BkZV9pbmRleCh2KQkoKCh2KSA+PiBQRFJTSElGVCkgJiAo
TlBERVBHIC0gMSkpCisjZGVmaW5lCXBtYXBfcHRlX2luZGV4KHYpCSgoKHYpID4+IFBBR0VfU0hJ
RlQpICYgKE5QVEVQRyAtIDEpKQorI2RlZmluZQlwbWFwX3BkZV9waW5kZXgodikJKCh2KSA+PiBQ
RFJTSElGVCkgICAgIC8qIFhYWCBUT0RPICovCiAKLSNpZiBkZWZpbmVkKF9fbWlwc19uNjQpCi0j
ZGVmaW5lCU5VU0VSUEdUQkxTCQkoTlBERVBHKQorI2lmZGVmIF9fbWlwc19uNjQKKyNkZWZpbmUJ
TlVQREUJCQkoTlBERVBHICogTlBERVBHKQorI2RlZmluZQlOVVNFUlBHVEJMUwkJKE5VUERFICsg
TlBERVBHKQogI2Vsc2UKLSNkZWZpbmUJTlVTRVJQR1RCTFMJCShwbWFwX3NlZ3NoaWZ0KFZNX01B
WFVTRVJfQUREUkVTUykpCisjZGVmaW5lCU5VUERFCQkJKE5QREVQRykKKyNkZWZpbmUJTlVTRVJQ
R1RCTFMJCShOVVBERSkKICNlbmRpZgotI2RlZmluZQltaXBzX3NlZ3RydW5jKHZhKQkoKHZhKSAm
IH5TRUdNQVNLKQorCiAjZGVmaW5lCWlzX2tlcm5lbF9wbWFwKHgpCSgoeCkgPT0ga2VybmVsX3Bt
YXApCiAKLS8qCi0gKiBHaXZlbiBhIHZpcnR1YWwgYWRkcmVzcywgZ2V0IHRoZSBvZmZzZXQgb2Yg
aXRzIFBURSB3aXRoaW4gaXRzIHBhZ2UKLSAqIGRpcmVjdG9yeSBwYWdlLgotICovCi0jZGVmaW5l
CVBERV9PRkZTRVQodmEpCSgoKHZtX29mZnNldF90KSh2YSkgPj4gUEFHRV9TSElGVCkgJiAoTlBU
RVBHIC0gMSkpCi0KIHN0cnVjdCBwbWFwIGtlcm5lbF9wbWFwX3N0b3JlOwogcGRfZW50cnlfdCAq
a2VybmVsX3NlZ21hcDsKIApAQCAtMTUxLDEwICsxNTQsOSBAQAogc3RhdGljIGludCBua3B0Owog
dW5zaWduZWQgcG1hcF9tYXhfYXNpZDsJCS8qIG1heCBBU0lEIHN1cHBvcnRlZCBieSB0aGUgc3lz
dGVtICovCiAKLQogI2RlZmluZQlQTUFQX0FTSURfUkVTRVJWRUQJMAogCi12bV9vZmZzZXRfdCBr
ZXJuZWxfdm1fZW5kOwordm1fb2Zmc2V0X3Qga2VybmVsX3ZtX2VuZCA9IFZNX01JTl9LRVJORUxf
QUREUkVTUzsKIAogc3RhdGljIHZvaWQgcG1hcF9hc2lkX2FsbG9jKHBtYXBfdCBwbWFwKTsKIApA
QCAtMTc5LDExICsxODEsMTAgQEAKIHN0YXRpYyB2b2lkIHBtYXBfcmVtb3ZlX2VudHJ5KHN0cnVj
dCBwbWFwICpwbWFwLCB2bV9wYWdlX3QgbSwgdm1fb2Zmc2V0X3QgdmEpOwogc3RhdGljIGJvb2xl
YW5fdCBwbWFwX3RyeV9pbnNlcnRfcHZfZW50cnkocG1hcF90IHBtYXAsIHZtX3BhZ2VfdCBtcHRl
LAogICAgIHZtX29mZnNldF90IHZhLCB2bV9wYWdlX3QgbSk7Ci1zdGF0aWMgX19pbmxpbmUgdm9p
ZAotcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKTsKK3N0
YXRpYyBfX2lubGluZSB2b2lkIHBtYXBfaW52YWxpZGF0ZV9wYWdlKHBtYXBfdCBwbWFwLCB2bV9v
ZmZzZXRfdCB2YSk7CitzdGF0aWMgaW50IF9wbWFwX3Vud2lyZV9wdGVfaG9sZChwbWFwX3QgcG1h
cCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2VfdCBtKTsKIAogc3RhdGljIHZtX3BhZ2VfdCBwbWFw
X2FsbG9jcHRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgaW50IGZsYWdzKTsKLQogc3Rh
dGljIHZtX3BhZ2VfdCBfcG1hcF9hbGxvY3B0ZShwbWFwX3QgcG1hcCwgdW5zaWduZWQgcHRlcGlu
ZGV4LCBpbnQgZmxhZ3MpOwogc3RhdGljIGludCBwbWFwX3VudXNlX3B0KHBtYXBfdCwgdm1fb2Zm
c2V0X3QsIHZtX3BhZ2VfdCk7CiBzdGF0aWMgaW50IGluaXRfcHRlX3Byb3Qodm1fb2Zmc2V0X3Qg
dmEsIHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgcHJvdCk7CkBAIC0yNTksMzYgKzI2MCw3MSBAQAog
CWludHJfcmVzdG9yZShpbnRyKQogI2VuZGlmCiAKLXN0YXRpYyBpbmxpbmUgcHRfZW50cnlfdCAq
CisvKgorICogUGFnZSB0YWJsZSBlbnRyeSBsb29rdXAgcm91dGluZXMuCisgKi8KK3N0YXRpYyBf
X2lubGluZSBwZF9lbnRyeV90ICoKIHBtYXBfc2VnbWFwKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRf
dCB2YSkKIHsKLQlpZiAocG1hcC0+cG1fc2VndGFiICE9IE5VTEwpCi0JCXJldHVybiAoc2VndGFi
X3BkZShwbWFwLT5wbV9zZWd0YWIsIHZhKSk7Ci0JZWxzZQorCXJldHVybiAoJnBtYXAtPnBtX3Nl
Z3RhYltwbWFwX3NlZ19pbmRleCh2YSldKTsKK30KKworI2lmZGVmIF9fbWlwc19uNjQKK3N0YXRp
YyBfX2lubGluZSBwZF9lbnRyeV90ICoKK3BtYXBfcGRwZV90b19wZGUocGRfZW50cnlfdCAqcGRw
ZSwgdm1fb2Zmc2V0X3QgdmEpCit7CisJcGRfZW50cnlfdCAqcGRlOworCisJcGRlID0gKHBkX2Vu
dHJ5X3QgKikqcGRwZTsKKwlyZXR1cm4gKCZwZGVbcG1hcF9wZGVfaW5kZXgodmEpXSk7Cit9CisK
K3N0YXRpYyBfX2lubGluZSBwZF9lbnRyeV90ICoKK3BtYXBfcGRlKHBtYXBfdCBwbWFwLCB2bV9v
ZmZzZXRfdCB2YSkKK3sKKwlwZF9lbnRyeV90ICpwZHBlOworCisJcGRwZSA9IHBtYXBfc2VnbWFw
KHBtYXAsIHZhKTsKKwlpZiAocGRwZSA9PSBOVUxMIHx8ICpwZHBlID09IE5VTEwpCiAJCXJldHVy
biAoTlVMTCk7CisKKwlyZXR1cm4gKHBtYXBfcGRwZV90b19wZGUocGRwZSwgdmEpKTsKIH0KKyNl
bHNlCitzdGF0aWMgX19pbmxpbmUgcGRfZW50cnlfdCAqCitwbWFwX3BkcGVfdG9fcGRlKHBkX2Vu
dHJ5X3QgKnBkcGUsIHZtX29mZnNldF90IHZhKQoreworCXJldHVybiBwZHBlOworfQogCi0vKgot
ICoJUm91dGluZToJcG1hcF9wdGUKLSAqCUZ1bmN0aW9uOgotICoJCUV4dHJhY3QgdGhlIHBhZ2Ug
dGFibGUgZW50cnkgYXNzb2NpYXRlZAotICoJCXdpdGggdGhlIGdpdmVuIG1hcC92aXJ0dWFsX2Fk
ZHJlc3MgcGFpci4KLSAqLworc3RhdGljIF9faW5saW5lIAorcGRfZW50cnlfdCAqcG1hcF9wZGUo
cG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXJldHVybiBwbWFwX3NlZ21hcChwbWFw
LCB2YSk7Cit9CisjZW5kaWYKKworc3RhdGljIF9faW5saW5lIHB0X2VudHJ5X3QgKgorcG1hcF9w
ZGVfdG9fcHRlKHBkX2VudHJ5X3QgKnBkZSwgdm1fb2Zmc2V0X3QgdmEpCit7CisJcHRfZW50cnlf
dCAqcHRlOworCisJcHRlID0gKHB0X2VudHJ5X3QgKikqcGRlOworCXJldHVybiAoJnB0ZVtwbWFw
X3B0ZV9pbmRleCh2YSldKTsKK30KKwogcHRfZW50cnlfdCAqCiBwbWFwX3B0ZShwbWFwX3QgcG1h
cCwgdm1fb2Zmc2V0X3QgdmEpCiB7Ci0JcHRfZW50cnlfdCAqcGRlYWRkcjsKKwlwZF9lbnRyeV90
ICpwZGU7CiAKLQlpZiAocG1hcCkgewotCQlwZGVhZGRyID0gcG1hcF9zZWdtYXAocG1hcCwgdmEp
OwotCQlpZiAocGRlYWRkcikgewotCQkJcmV0dXJuIHBkZWFkZHIgKyBQREVfT0ZGU0VUKHZhKTsK
LQkJfQotCX0KLQlyZXR1cm4gKChwdF9lbnRyeV90ICopMCk7CisJcGRlID0gcG1hcF9wZGUocG1h
cCwgdmEpOworCWlmIChwZGUgPT0gTlVMTCB8fCAqcGRlID09IE5VTEwpCisJCXJldHVybiAoTlVM
TCk7CisKKwlyZXR1cm4gKHBtYXBfcGRlX3RvX3B0ZShwZGUsIHZhKSk7CiB9CiAKLQogdm1fb2Zm
c2V0X3QKIHBtYXBfc3RlYWxfbWVtb3J5KHZtX3NpemVfdCBzaXplKQogewpAQCAtMzI2LDEyICsz
NjIsNjkgQEAKICAqIEJvb3RzdHJhcCB0aGUgc3lzdGVtIGVub3VnaCB0byBydW4gd2l0aCB2aXJ0
dWFsIG1lbW9yeS4gIFRoaXMKICAqIGFzc3VtZXMgdGhhdCB0aGUgcGh5c19hdmFpbCBhcnJheSBo
YXMgYmVlbiBpbml0aWFsaXplZC4KICAqLworc3RhdGljIHZvaWQgCitwbWFwX2NyZWF0ZV9rZXJu
ZWxfcGFnZXRhYmxlKHZvaWQpCit7CisJaW50IGksIGo7CisJdm1fb2Zmc2V0X3QgcHRhZGRyOwor
CXB0X2VudHJ5X3QgKnB0ZTsKKyNpZmRlZiBfX21pcHNfbjY0CisJcGRfZW50cnlfdCAqcGRlOwor
CXZtX29mZnNldF90IHBkYWRkcjsKKwlpbnQgbnB0LCBucGRlOworI2VuZGlmCisKKwkvKgorCSAq
IEFsbG9jYXRlIHNlZ21lbnQgdGFibGUgZm9yIHRoZSBrZXJuZWwKKwkgKi8KKwlrZXJuZWxfc2Vn
bWFwID0gKHBkX2VudHJ5X3QgKilwbWFwX3N0ZWFsX21lbW9yeShQQUdFX1NJWkUpOworCisJLyoK
KwkgKiBBbGxvY2F0ZSBzZWNvbmQgbGV2ZWwgcGFnZSB0YWJsZXMgZm9yIHRoZSBrZXJuZWwKKwkg
Ki8KKyNpZmRlZiBfX21pcHNfbjY0CisJbnBkZSA9IGhvd21hbnkoTktQVCwgTlBERVBHKTsKKwlw
ZGFkZHIgPSBwbWFwX3N0ZWFsX21lbW9yeShQQUdFX1NJWkUgKiBucGRlKTsKKyNlbmRpZgorCW5r
cHQgPSBOS1BUOworCXB0YWRkciA9IHBtYXBfc3RlYWxfbWVtb3J5KFBBR0VfU0laRSAqIG5rcHQp
OworCisJLyoKKwkgKiBUaGUgUls0LTddPzAwIHN0b3JlcyBvbmx5IG9uZSBjb3B5IG9mIHRoZSBH
bG9iYWwgYml0IGluIHRoZQorCSAqIHRyYW5zbGF0aW9uIGxvb2thc2lkZSBidWZmZXIgZm9yIGVh
Y2ggMiBwYWdlIGVudHJ5LiBUaHVzIGludmFsaWQKKwkgKiBlbnRyeXMgbXVzdCBoYXZlIHRoZSBH
bG9iYWwgYml0IHNldCBzbyB3aGVuIEVudHJ5IExPIGFuZCBFbnRyeSBISQorCSAqIEcgYml0cyBh
cmUgYW5kZWQgdG9nZXRoZXIgdGhleSB3aWxsIHByb2R1Y2UgYSBnbG9iYWwgYml0IHRvIHN0b3Jl
CisJICogaW4gdGhlIHRsYi4KKwkgKi8KKwlmb3IgKGkgPSAwLCBwdGUgPSAocHRfZW50cnlfdCAq
KXB0YWRkcjsgaSA8IChua3B0ICogTlBURVBHKTsgaSsrLCBwdGUrKykKKwkJKnB0ZSA9IFBURV9H
OworCisjaWZkZWYgX19taXBzX242NAorCWZvciAoaSA9IDAsICBucHQgPSBua3B0OyBucHQgPiAw
OyBpKyspIHsKKwkJa2VybmVsX3NlZ21hcFtpXSA9IChwZF9lbnRyeV90KShwZGFkZHIgKyBpICog
UEFHRV9TSVpFKTsKKwkJcGRlID0gKHBkX2VudHJ5X3QgKilrZXJuZWxfc2VnbWFwW2ldOworCisJ
CWZvciAoaiA9IDA7IGogPCBOUERFUEcgJiYgbnB0ID4gMDsgaisrLCBucHQtLSkKKwkJCXBkZVtq
XSA9IChwZF9lbnRyeV90KShwdGFkZHIgKyAoaSAqIE5QREVQRyArIGopICogUEFHRV9TSVpFKTsK
Kwl9CisjZWxzZQorCWZvciAoaSA9IDAsIGogPSBwbWFwX3NlZ19pbmRleChWTV9NSU5fS0VSTkVM
X0FERFJFU1MpOyBpIDwgbmtwdDsgaSsrLCBqKyspCisJCWtlcm5lbF9zZWdtYXBbal0gPSAocGRf
ZW50cnlfdCkocHRhZGRyICsgKGkgKiBQQUdFX1NJWkUpKTsKKyNlbmRpZgorCisJUE1BUF9MT0NL
X0lOSVQoa2VybmVsX3BtYXApOworCWtlcm5lbF9wbWFwLT5wbV9zZWd0YWIgPSBrZXJuZWxfc2Vn
bWFwOworCWtlcm5lbF9wbWFwLT5wbV9hY3RpdmUgPSB+MDsKKwlUQUlMUV9JTklUKCZrZXJuZWxf
cG1hcC0+cG1fcHZsaXN0KTsKKwlrZXJuZWxfcG1hcC0+cG1fYXNpZFswXS5hc2lkID0gUE1BUF9B
U0lEX1JFU0VSVkVEOworCWtlcm5lbF9wbWFwLT5wbV9hc2lkWzBdLmdlbiA9IDA7CisJa2VybmVs
X3ZtX2VuZCArPSBua3B0ICogTlBURVBHICogUEFHRV9TSVpFOworfQorCiB2b2lkCiBwbWFwX2Jv
b3RzdHJhcCh2b2lkKQogewotCXB0X2VudHJ5X3QgKnBndGFiOwotCXB0X2VudHJ5X3QgKnB0ZTsK
LQlpbnQgaSwgajsKKwlpbnQgaTsKICNpZiAhZGVmaW5lZChfX21pcHNfbjY0KQogCWludCBtZW1v
cnlfbGFyZ2VyX3RoYW5fNTEybWVnID0gMDsKICNlbmRpZgpAQCAtNDQwLDY2ICs1MzMsMTAgQEAK
IAkJfQogCX0KICNlbmRpZgotCi0JLyoKLQkgKiBBbGxvY2F0ZSBzZWdtZW50IHRhYmxlIGZvciB0
aGUga2VybmVsCi0JICovCi0Ja2VybmVsX3NlZ21hcCA9IChwZF9lbnRyeV90ICopcG1hcF9zdGVh
bF9tZW1vcnkoUEFHRV9TSVpFKTsKLQotCS8qCi0JICogQWxsb2NhdGUgc2Vjb25kIGxldmVsIHBh
Z2UgdGFibGVzIGZvciB0aGUga2VybmVsCi0JICovCi0JbmtwdCA9IE5LUFQ7Ci0jaWYgIWRlZmlu
ZWQoX19taXBzX242NCkKLQlpZiAobWVtb3J5X2xhcmdlcl90aGFuXzUxMm1lZykgewotCQkvKgot
CQkgKiBJZiB3ZSBoYXZlIGEgbGFyZ2UgbWVtb3J5IHN5c3RlbSB3ZSBDQU5OT1QgYWZmb3JkIHRv
IGhpdAotCQkgKiBwbWFwX2dyb3drZXJuZWwoKSBhbmQgYWxsb2NhdGUgbWVtb3J5LiBTaW5jZSB3
ZSBNQVkgZW5kCi0JCSAqIHVwIHdpdGggYSBwYWdlIHRoYXQgaXMgTk9UIG1hcHBhYmxlLiBGb3Ig
dGhhdCByZWFzb24gd2UKLQkJICogdXAgZnJvbnQgZ3JhYiBtb3JlLiBOb3JtYWxsIE5LUFQgaXMg
MTIwIChZTU1WIHNlZSBwbWFwLmgpCi0JCSAqIHRoaXMgZ2l2ZXMgdXMgNDgwbWVnIG9mIGtlcm5l
bCB2aXJ0dWFsIGFkZHJlc3NlcyBhdCB0aGUKLQkJICogY29zdCBvZiAxMjAgcGFnZXMgKGVhY2gg
cGFnZSBnZXRzIHVzIDQgTWVnKS4gU2luY2UgdGhlCi0JCSAqIGtlcm5lbCBzdGFydHMgYXQgdmly
dHVhbF9hdmFpbCwgd2UgY2FuIHVzZSB0aGlzIHRvCi0JCSAqIGNhbGN1bGF0ZSBob3cgbWFueSBl
bnRyaXMgYXJlIGxlZnQgZnJvbSB0aGVyZSB0byB0aGUgZW5kCi0JCSAqIG9mIHRoZSBzZWdtYXAs
IHdlIHdhbnQgdG8gYWxsb2NhdGUgYWxsIG9mIGl0LCB3aGljaCB3b3VsZAotCQkgKiBiZSBzb21l
d2hlcmUgYWJvdmUgMHhDMDAwMDAwMCAtIDB4RkZGRkZGRkYgd2hpY2ggcmVzdWx0cwotCQkgKiBp
biBhYm91dCAyNTYgZW50cmllcyBvciBzbyBpbnN0ZWFkIG9mIHRoZSAxMjAuCi0JCSAqLwotCQlu
a3B0ID0gKFBBR0VfU0laRSAvIHNpemVvZihwZF9lbnRyeV90KSkgLSAodmlydHVhbF9hdmFpbCA+
PiBTRUdTSElGVCk7Ci0JfQotI2VuZGlmCi0JcGd0YWIgPSAocHRfZW50cnlfdCAqKXBtYXBfc3Rl
YWxfbWVtb3J5KFBBR0VfU0laRSAqIG5rcHQpOwotCi0JLyoKLQkgKiBUaGUgUls0LTddPzAwIHN0
b3JlcyBvbmx5IG9uZSBjb3B5IG9mIHRoZSBHbG9iYWwgYml0IGluIHRoZQotCSAqIHRyYW5zbGF0
aW9uIGxvb2thc2lkZSBidWZmZXIgZm9yIGVhY2ggMiBwYWdlIGVudHJ5LiBUaHVzIGludmFsaWQK
LQkgKiBlbnRyeXMgbXVzdCBoYXZlIHRoZSBHbG9iYWwgYml0IHNldCBzbyB3aGVuIEVudHJ5IExP
IGFuZCBFbnRyeSBISQotCSAqIEcgYml0cyBhcmUgYW5kZWQgdG9nZXRoZXIgdGhleSB3aWxsIHBy
b2R1Y2UgYSBnbG9iYWwgYml0IHRvIHN0b3JlCi0JICogaW4gdGhlIHRsYi4KLQkgKi8KLQlmb3Ig
KGkgPSAwLCBwdGUgPSBwZ3RhYjsgaSA8IChua3B0ICogTlBURVBHKTsgaSsrLCBwdGUrKykKLQkJ
KnB0ZSA9IFBURV9HOwotCi0JLyoKLQkgKiBUaGUgc2VnbWVudCB0YWJsZSBjb250YWlucyB0aGUg
S1ZBIG9mIHRoZSBwYWdlcyBpbiB0aGUgc2Vjb25kCi0JICogbGV2ZWwgcGFnZSB0YWJsZS4KLQkg
Ki8KLQlmb3IgKGkgPSAwLCBqID0gKHZpcnR1YWxfYXZhaWwgPj4gU0VHU0hJRlQpOyBpIDwgbmtw
dDsgaSsrLCBqKyspCi0JCWtlcm5lbF9zZWdtYXBbal0gPSAocGRfZW50cnlfdCkocGd0YWIgKyAo
aSAqIE5QVEVQRykpOwotCi0JLyoKLQkgKiBUaGUga2VybmVsJ3MgcG1hcCBpcyBzdGF0aWNhbGx5
IGFsbG9jYXRlZCBzbyB3ZSBkb24ndCBoYXZlIHRvIHVzZQotCSAqIHBtYXBfY3JlYXRlLCB3aGlj
aCBpcyB1bmxpa2VseSB0byB3b3JrIGNvcnJlY3RseSBhdCB0aGlzIHBhcnQgb2YKLQkgKiB0aGUg
Ym9vdCBzZXF1ZW5jZSAoWFhYIGFuZCB3aGljaCBubyBsb25nZXIgZXhpc3RzKS4KLQkgKi8KLQlQ
TUFQX0xPQ0tfSU5JVChrZXJuZWxfcG1hcCk7Ci0Ja2VybmVsX3BtYXAtPnBtX3NlZ3RhYiA9IGtl
cm5lbF9zZWdtYXA7Ci0Ja2VybmVsX3BtYXAtPnBtX2FjdGl2ZSA9IH4wOwotCVRBSUxRX0lOSVQo
Jmtlcm5lbF9wbWFwLT5wbV9wdmxpc3QpOwotCWtlcm5lbF9wbWFwLT5wbV9hc2lkWzBdLmFzaWQg
PSBQTUFQX0FTSURfUkVTRVJWRUQ7Ci0Ja2VybmVsX3BtYXAtPnBtX2FzaWRbMF0uZ2VuID0gMDsK
KwlwbWFwX2NyZWF0ZV9rZXJuZWxfcGFnZXRhYmxlKCk7CiAJcG1hcF9tYXhfYXNpZCA9IFZNTlVN
X1BJRFM7CiAJbWlwc193cl9lbnRyeWhpKDApOworCW1pcHNfd3JfcGFnZW1hc2soMCk7CiB9CiAK
IC8qCkBAIC03MzgsNiArNzc1LDggQEAKIAkJbnB0ZSB8PSBQVEVfQ19VTkNBQ0hFRDsKIAogCXB0
ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB2YSk7CisJaWYgKHB0ZSA9PSBOVUxMKQorCQlwcmlu
dGYoInZhICVwIHNlZ21hcCAtICVwIHNlZ19pbmRleCAlbHgsIHB0ZV9pbmRleCAlbHhcbiIsICh2
b2lkICopdmEsIGtlcm5lbF9wbWFwLT5wbV9zZWd0YWIsICh1X2xvbmcpcG1hcF9zZWdfaW5kZXgo
dmEpLCh1X2xvbmcpIHBtYXBfcHRlX2luZGV4KHZhKSk7CiAJb3B0ZSA9ICpwdGU7CiAJKnB0ZSA9
IG5wdGU7CiAKQEAgLTg1OCwxOSArODk3LDU2IEBACiAgKiBUaGlzIHJvdXRpbmUgdW5ob2xkcyBw
YWdlIHRhYmxlIHBhZ2VzLCBhbmQgaWYgdGhlIGhvbGQgY291bnQKICAqIGRyb3BzIHRvIHplcm8s
IHRoZW4gaXQgZGVjcmVtZW50cyB0aGUgd2lyZSBjb3VudC4KICAqLworc3RhdGljIFBNQVBfSU5M
SU5FIGludAorcG1hcF91bndpcmVfcHRlX2hvbGQocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZh
LCB2bV9wYWdlX3QgbSkKK3sKKwktLW0tPndpcmVfY291bnQ7CisJaWYgKG0tPndpcmVfY291bnQg
PT0gMCkKKwkJcmV0dXJuIChfcG1hcF91bndpcmVfcHRlX2hvbGQocG1hcCwgdmEsIG0pKTsKKwll
bHNlCisJCXJldHVybiAoMCk7Cit9CisKIHN0YXRpYyBpbnQKLV9wbWFwX3Vud2lyZV9wdGVfaG9s
ZChwbWFwX3QgcG1hcCwgdm1fcGFnZV90IG0pCitfcG1hcF91bndpcmVfcHRlX2hvbGQocG1hcF90
IHBtYXAsIHZtX29mZnNldF90IHZhLCB2bV9wYWdlX3QgbSkKIHsKKwlwZF9lbnRyeV90ICpwZGU7
CiAKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKIAkvKgogCSAqIHVubWFwIHRo
ZSBwYWdlIHRhYmxlIHBhZ2UKIAkgKi8KLQlwbWFwLT5wbV9zZWd0YWJbbS0+cGluZGV4XSA9IDA7
Ci0JLS1wbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudDsKKyNpZmRlZiBfX21pcHNfbjY0CisJ
aWYgKG0tPnBpbmRleCA8IE5VUERFKQorCQlwZGUgPSBwbWFwX3BkZShwbWFwLCB2YSk7CisJZWxz
ZQorCQlwZGUgPSBwbWFwX3NlZ21hcChwbWFwLCB2YSk7CisJKnBkZSA9IDA7CisjZWxzZQorCXBk
ZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKyNlbmRpZgorCSpwZGUgPSAwOworCXBtYXAtPnBtX3N0
YXRzLnJlc2lkZW50X2NvdW50LS07CiAKKyNpZmRlZiBfX21pcHNfbjY0CisJaWYgKG0tPnBpbmRl
eCA8IE5VUERFKSB7CisJCXBkX2VudHJ5X3QgKnBkcDsKKwkJdm1fcGFnZV90IHBkcGc7CisKKwkJ
LyoKKwkJICogUmVjdXJzaXZlbHkgZGVjcmVtZW50IG5leHQgbGV2ZWwgcGFnZXRhYmxlIHJlZmNv
dW50CisJCSAqLworCQlpZiAocG1hcC0+cG1fcHRwaGludCA9PSBtKQorCQkJcG1hcC0+cG1fcHRw
aGludCA9IE5VTEw7CisKKwkJcGRwID0gKHBkX2VudHJ5X3QgKikqcG1hcF9zZWdtYXAocG1hcCwg
dmEpOworCQlwZHBnID0gUEhZU19UT19WTV9QQUdFKE1JUFNfS1NFRzBfVE9fUEhZUyhwZHApKTsK
KwkJcG1hcF91bndpcmVfcHRlX2hvbGQocG1hcCwgdmEsIHBkcGcpOworCX0KKyNlbHNlCiAJaWYg
KHBtYXAtPnBtX3B0cGhpbnQgPT0gbSkKIAkJcG1hcC0+cG1fcHRwaGludCA9IE5VTEw7Ci0KKyNl
bmRpZgogCS8qCiAJICogSWYgdGhlIHBhZ2UgaXMgZmluYWxseSB1bndpcmVkLCBzaW1wbHkgZnJl
ZSBpdC4KIAkgKi8KQEAgLTg3OSwxNiArOTU1LDYgQEAKIAlyZXR1cm4gKDEpOwogfQogCi1zdGF0
aWMgUE1BUF9JTkxJTkUgaW50Ci1wbWFwX3Vud2lyZV9wdGVfaG9sZChwbWFwX3QgcG1hcCwgdm1f
cGFnZV90IG0pCi17Ci0JLS1tLT53aXJlX2NvdW50OwotCWlmIChtLT53aXJlX2NvdW50ID09IDAp
Ci0JCXJldHVybiAoX3BtYXBfdW53aXJlX3B0ZV9ob2xkKHBtYXAsIG0pKTsKLQllbHNlCi0JCXJl
dHVybiAoMCk7Ci19Ci0KIC8qCiAgKiBBZnRlciByZW1vdmluZyBhIHBhZ2UgdGFibGUgZW50cnks
IHRoaXMgcm91dGluZSBpcyB1c2VkIHRvCiAgKiBjb25kaXRpb25hbGx5IGZyZWUgdGhlIHBhZ2Us
IGFuZCBtYW5hZ2UgdGhlIGhvbGQvd2lyZSBjb3VudHMuCkBAIC05MDMsMTcgKzk2OSwxNyBAQAog
CQlyZXR1cm4gKDApOwogCiAJaWYgKG1wdGUgPT0gTlVMTCkgewotCQlwdGVwaW5kZXggPSBwbWFw
X3NlZ3NoaWZ0KHZhKTsKKwkJcHRlcGluZGV4ID0gcG1hcF9wZGVfcGluZGV4KHZhKTsKIAkJaWYg
KHBtYXAtPnBtX3B0cGhpbnQgJiYKIAkJICAgIChwbWFwLT5wbV9wdHBoaW50LT5waW5kZXggPT0g
cHRlcGluZGV4KSkgewogCQkJbXB0ZSA9IHBtYXAtPnBtX3B0cGhpbnQ7CiAJCX0gZWxzZSB7Ci0J
CQlwdGV2YSA9IHBtYXBfc2VnbWFwKHBtYXAsIHZhKTsKKwkJCXB0ZXZhID0gKnBtYXBfcGRlKHBt
YXAsIHZhKTsKIAkJCW1wdGUgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19LU0VHMF9UT19QSFlTKHB0
ZXZhKSk7CiAJCQlwbWFwLT5wbV9wdHBoaW50ID0gbXB0ZTsKIAkJfQogCX0KLQlyZXR1cm4gcG1h
cF91bndpcmVfcHRlX2hvbGQocG1hcCwgbXB0ZSk7CisJcmV0dXJuIHBtYXBfdW53aXJlX3B0ZV9o
b2xkKHBtYXAsIHZhLCBtcHRlKTsKIH0KIAogdm9pZApAQCAtOTk5LDcgKzEwNjUsNyBAQAogc3Rh
dGljIHZtX3BhZ2VfdAogX3BtYXBfYWxsb2NwdGUocG1hcF90IHBtYXAsIHVuc2lnbmVkIHB0ZXBp
bmRleCwgaW50IGZsYWdzKQogewotCXZtX29mZnNldF90IHB0ZXZhOworCXZtX29mZnNldF90IHBh
Z2V2YTsKIAl2bV9wYWdlX3QgbTsKIAogCUtBU1NFUlQoKGZsYWdzICYgKE1fTk9XQUlUIHwgTV9X
QUlUT0spKSA9PSBNX05PV0FJVCB8fApAQCAtMTAyOSwxMCArMTA5NSw0MSBAQAogCSAqIE1hcCB0
aGUgcGFnZXRhYmxlIHBhZ2UgaW50byB0aGUgcHJvY2VzcyBhZGRyZXNzIHNwYWNlLCBpZiBpdAog
CSAqIGlzbid0IGFscmVhZHkgdGhlcmUuCiAJICovCisJcGFnZXZhID0gTUlQU19QSFlTX1RPX0tT
RUcwKFZNX1BBR0VfVE9fUEhZUyhtKSk7CiAKLQlwdGV2YSA9IE1JUFNfUEhZU19UT19LU0VHMChW
TV9QQUdFX1RPX1BIWVMobSkpOworI2lmZGVmIF9fbWlwc19uNjQKKwlpZiAocHRlcGluZGV4ID49
IE5VUERFKSB7CisJCXBtYXAtPnBtX3NlZ3RhYltwdGVwaW5kZXggLSBOVVBERV0gPSAocGRfZW50
cnlfdClwYWdldmE7CisJfSBlbHNlIHsKKwkJcGRfZW50cnlfdCAqcGRlcCwgKnBkZTsKKwkJaW50
IHNlZ2luZGV4ID0gcHRlcGluZGV4ID4+IChTRUdTSElGVCAtIFBEUlNISUZUKTsKKwkJaW50IHBk
ZWluZGV4ID0gcHRlcGluZGV4ICYgKE5QREVQRyAtIDEpOworCQl2bV9wYWdlX3QgcGc7CisJCQor
CQlwZGVwID0gJnBtYXAtPnBtX3NlZ3RhYltzZWdpbmRleF07CisJCWlmICgqcGRlcCA9PSBOVUxM
KSB7IAorCQkJLyogcmVjdXJzZSBmb3IgYWxsb2NhdGluZyBwYWdlIGRpciAqLworCQkJaWYgKF9w
bWFwX2FsbG9jcHRlKHBtYXAsIE5VUERFICsgc2VnaW5kZXgsIAorCQkJICAgIGZsYWdzKSA9PSBO
VUxMKSB7CisJCQkJLyogYWxsb2MgZmFpbGVkLCByZWxlYXNlIGN1cnJlbnQgKi8KKwkJCQktLW0t
PndpcmVfY291bnQ7CisJCQkJYXRvbWljX3N1YnRyYWN0X2ludCgmY250LnZfd2lyZV9jb3VudCwg
MSk7CisJCQkJdm1fcGFnZV9mcmVlX3plcm8obSk7CisJCQkJcmV0dXJuIChOVUxMKTsKKwkJCX0K
KwkJfSBlbHNlIHsKKwkJCXBnID0gUEhZU19UT19WTV9QQUdFKE1JUFNfS1NFRzBfVE9fUEhZUygq
cGRlcCkpOworCQkJcGctPndpcmVfY291bnQrKzsKKwkJfQorCQkvKiBOZXh0IGxldmVsIGVudHJ5
ICovCisJCXBkZSA9IChwZF9lbnRyeV90ICopKnBkZXA7CisJCXBkZVtwZGVpbmRleF0gPSAocGRf
ZW50cnlfdClwYWdldmE7CisJCXBtYXAtPnBtX3B0cGhpbnQgPSBtOworCX0KKyNlbHNlCisJcG1h
cC0+cG1fc2VndGFiW3B0ZXBpbmRleF0gPSAocGRfZW50cnlfdClwYWdldmE7CisjZW5kaWYKIAlw
bWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudCsrOwotCXBtYXAtPnBtX3NlZ3RhYltwdGVwaW5k
ZXhdID0gKHBkX2VudHJ5X3QpcHRldmE7CiAKIAkvKgogCSAqIFNldCB0aGUgcGFnZSB0YWJsZSBo
aW50CkBAIC0xMDQ1LDcgKzExNDIsNyBAQAogcG1hcF9hbGxvY3B0ZShwbWFwX3QgcG1hcCwgdm1f
b2Zmc2V0X3QgdmEsIGludCBmbGFncykKIHsKIAl1bnNpZ25lZCBwdGVwaW5kZXg7Ci0Jdm1fb2Zm
c2V0X3QgcHRldmE7CisJcGRfZW50cnlfdCAqcGRlOwogCXZtX3BhZ2VfdCBtOwogCiAJS0FTU0VS
VCgoZmxhZ3MgJiAoTV9OT1dBSVQgfCBNX1dBSVRPSykpID09IE1fTk9XQUlUIHx8CkBAIC0xMDU1
LDE4ICsxMTUyLDE4IEBACiAJLyoKIAkgKiBDYWxjdWxhdGUgcGFnZXRhYmxlIHBhZ2UgaW5kZXgK
IAkgKi8KLQlwdGVwaW5kZXggPSBwbWFwX3NlZ3NoaWZ0KHZhKTsKKwlwdGVwaW5kZXggPSBwbWFw
X3BkZV9waW5kZXgodmEpOwogcmV0cnk6CiAJLyoKIAkgKiBHZXQgdGhlIHBhZ2UgZGlyZWN0b3J5
IGVudHJ5CiAJICovCi0JcHRldmEgPSAodm1fb2Zmc2V0X3QpcG1hcC0+cG1fc2VndGFiW3B0ZXBp
bmRleF07CisJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOwogCiAJLyoKIAkgKiBJZiB0aGUgcGFn
ZSB0YWJsZSBwYWdlIGlzIG1hcHBlZCwgd2UganVzdCBpbmNyZW1lbnQgdGhlIGhvbGQKIAkgKiBj
b3VudCwgYW5kIGFjdGl2YXRlIGl0LgogCSAqLwotCWlmIChwdGV2YSkgeworCWlmIChwZGUgIT0g
TlVMTCAmJiAqcGRlICE9IE5VTEwpIHsKIAkJLyoKIAkJICogSW4gb3JkZXIgdG8gZ2V0IHRoZSBw
YWdlIHRhYmxlIHBhZ2UsIHRyeSB0aGUgaGludCBmaXJzdC4KIAkJICovCkBAIC0xMDc0LDcgKzEx
NzEsNyBAQAogCQkgICAgKHBtYXAtPnBtX3B0cGhpbnQtPnBpbmRleCA9PSBwdGVwaW5kZXgpKSB7
CiAJCQltID0gcG1hcC0+cG1fcHRwaGludDsKIAkJfSBlbHNlIHsKLQkJCW0gPSBQSFlTX1RPX1ZN
X1BBR0UoTUlQU19LU0VHMF9UT19QSFlTKHB0ZXZhKSk7CisJCQltID0gUEhZU19UT19WTV9QQUdF
KE1JUFNfS1NFRzBfVE9fUEhZUygqcGRlKSk7CiAJCQlwbWFwLT5wbV9wdHBoaW50ID0gbTsKIAkJ
fQogCQltLT53aXJlX2NvdW50Kys7CkBAIC0xMDg3LDcgKzExODQsNyBAQAogCQlpZiAobSA9PSBO
VUxMICYmIChmbGFncyAmIE1fV0FJVE9LKSkKIAkJCWdvdG8gcmV0cnk7CiAJfQotCXJldHVybiBt
OworCXJldHVybiAobSk7CiB9CiAKIApAQCAtMTEzNyw0NiArMTIzNCw0NCBAQAogcG1hcF9ncm93
a2VybmVsKHZtX29mZnNldF90IGFkZHIpCiB7CiAJdm1fcGFnZV90IG5rcGc7CisJcGRfZW50cnlf
dCAqcGRlLCAqcGRwZTsKIAlwdF9lbnRyeV90ICpwdGU7CiAJaW50IGk7CiAKIAltdHhfYXNzZXJ0
KCZrZXJuZWxfbWFwLT5zeXN0ZW1fbXR4LCBNQV9PV05FRCk7Ci0JaWYgKGtlcm5lbF92bV9lbmQg
PT0gMCkgewotCQlrZXJuZWxfdm1fZW5kID0gVk1fTUlOX0tFUk5FTF9BRERSRVNTOwotCQlua3B0
ID0gMDsKLQkJd2hpbGUgKHNlZ3RhYl9wZGUoa2VybmVsX3NlZ21hcCwga2VybmVsX3ZtX2VuZCkp
IHsKLQkJCWtlcm5lbF92bV9lbmQgPSAoa2VybmVsX3ZtX2VuZCArIFBBR0VfU0laRSAqIE5QVEVQ
RykgJgotCQkJICAgIH4oUEFHRV9TSVpFICogTlBURVBHIC0gMSk7Ci0JCQlua3B0Kys7Ci0JCQlp
ZiAoa2VybmVsX3ZtX2VuZCAtIDEgPj0ga2VybmVsX21hcC0+bWF4X29mZnNldCkgewotCQkJCWtl
cm5lbF92bV9lbmQgPSBrZXJuZWxfbWFwLT5tYXhfb2Zmc2V0OwotCQkJCWJyZWFrOwotCQkJfQot
CQl9Ci0JfQotCWFkZHIgPSAoYWRkciArIFBBR0VfU0laRSAqIE5QVEVQRykgJiB+KFBBR0VfU0la
RSAqIE5QVEVQRyAtIDEpOworCWFkZHIgPSByb3VuZHVwMihhZGRyLCBOQlNFRyk7CiAJaWYgKGFk
ZHIgLSAxID49IGtlcm5lbF9tYXAtPm1heF9vZmZzZXQpCiAJCWFkZHIgPSBrZXJuZWxfbWFwLT5t
YXhfb2Zmc2V0OwogCXdoaWxlIChrZXJuZWxfdm1fZW5kIDwgYWRkcikgewotCQlpZiAoc2VndGFi
X3BkZShrZXJuZWxfc2VnbWFwLCBrZXJuZWxfdm1fZW5kKSkgewotCQkJa2VybmVsX3ZtX2VuZCA9
IChrZXJuZWxfdm1fZW5kICsgUEFHRV9TSVpFICogTlBURVBHKSAmCi0JCQkgICAgfihQQUdFX1NJ
WkUgKiBOUFRFUEcgLSAxKTsKKwkJcGRwZSA9IHBtYXBfc2VnbWFwKGtlcm5lbF9wbWFwLCBrZXJu
ZWxfdm1fZW5kKTsKKyNpZmRlZiBfX21pcHNfbjY0CisJCWlmICgqcGRwZSA9PSAwKSB7CisJCQkv
KiBuZXcgaW50ZXJtZWRpYXRlIHBhZ2UgdGFibGUgZW50cnkgKi8KKwkJCW5rcGcgPSBwbWFwX2Fs
bG9jX3B0ZV9wYWdlKG5rcHQsIFZNX0FMTE9DX0lOVEVSUlVQVCk7CisJCQlpZiAobmtwZyA9PSBO
VUxMKQorCQkJCXBhbmljKCJwbWFwX2dyb3drZXJuZWw6IG5vIG1lbW9yeSB0byBncm93IGtlcm5l
bCIpOworCQkJKnBkcGUgPSAocGRfZW50cnlfdClNSVBTX1BIWVNfVE9fS1NFRzAoVk1fUEFHRV9U
T19QSFlTKG5rcGcpKTsKKwkJCWNvbnRpbnVlOyAvKiB0cnkgYWdhaW4gKi8KKwkJfQorI2VuZGlm
CisJCXBkZSA9IHBtYXBfcGRwZV90b19wZGUocGRwZSwga2VybmVsX3ZtX2VuZCk7CisJCWlmICgq
cGRlICE9IDApIHsKKwkJCWtlcm5lbF92bV9lbmQgPSAoa2VybmVsX3ZtX2VuZCArIE5CUERSKSAm
IH5QRFJNQVNLOwogCQkJaWYgKGtlcm5lbF92bV9lbmQgLSAxID49IGtlcm5lbF9tYXAtPm1heF9v
ZmZzZXQpIHsKIAkJCQlrZXJuZWxfdm1fZW5kID0ga2VybmVsX21hcC0+bWF4X29mZnNldDsKIAkJ
CQlicmVhazsKIAkJCX0KIAkJCWNvbnRpbnVlOwogCQl9CisKIAkJLyoKIAkJICogVGhpcyBpbmRl
eCBpcyBib2d1cywgYnV0IG91dCBvZiB0aGUgd2F5CiAJCSAqLwotIAkJbmtwZyA9IHBtYXBfYWxs
b2NfcHRlX3BhZ2UobmtwdCwgVk1fQUxMT0NfSU5URVJSVVBUKTsKKwkJbmtwZyA9IHBtYXBfYWxs
b2NfcHRlX3BhZ2UobmtwdCwgVk1fQUxMT0NfSU5URVJSVVBUKTsKIAkJaWYgKCFua3BnKQogCQkJ
cGFuaWMoInBtYXBfZ3Jvd2tlcm5lbDogbm8gbWVtb3J5IHRvIGdyb3cga2VybmVsIik7Ci0KIAkJ
bmtwdCsrOwotIAkJcHRlID0gKHB0X2VudHJ5X3QgKilNSVBTX1BIWVNfVE9fS1NFRzAoVk1fUEFH
RV9UT19QSFlTKG5rcGcpKTsKLSAgCQlzZWd0YWJfcGRlKGtlcm5lbF9zZWdtYXAsIGtlcm5lbF92
bV9lbmQpID0gKHBkX2VudHJ5X3QpcHRlOworCQkqcGRlID0gKHBkX2VudHJ5X3QpTUlQU19QSFlT
X1RPX0tTRUcwKFZNX1BBR0VfVE9fUEhZUyhua3BnKSk7CiAKIAkJLyoKIAkJICogVGhlIFJbNC03
XT8wMCBzdG9yZXMgb25seSBvbmUgY29weSBvZiB0aGUgR2xvYmFsIGJpdCBpbgpAQCAtMTE4NSwx
MSArMTI4MCwxMSBAQAogCQkgKiBFbnRyeSBMTyBhbmQgRW50cnkgSEkgRyBiaXRzIGFyZSBhbmRl
ZCB0b2dldGhlciB0aGV5IHdpbGwKIAkJICogcHJvZHVjZSBhIGdsb2JhbCBiaXQgdG8gc3RvcmUg
aW4gdGhlIHRsYi4KIAkJICovCi0JCWZvciAoaSA9IDA7IGkgPCBOUFRFUEc7IGkrKywgcHRlKysp
Ci0JCQkqcHRlID0gUFRFX0c7CisJCXB0ZSA9IChwdF9lbnRyeV90ICopKnBkZTsKKwkJZm9yIChp
ID0gMDsgaSA8IE5QVEVQRzsgaSsrKQorCQkJcHRlW2ldID0gUFRFX0c7CiAKLQkJa2VybmVsX3Zt
X2VuZCA9IChrZXJuZWxfdm1fZW5kICsgUEFHRV9TSVpFICogTlBURVBHKSAmCi0JCSAgICB+KFBB
R0VfU0laRSAqIE5QVEVQRyAtIDEpOworCQlrZXJuZWxfdm1fZW5kID0gKGtlcm5lbF92bV9lbmQg
KyBOQlBEUikgJiB+UERSTUFTSzsKIAkJaWYgKGtlcm5lbF92bV9lbmQgLSAxID49IGtlcm5lbF9t
YXAtPm1heF9vZmZzZXQpIHsKIAkJCWtlcm5lbF92bV9lbmQgPSBrZXJuZWxfbWFwLT5tYXhfb2Zm
c2V0OwogCQkJYnJlYWs7CkBAIC0xNDgwLDcgKzE1NzUsOSBAQAogdm9pZAogcG1hcF9yZW1vdmUo
c3RydWN0IHBtYXAgKnBtYXAsIHZtX29mZnNldF90IHN2YSwgdm1fb2Zmc2V0X3QgZXZhKQogewot
CXZtX29mZnNldF90IHZhLCBudmE7CisJdm1fb2Zmc2V0X3QgdmFfbmV4dDsKKwlwZF9lbnRyeV90
ICpwZGUsICpwZHBlOworCXB0X2VudHJ5X3QgKnB0ZTsKIAogCWlmIChwbWFwID09IE5VTEwpCiAJ
CXJldHVybjsKQEAgLTE0OTksMTUgKzE1OTYsMzAgQEAKIAkJcG1hcF9yZW1vdmVfcGFnZShwbWFw
LCBzdmEpOwogCQlnb3RvIG91dDsKIAl9Ci0JZm9yICh2YSA9IHN2YTsgdmEgPCBldmE7IHZhID0g
bnZhKSB7Ci0JCWlmIChwbWFwX3NlZ21hcChwbWFwLCB2YSkgPT0gTlVMTCkgewotCQkJbnZhID0g
bWlwc19zZWd0cnVuYyh2YSArIE5CU0VHKTsKKwlmb3IgKDsgc3ZhIDwgZXZhOyBzdmEgPSB2YV9u
ZXh0KSB7CisJCXBkcGUgPSBwbWFwX3NlZ21hcChwbWFwLCBzdmEpOworI2lmZGVmIF9fbWlwc19u
NjQKKwkJaWYgKCpwZHBlID09IDApIHsKKwkJCXZhX25leHQgPSAoc3ZhICsgTkJTRUcpICYgflNF
R01BU0s7CisJCQlpZiAodmFfbmV4dCA8IHN2YSkKKwkJCQl2YV9uZXh0ID0gZXZhOwogCQkJY29u
dGludWU7CiAJCX0KLQkJcG1hcF9yZW1vdmVfcGFnZShwbWFwLCB2YSk7Ci0JCW52YSA9IHZhICsg
UEFHRV9TSVpFOworI2VuZGlmCisJCXZhX25leHQgPSAoc3ZhICsgTkJQRFIpICYgflBEUk1BU0s7
CisJCWlmICh2YV9uZXh0IDwgc3ZhKQorCQkJdmFfbmV4dCA9IGV2YTsKKworCQlwZGUgPSBwbWFw
X3BkcGVfdG9fcGRlKHBkcGUsIHN2YSk7CisJCWlmICgqcGRlID09IDApCisJCQljb250aW51ZTsK
KwkJaWYgKHZhX25leHQgPiBldmEpCisJCQl2YV9uZXh0ID0gZXZhOworCQlmb3IgKHB0ZSA9IHBt
YXBfcGRlX3RvX3B0ZShwZGUsIHN2YSk7IHN2YSAhPSB2YV9uZXh0OyAKKwkJICAgIHB0ZSsrLCBz
dmEgKz0gUEFHRV9TSVpFKSB7CisJCQlwbWFwX3JlbW92ZV9wYWdlKHBtYXAsIHN2YSk7CisJCX0K
IAl9Ci0KIG91dDoKIAl2bV9wYWdlX3VubG9ja19xdWV1ZXMoKTsKIAlQTUFQX1VOTE9DSyhwbWFw
KTsKQEAgLTE1OTYsNiArMTcwOCw4IEBACiBwbWFwX3Byb3RlY3QocG1hcF90IHBtYXAsIHZtX29m
ZnNldF90IHN2YSwgdm1fb2Zmc2V0X3QgZXZhLCB2bV9wcm90X3QgcHJvdCkKIHsKIAlwdF9lbnRy
eV90ICpwdGU7CisJcGRfZW50cnlfdCAqcGRlLCAqcGRwZTsKKwl2bV9vZmZzZXRfdCB2YV9uZXh0
OwogCiAJaWYgKHBtYXAgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtMTYwOSw0NCArMTcyMyw1MyBA
QAogCiAJdm1fcGFnZV9sb2NrX3F1ZXVlcygpOwogCVBNQVBfTE9DSyhwbWFwKTsKLQl3aGlsZSAo
c3ZhIDwgZXZhKSB7Ci0JCXB0X2VudHJ5X3QgcGJpdHMsIG9iaXRzOworCWZvciAoOyBzdmEgPCBl
dmE7IHN2YSA9IHZhX25leHQpIHsKKwkJcHRfZW50cnlfdCBvYml0cywgcGJpdHM7CiAJCXZtX3Bh
Z2VfdCBtOwotCQl2bV9vZmZzZXRfdCBwYTsKKwkJdm1fcGFkZHJfdCBwYTsKIAotCQkvKgotCQkg
KiBJZiBzZWdtZW50IHRhYmxlIGVudHJ5IGlzIGVtcHR5LCBza2lwIHRoaXMgc2VnbWVudC4KLQkJ
ICovCi0JCWlmIChwbWFwX3NlZ21hcChwbWFwLCBzdmEpID09IE5VTEwpIHsKLQkJCXN2YSA9IG1p
cHNfc2VndHJ1bmMoc3ZhICsgTkJTRUcpOworCQlwZHBlID0gcG1hcF9zZWdtYXAocG1hcCwgc3Zh
KTsKKyNpZmRlZiBfX21pcHNfbjY0CisJCWlmICgqcGRwZSA9PSAwKSB7CisJCQl2YV9uZXh0ID0g
KHN2YSArIE5CU0VHKSAmIH5TRUdNQVNLOworCQkJaWYgKHZhX25leHQgPCBzdmEpCisJCQkJdmFf
bmV4dCA9IGV2YTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCS8qCi0JCSAqIElmIHB0ZSBpcyBpbnZh
bGlkLCBza2lwIHRoaXMgcGFnZQotCQkgKi8KLQkJcHRlID0gcG1hcF9wdGUocG1hcCwgc3ZhKTsK
LQkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9WKSkgewotCQkJc3ZhICs9IFBBR0VfU0laRTsKKyNl
bmRpZgorCQl2YV9uZXh0ID0gKHN2YSArIE5CUERSKSAmIH5QRFJNQVNLOworCQlpZiAodmFfbmV4
dCA8IHN2YSkKKwkJCXZhX25leHQgPSBldmE7CisKKwkJcGRlID0gcG1hcF9wZHBlX3RvX3BkZShw
ZHBlLCBzdmEpOworCQlpZiAocGRlID09IE5VTEwgfHwgKnBkZSA9PSBOVUxMKQogCQkJY29udGlu
dWU7Ci0JCX0KLXJldHJ5OgotCQlvYml0cyA9IHBiaXRzID0gKnB0ZTsKLQkJcGEgPSBUTEJMT19Q
VEVfVE9fUEEocGJpdHMpOworCQlpZiAodmFfbmV4dCA+IGV2YSkKKwkJCXZhX25leHQgPSBldmE7
CiAKLQkJaWYgKHBhZ2VfaXNfbWFuYWdlZChwYSkgJiYgcHRlX3Rlc3QoJnBiaXRzLCBQVEVfRCkp
IHsKLQkJCW0gPSBQSFlTX1RPX1ZNX1BBR0UocGEpOwotCQkJdm1fcGFnZV9kaXJ0eShtKTsKLQkJ
CW0tPm1kLnB2X2ZsYWdzICY9IH5QVl9UQUJMRV9NT0Q7Ci0JCX0KLQkJcHRlX2NsZWFyKCZwYml0
cywgUFRFX0QpOwotCQlwdGVfc2V0KCZwYml0cywgUFRFX1JPKTsKKwkJZm9yIChwdGUgPSBwbWFw
X3BkZV90b19wdGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCisJCSAgICAgc3Zh
ICs9IFBBR0VfU0laRSkgewogCi0JCWlmIChwYml0cyAhPSAqcHRlKSB7Ci0JCQlpZiAoIWF0b21p
Y19jbXBzZXRfaW50KCh1X2ludCAqKXB0ZSwgb2JpdHMsIHBiaXRzKSkKLQkJCQlnb3RvIHJldHJ5
OwotCQkJcG1hcF91cGRhdGVfcGFnZShwbWFwLCBzdmEsIHBiaXRzKTsKKwkJCS8qIFNraXAgaW52
YWxpZCBQVEVzICovCisJCQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX1YpKQorCQkJCWNvbnRpbnVl
OworcmV0cnk6CisJCQlvYml0cyA9IHBiaXRzID0gKnB0ZTsKKwkJCXBhID0gVExCTE9fUFRFX1RP
X1BBKHBiaXRzKTsKKwkJCWlmIChwYWdlX2lzX21hbmFnZWQocGEpICYmIHB0ZV90ZXN0KCZwYml0
cywgUFRFX0QpKSB7CisJCQkJbSA9IFBIWVNfVE9fVk1fUEFHRShwYSk7CisJCQkJdm1fcGFnZV9k
aXJ0eShtKTsKKwkJCQltLT5tZC5wdl9mbGFncyAmPSB+UFZfVEFCTEVfTU9EOworCQkJfQorCQkJ
cHRlX2NsZWFyKCZwYml0cywgUFRFX0QpOworCQkJcHRlX3NldCgmcGJpdHMsIFBURV9STyk7CisJ
CQkKKwkJCWlmIChwYml0cyAhPSAqcHRlKSB7CisJCQkJaWYgKCFhdG9taWNfY21wc2V0X2ludCgo
dV9pbnQgKilwdGUsIG9iaXRzLCBwYml0cykpCisJCQkJCWdvdG8gcmV0cnk7CisJCQkJcG1hcF91
cGRhdGVfcGFnZShwbWFwLCBzdmEsIHBiaXRzKTsKKwkJCX0KIAkJfQotCQlzdmEgKz0gUEFHRV9T
SVpFOwogCX0KIAl2bV9wYWdlX3VubG9ja19xdWV1ZXMoKTsKIAlQTUFQX1VOTE9DSyhwbWFwKTsK
QEAgLTE4OTksMzIgKzIwMjIsMzIgQEAKIAkgKiBjcmVhdGluZyBpdCBoZXJlLgogCSAqLwogCWlm
ICh2YSA8IFZNX01BWFVTRVJfQUREUkVTUykgeworCQlwZF9lbnRyeV90ICpwZGU7CiAJCXVuc2ln
bmVkIHB0ZXBpbmRleDsKLQkJdm1fb2Zmc2V0X3QgcHRldmE7CiAKIAkJLyoKIAkJICogQ2FsY3Vs
YXRlIHBhZ2V0YWJsZSBwYWdlIGluZGV4CiAJCSAqLwotCQlwdGVwaW5kZXggPSBwbWFwX3NlZ3No
aWZ0KHZhKTsKKwkJcHRlcGluZGV4ID0gcG1hcF9wZGVfcGluZGV4KHZhKTsKIAkJaWYgKG1wdGUg
JiYgKG1wdGUtPnBpbmRleCA9PSBwdGVwaW5kZXgpKSB7CiAJCQltcHRlLT53aXJlX2NvdW50Kys7
CiAJCX0gZWxzZSB7CiAJCQkvKgogCQkJICogR2V0IHRoZSBwYWdlIGRpcmVjdG9yeSBlbnRyeQog
CQkJICovCi0JCQlwdGV2YSA9ICh2bV9vZmZzZXRfdClwbWFwLT5wbV9zZWd0YWJbcHRlcGluZGV4
XTsKKwkJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKIAogCQkJLyoKIAkJCSAqIElmIHRoZSBw
YWdlIHRhYmxlIHBhZ2UgaXMgbWFwcGVkLCB3ZSBqdXN0CiAJCQkgKiBpbmNyZW1lbnQgdGhlIGhv
bGQgY291bnQsIGFuZCBhY3RpdmF0ZSBpdC4KIAkJCSAqLwotCQkJaWYgKHB0ZXZhKSB7CisJCQlp
ZiAocGRlICYmICpwZGUgIT0gMCkgewogCQkJCWlmIChwbWFwLT5wbV9wdHBoaW50ICYmCiAJCQkJ
ICAgIChwbWFwLT5wbV9wdHBoaW50LT5waW5kZXggPT0gcHRlcGluZGV4KSkgewogCQkJCQltcHRl
ID0gcG1hcC0+cG1fcHRwaGludDsKIAkJCQl9IGVsc2UgewogCQkJCQltcHRlID0gUEhZU19UT19W
TV9QQUdFKAotCQkJCQkJTUlQU19LU0VHMF9UT19QSFlTKHB0ZXZhKSk7CisJCQkJCQlNSVBTX0tT
RUcwX1RPX1BIWVMoKnBkZSkpOwogCQkJCQlwbWFwLT5wbV9wdHBoaW50ID0gbXB0ZTsKIAkJCQl9
CiAJCQkJbXB0ZS0+d2lyZV9jb3VudCsrOwpAQCAtMTk1NCw3ICsyMDc3LDcgQEAKIAlpZiAoKG0t
PmZsYWdzICYgKFBHX0ZJQ1RJVElPVVMgfCBQR19VTk1BTkFHRUQpKSA9PSAwICYmCiAJICAgICFw
bWFwX3RyeV9pbnNlcnRfcHZfZW50cnkocG1hcCwgbXB0ZSwgdmEsIG0pKSB7CiAJCWlmIChtcHRl
ICE9IE5VTEwpIHsKLQkJCXBtYXBfdW53aXJlX3B0ZV9ob2xkKHBtYXAsIG1wdGUpOworCQkJcG1h
cF91bndpcmVfcHRlX2hvbGQocG1hcCwgdmEsIG1wdGUpOwogCQkJbXB0ZSA9IE5VTEw7CiAJCX0K
IAkJcmV0dXJuIChtcHRlKTsKQEAgLTI1MDYsMjEgKzI2MjksMTkgQEAKIAogCQlQTUFQX0xPQ0so
cHYtPnB2X3BtYXApOwogCQlwdGUgPSBwbWFwX3B0ZShwdi0+cHZfcG1hcCwgcHYtPnB2X3ZhKTsK
LQogCQlpZiAoc2V0ZW0pIHsKLQkJCSooaW50ICopcHRlIHw9IGJpdDsKKwkJCSpwdGUgfD0gYml0
OwogCQkJcG1hcF91cGRhdGVfcGFnZShwdi0+cHZfcG1hcCwgcHYtPnB2X3ZhLCAqcHRlKTsKIAkJ
fSBlbHNlIHsKLQkJCXZtX29mZnNldF90IHBiaXRzID0gKih2bV9vZmZzZXRfdCAqKXB0ZTsKKwkJ
CXB0X2VudHJ5X3QgcGJpdHMgPSAqcHRlOwogCiAJCQlpZiAocGJpdHMgJiBiaXQpIHsKIAkJCQlp
ZiAoYml0ID09IFBURV9EKSB7Ci0JCQkJCWlmIChwYml0cyAmIFBURV9EKSB7CisJCQkJCWlmIChw
Yml0cyAmIFBURV9EKQogCQkJCQkJdm1fcGFnZV9kaXJ0eShtKTsKLQkJCQkJfQotCQkJCQkqKGlu
dCAqKXB0ZSA9IChwYml0cyAmIH5QVEVfRCkgfCBQVEVfUk87CisJCQkJCSpwdGUgPSAocGJpdHMg
JiB+UFRFX0QpIHwgUFRFX1JPOwogCQkJCX0gZWxzZSB7Ci0JCQkJCSooaW50ICopcHRlID0gcGJp
dHMgJiB+Yml0OworCQkJCQkqcHRlID0gcGJpdHMgJiB+Yml0OwogCQkJCX0KIAkJCQlwbWFwX3Vw
ZGF0ZV9wYWdlKHB2LT5wdl9wbWFwLCBwdi0+cHZfdmEsICpwdGUpOwogCQkJfQpAQCAtMjY1OCwx
MyArMjc3OSwxNyBAQAogYm9vbGVhbl90CiBwbWFwX2lzX3ByZWZhdWx0YWJsZShwbWFwX3QgcG1h
cCwgdm1fb2Zmc2V0X3QgYWRkcikKIHsKKwlwZF9lbnRyeV90ICpwZGU7CiAJcHRfZW50cnlfdCAq
cHRlOwogCWJvb2xlYW5fdCBydjsKIAogCXJ2ID0gRkFMU0U7CiAJUE1BUF9MT0NLKHBtYXApOwot
CWlmIChwbWFwX3NlZ21hcChwbWFwLCBhZGRyKSAhPSBOVUxMKSB7Ci0JCXB0ZSA9IHBtYXBfcHRl
KHBtYXAsIGFkZHIpOworCXBkZSA9IHBtYXBfcGRlKHBtYXAsIGFkZHIpOworCWlmIChwZGUgIT0g
TlVMTCAmJiAqcGRlICE9IDApIHsKKwkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgYWRkcik7
CisJCWlmIChwdGUgPT0gTlVMTCkKKwkJCXByaW50ZigiRmFpbCBhZGRyICVwIHBkZSAlcCwgcHRl
ICVwXG4iLCAodm9pZCAqKWFkZHIsIHBkZSwgcHRlKTsKIAkJcnYgPSAoKnB0ZSA9PSAwKTsKIAl9
CiAJUE1BUF9VTkxPQ0socG1hcCk7CkBAIC0yOTI3LDc0ICszMDUyLDY1IEBACiAJcmV0dXJuOwog
fQogCi1pbnQgcG1hcF9waWRfZHVtcChpbnQgcGlkKTsKLQotaW50Ci1wbWFwX3BpZF9kdW1wKGlu
dCBwaWQpCitEQl9TSE9XX0NPTU1BTkQocHRhYmxlLCBkZGJfcGlkX2R1bXApCiB7CiAJcG1hcF90
IHBtYXA7CisJc3RydWN0IHRocmVhZCAqdGQgPSBOVUxMOwogCXN0cnVjdCBwcm9jICpwOwotCWlu
dCBucHRlID0gMDsKLQlpbnQgaW5kZXg7CisJaW50IGksIGosIGs7CisJdm1fcGFkZHJfdCBwYTsK
Kwl2bV9vZmZzZXRfdCB2YTsKIAotCXN4X3Nsb2NrKCZhbGxwcm9jX2xvY2spOwotCUxJU1RfRk9S
RUFDSChwLCAmYWxscHJvYywgcF9saXN0KSB7Ci0JCWlmIChwLT5wX3BpZCAhPSBwaWQpCi0JCQlj
b250aW51ZTsKKwlpZiAoaGF2ZV9hZGRyKSB7CisJCXRkID0gZGJfbG9va3VwX3RocmVhZChhZGRy
LCBUUlVFKTsKKwkJaWYgKHRkID09IE5VTEwpIHsKKwkJCWRiX3ByaW50ZigiSW52YWxpZCBwaWQg
b3IgdGlkIik7CisJCQlyZXR1cm47CisJCX0KKwkJcCA9IHRkLT50ZF9wcm9jOworCQlpZiAocC0+
cF92bXNwYWNlID09IE5VTEwpIHsKKwkJCWRiX3ByaW50ZigiTm8gdm1zcGFjZSBmb3IgcHJvY2Vz
cyIpOworCQkJcmV0dXJuOworCQl9CisJCQlwbWFwID0gdm1zcGFjZV9wbWFwKHAtPnBfdm1zcGFj
ZSk7CisJfSBlbHNlCisJCXBtYXAgPSBrZXJuZWxfcG1hcDsKIAotCQlpZiAocC0+cF92bXNwYWNl
KSB7Ci0JCQlpbnQgaSwgajsKLQotCQkJcHJpbnRmKCJ2bXNwYWNlIGlzICVwXG4iLAotCQkJICAg
ICAgIHAtPnBfdm1zcGFjZSk7Ci0JCQlpbmRleCA9IDA7Ci0JCQlwbWFwID0gdm1zcGFjZV9wbWFw
KHAtPnBfdm1zcGFjZSk7Ci0JCQlwcmludGYoInBtYXAgYXNpZDoleCBnZW5lcmF0aW9uOiV4XG4i
LAorCWRiX3ByaW50ZigicG1hcDolcCBzZWd0YWI6JXAgYXNpZDoleCBnZW5lcmF0aW9uOiV4XG4i
LAorCSAgICBwbWFwLCBwbWFwLT5wbV9zZWd0YWIsCiAJCQkgICAgICAgcG1hcC0+cG1fYXNpZFsw
XS5hc2lkLAogCQkJICAgICAgIHBtYXAtPnBtX2FzaWRbMF0uZ2VuKTsKLQkJCWZvciAoaSA9IDA7
IGkgPCBOVVNFUlBHVEJMUzsgaSsrKSB7Ci0JCQkJcGRfZW50cnlfdCAqcGRlOwotCQkJCXB0X2Vu
dHJ5X3QgKnB0ZTsKLQkJCQl1bnNpZ25lZCBiYXNlID0gaSA8PCBTRUdTSElGVDsKKwlmb3IgKGkg
PSAwOyBpIDwgTlBERVBHOyBpKyspIHsKKwkJcGRfZW50cnlfdCAqcGRwZTsKKwkJcHRfZW50cnlf
dCAqcGRlOworCQlwdF9lbnRyeV90IHB0ZTsKIAotCQkJCXBkZSA9ICZwbWFwLT5wbV9zZWd0YWJb
aV07Ci0JCQkJaWYgKHBkZSAmJiAqcGRlICE9IDApIHsKLQkJCQkJZm9yIChqID0gMDsgaiA8IDEw
MjQ7IGorKykgewotCQkJCQkJdm1fb2Zmc2V0X3QgdmEgPSBiYXNlICsKLQkJCQkJCShqIDw8IFBB
R0VfU0hJRlQpOwotCi0JCQkJCQlwdGUgPSBwbWFwX3B0ZShwbWFwLCB2YSk7Ci0JCQkJCQlpZiAo
cHRlICYmIHB0ZV90ZXN0KHB0ZSwgUFRFX1YpKSB7Ci0JCQkJCQkJdm1fb2Zmc2V0X3QgcGE7Ci0J
CQkJCQkJdm1fcGFnZV90IG07Ci0KLQkJCQkJCQlwYSA9IFRMQkxPX1BGTl9UT19QQSgqcHRlKTsK
LQkJCQkJCQltID0gUEhZU19UT19WTV9QQUdFKHBhKTsKLQkJCQkJCQlwcmludGYoInZhOiAlcCwg
cHQ6ICVwLCBoOiAlZCwgdzogJWQsIGY6IDB4JXgiLAotCQkJCQkJCSAgICAodm9pZCAqKXZhLAot
CQkJCQkJCSAgICAodm9pZCAqKXBhLAotCQkJCQkJCSAgICBtLT5ob2xkX2NvdW50LAotCQkJCQkJ
CSAgICBtLT53aXJlX2NvdW50LAotCQkJCQkJCSAgICBtLT5mbGFncyk7Ci0JCQkJCQkJbnB0ZSsr
OwotCQkJCQkJCWluZGV4Kys7Ci0JCQkJCQkJaWYgKGluZGV4ID49IDIpIHsKLQkJCQkJCQkJaW5k
ZXggPSAwOwotCQkJCQkJCQlwcmludGYoIlxuIik7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJ
cHJpbnRmKCIgIik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQorCQlwZHBlID0g
KHBkX2VudHJ5X3QgKilwbWFwLT5wbV9zZWd0YWJbaV07CisJCWlmIChwZHBlID09IE5VTEwpCisJ
CQljb250aW51ZTsKKwkJZGJfcHJpbnRmKCJbJTRkXSAlcFxuIiwgaSwgcGRwZSk7CisjaWZkZWYg
X19taXBzX242NAorCQlmb3IgKGogPSAwOyBqIDwgTlBERVBHOyBqKyspIHsKKwkJCXBkZSA9IChw
dF9lbnRyeV90ICopcGRwZVtqXTsKKwkJCWlmIChwZGUgPT0gTlVMTCkKKwkJCQljb250aW51ZTsK
KwkJCWRiX3ByaW50ZigiXHRbJTRkXSAlcFxuIiwgaiwgcGRlKTsKKyNlbHNlCisJCXsKKwkJCWog
PSAwOworCQkJcGRlID0gIChwdF9lbnRyeV90ICopcGRwZTsKKyNlbmRpZgorCQkJZm9yIChrID0g
MDsgayA8IE5QVEVQRzsgaysrKSB7CisJCQkJcHRlID0gcGRlW2tdOworCQkJCWlmIChwdGUgPT0g
MCB8fCAhcHRlX3Rlc3QoJnB0ZSwgUFRFX1YpKQorCQkJCQljb250aW51ZTsKKwkJCQlwYSA9IFRM
QkxPX1BURV9UT19QQShwdGUpOworCQkJCXZhID0gKCh1X2xvbmcpaSA8PCBTRUdTSElGVCkgfCAo
aiA8PCBQRFJTSElGVCkgfCAoayA8PCBQQUdFX1NISUZUKTsKKwkJCQlkYl9wcmludGYoIlx0XHRb
JTA0ZF0gdmE6ICVwIHB0ZTogJTh4IHBhOiVseFxuIiwKKwkJCQkgICAgICAgaywgKHZvaWQgKil2
YSwgcHRlLCAodV9sb25nKXBhKTsKIAkJCX0KLQkJfSBlbHNlIHsKLQkJICBwcmludGYoIlByb2Nl
c3MgcGlkOiVkIGhhcyBubyB2bV9zcGFjZVxuIiwgcGlkKTsKIAkJfQotCQlicmVhazsKIAl9Ci0J
c3hfc3VubG9jaygmYWxscHJvY19sb2NrKTsKLQlyZXR1cm4gbnB0ZTsKIH0KIAogCkBAIC0zMTI2
LDcgKzMyNDIsNiBAQAogCVBIWVNfVE9fVk1fUEFHRShwYSktPm1kLnB2X2ZsYWdzIHw9IChQVl9U
QUJMRV9SRUYgfCBQVl9UQUJMRV9NT0QpOwogfQogCi0KIC8qCiAgKglSb3V0aW5lOglwbWFwX2tl
eHRyYWN0CiAgKglGdW5jdGlvbjoKQEAgLTMxNDUsNyArMzI2MCw2IEBACiAJaWYgKHZhID49IE1J
UFNfWEtQSFlTX1NUQVJUICYmIHZhIDwgTUlQU19YS1BIWVNfRU5EKQogCQlyZXR1cm4gKE1JUFNf
WEtQSFlTX1RPX1BIWVModmEpKTsKICNlbmRpZgotCiAJaWYgKHZhID49IE1JUFNfS1NFRzBfU1RB
UlQgJiYgdmEgPCBNSVBTX0tTRUcwX0VORCkKIAkJcmV0dXJuIChNSVBTX0tTRUcwX1RPX1BIWVMo
dmEpKTsKIApAQCAtMzIwNSw3ICszMzE5LDcgQEAKIAogCWlmIChtICE9IE5VTEwpIHsKIAkJZm9y
IChwdiA9IFRBSUxRX0ZJUlNUKCZtLT5tZC5wdl9saXN0KTsgcHY7Ci0JICAgIAkgICAgcHYgPSBU
QUlMUV9ORVhUKHB2LCBwdl9saXN0KSkgeworCQkgICAgcHYgPSBUQUlMUV9ORVhUKHB2LCBwdl9s
aXN0KSkgewogCQkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgocHYtPnB2X3ZhLCBQQUdF
X1NJWkUpOwogCQl9CiAJfQo=
--001485f6c88a730961048cf08cb7--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?AANLkTimOr-JGU_jxFZ5QP2QSM-jWKJDXRc7O3ZTaoALX>