Subject: Fixing Multiboot
To: None <tech-kern@netbsd.org>
From: Julio M. Merino Vidal <jmmv84@gmail.com>
List: tech-kern
Date: 10/23/2006 21:46:39
------=_Part_126618_19888887.1161632799838
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

Hello,

[ please CC me any replies ]

A while ago someone fixed the i386 kernel linker script to generate
the proper physical addresses for the segments in the binary image.
This change allowed the use of unpatched GRUB to boot NetBSD kernels
using the Multiboot option.  Unfortunately the fix was incomplete
because ksyms do not work with unpatched GRUB (which means "broken"
ddb and no lkms).  That's basically because of some nasty tricks used
in our Multiboot code.

The attached patch fixes this issue by dealing with the ksyms in the
Multiboot case in a cleaner way.  (Yes, martin@, I finally implemented
your suggestions!  Or at least I think so.)  What it does is correctly
copy the symbol table after the kernel (without having to reserve
space beforehand, which is what unpatched GRUB did not do) and gets
rid of the need to generate a fake minimal ELF image to get ksyms_init
working.  The result is a simpler implementation.

The patch still needs some cleanup and testing in the non-Multiboot
case which I'll do tomorrow or so.  But in the meantime I'd like to
hear comments about the proposed solution.

Thank you.

-- 
Julio M. Merino Vidal <jmmv84@gmail.com>
The Julipedia - http://julipedia.blogspot.com/

------=_Part_126618_19888887.1161632799838
Content-Type: text/plain; name=patch.diff; charset=ANSI_X3.4-1968
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="patch.diff"

SW5kZXg6IHN5cy9rc3ltcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9jdnNyb290L3NyYy9zeXMv
c3lzL2tzeW1zLmgsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMTEKZGlmZiAtdSAtcCAtcjEuMTEg
a3N5bXMuaAotLS0gc3lzL2tzeW1zLmgJMTEgRGVjIDIwMDUgMTI6MjU6MjAgLTAwMDAJMS4xMQor
Kysgc3lzL2tzeW1zLmgJMjMgT2N0IDIwMDYgMTk6Mzg6NTkgLTAwMDAKQEAgLTY1LDYgKzY1LDcg
QEAgaW50IGtzeW1zX2FkZHN5bXRhYihjb25zdCBjaGFyICosIHZvaWQgKgogaW50IGtzeW1zX2Rl
bHN5bXRhYihjb25zdCBjaGFyICopOwogaW50IGtzeW1zX3JlbnN5bXRhYihjb25zdCBjaGFyICos
IGNvbnN0IGNoYXIqKTsKIHZvaWQga3N5bXNfaW5pdChpbnQsIHZvaWQgKiwgdm9pZCAqKTsKK3Zv
aWQga3N5bXNfaW5pdF9leHBsaWNpdChjYWRkcl90LCBzaXplX3QsIGNhZGRyX3QsIHNpemVfdCk7
CiAjaWZkZWYgRERCCiBpbnQga3N5bXNfc2lmdChjaGFyICosIGNoYXIgKiwgaW50KTsKICNlbmRp
ZgpJbmRleDoga2Vybi9rZXJuX2tzeW1zLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL2N2c3Jvb3Qv
c3JjL3N5cy9rZXJuL2tlcm5fa3N5bXMuYyx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS4yOApkaWZm
IC11IC1wIC1yMS4yOCBrZXJuX2tzeW1zLmMKLS0tIGtlcm4va2Vybl9rc3ltcy5jCTEyIE9jdCAy
MDA2IDAxOjMyOjE1IC0wMDAwCTEuMjgKKysrIGtlcm4va2Vybl9rc3ltcy5jCTIzIE9jdCAyMDA2
IDE5OjM5OjAwIC0wMDAwCkBAIC0yOTIsNDIgKzI5Miw0NCBAQCBrc3ltc2F0dGFjaChpbnQgYXJn
IF9fdW51c2VkKQogfQogCiAvKgotICogQWRkIGEgc3ltYm9sIHRhYmxlIG5hbWVkIG5hbWUuCi0g
KiBUaGlzIGlzIGludGVuZGVkIGZvciB1c2Ugd2hlbiB0aGUga2VybmVsIGxvYWRlciBlbnRlcnMg
dGhlIHRhYmxlLgorICogQWRkIGEgc3ltYm9sIHRhYmxlLgorICogVGhpcyBpcyBpbnRlbmRlZCBm
b3IgdXNlIHdoZW4gdGhlIHN5bWJvbCB0YWJsZSBhbmQgaXRzIGNvcnJlc3BvbmRpbmcgc3RyaW5n
CisgKiB0YWJsZSBhcmUgZWFzaWx5IGF2YWlsYWJsZS4gIElmIHRoZXkgYXJlIGVtYmVkZGVkIGlu
IGFuIEVMRiBpbWFnZSwgdXNlCisgKiBhZGRzeW10YWJfZWxmKCkgaW5zdGVhZC4KKyAqCisgKiBu
YW1lIC0gU3ltYm9sJ3MgdGFibGUgbmFtZS4KKyAqIHN5bXN0YXJ0LCBzeW1zaXplIC0gQWRkcmVz
cyBhbmQgc2l6ZSBvZiB0aGUgc3ltYm9sIHRhYmxlLgorICogc3Ryc3RhcnQsIHN0cnNpemUgLSBB
ZGRyZXNzIGFuZCBzaXplIG9mIHRoZSBzdHJpbmcgdGFibGUuCisgKiB0YWIgLSBTeW1ib2wgdGFi
bGUgdG8gYmUgdXBkYXRlZCB3aXRoIHRoaXMgaW5mb3JtYXRpb24uCisgKiBuZXdzdGFydCAtIEFk
ZHJlc3MgdG8gd2hpY2ggdGhlIHN5bWJvbCB0YWJsZSBoYXMgdG8gYmUgY29waWVkIGR1cmluZwor
ICogICAgICAgICAgICBzaHJpbmtpbmcuICBJZiBOVUxMLCBpdCBpcyBub3QgbW92ZWQuCiAgKi8K
IHN0YXRpYyB2b2lkCi1hZGRzeW10YWIoY29uc3QgY2hhciAqbmFtZSwgRWxmX0VoZHIgKmVoZHIs
IHN0cnVjdCBzeW10YWIgKnRhYikKK2FkZHN5bXRhYihjb25zdCBjaGFyICpuYW1lLAorICAgIGNh
ZGRyX3Qgc3ltc3RhcnQsIHNpemVfdCBzeW1zaXplLAorICAgIGNhZGRyX3Qgc3Ryc3RhcnQsIHNp
emVfdCBzdHJzaXplLAorICAgIHN0cnVjdCBzeW10YWIgKnRhYiwKKyAgICBjYWRkcl90IG5ld3N0
YXJ0KQogewotCWNhZGRyX3Qgc3RhcnQgPSAoY2FkZHJfdCllaGRyOwogCWNhZGRyX3Qgc2VuZDsK
LQlFbGZfU2hkciAqc2hkcjsKIAlFbGZfU3ltICpzeW0sICpuc3ltOwogCWludCBpLCBqLCBuLCBn
OwogCWNoYXIgKnN0cjsKIAotCS8qIEZpbmQgdGhlIHN5bWJvbCB0YWJsZSBhbmQgdGhlIGNvcnJl
c3BvbmRpbmcgc3RyaW5nIHRhYmxlLiAqLwotCXNoZHIgPSAoRWxmX1NoZHIgKikoc3RhcnQgKyBl
aGRyLT5lX3Nob2ZmKTsKLQlmb3IgKGkgPSAxOyBpIDwgZWhkci0+ZV9zaG51bTsgaSsrKSB7Ci0J
CWlmIChzaGRyW2ldLnNoX3R5cGUgIT0gU0hUX1NZTVRBQikKLQkJCWNvbnRpbnVlOwotCQlpZiAo
c2hkcltpXS5zaF9vZmZzZXQgPT0gMCkKLQkJCWNvbnRpbnVlOwotCQl0YWItPnNkX3N5bXN0YXJ0
ID0gKEVsZl9TeW0gKikoc3RhcnQgKyBzaGRyW2ldLnNoX29mZnNldCk7Ci0JCXRhYi0+c2Rfc3lt
c2l6ZSA9IHNoZHJbaV0uc2hfc2l6ZTsKLQkJaiA9IHNoZHJbaV0uc2hfbGluazsKLQkJaWYgKHNo
ZHJbal0uc2hfb2Zmc2V0ID09IDApCi0JCQljb250aW51ZTsgLyogQ2FuIHRoaXMgaGFwcGVuPyAq
LwotCQl0YWItPnNkX3N0cnN0YXJ0ID0gc3RhcnQgKyBzaGRyW2pdLnNoX29mZnNldDsKLQkJdGFi
LT5zZF9zdHJzaXplID0gc2hkcltqXS5zaF9zaXplOwotCQlicmVhazsKLQl9CisJaWYgKG5ld3N0
YXJ0ID09IE5VTEwpCisJCW5ld3N0YXJ0ID0gc3ltc3RhcnQ7CisJS0FTU0VSVChuZXdzdGFydCA8
PSBzeW1zdGFydCAmJiBzeW1zdGFydCA8PSBzdHJzdGFydCk7CisKKwl0YWItPnNkX3N5bXN0YXJ0
ID0gKEVsZl9TeW0gKilzeW1zdGFydDsKKwl0YWItPnNkX3N5bXNpemUgPSBzeW1zaXplOworCXRh
Yi0+c2Rfc3Ryc3RhcnQgPSBzdHJzdGFydDsKKwl0YWItPnNkX3N0cnNpemUgPSBzdHJzaXplOwog
CXRhYi0+c2RfbmFtZSA9IG5hbWU7CiAJc2VuZCA9IHRhYi0+c2Rfc3Ryc3RhcnQgKyB0YWItPnNk
X3N0cnNpemU7CiAKICNpZmRlZiBLU1lNU19ERUJVRwotCXByaW50Zigic3RhcnQgJXAgc3ltICVw
IHN5bXN6ICVkIHN0ciAlcCBzdHJzeiAlZCBzZW5kICVwXG4iLAotCSAgICBzdGFydCwgdGFiLT5z
ZF9zeW1zdGFydCwgdGFiLT5zZF9zeW1zaXplLAotCSAgICB0YWItPnNkX3N0cnN0YXJ0LCB0YWIt
PnNkX3N0cnNpemUsIHNlbmQpOworCXByaW50ZigibmV3c3RhcnQgJXAgc3ltICVwIHN5bXN6ICVk
IHN0ciAlcCBzdHJzeiAlZCBzZW5kICVwXG4iLAorCSAgICBuZXdzdGFydCwgc3ltc3RhcnQsIHN5
bXNpemUsIHN0cnN0YXJ0LCBzdHJzaXplLCBzZW5kKTsKICNlbmRpZgogCiAJLyoKQEAgLTMzNSw3
ICszMzcsNyBAQCBhZGRzeW10YWIoY29uc3QgY2hhciAqbmFtZSwgRWxmX0VoZHIgKmVoCiAJICog
YW5kIG92ZXJ3cml0ZSB0aGUgZWxmIGhlYWRlci4KIAkgKi8KIAlzeW0gPSB0YWItPnNkX3N5bXN0
YXJ0OwotCW5zeW0gPSAoRWxmX1N5bSAqKXN0YXJ0OworCW5zeW0gPSAoRWxmX1N5bSAqKW5ld3N0
YXJ0OwogCXN0ciA9IHRhYi0+c2Rfc3Ryc3RhcnQ7CiAJZm9yIChnID0gaSA9IG4gPSAwOyBpIDwg
dGFiLT5zZF9zeW1zaXplL3NpemVvZihFbGZfU3ltKTsgaSsrKSB7CiAJCWlmIChpID09IDApIHsK
QEAgLTQxMyw2ICs0MTUsNDEgQEAgYWRkc3ltdGFiKGNvbnN0IGNoYXIgKm5hbWUsIEVsZl9FaGRy
ICplaAogfQogCiAvKgorICogQWRkIGEgc3ltYm9sIHRhYmxlIG5hbWVkIG5hbWUuCisgKiBUaGlz
IGlzIGludGVuZGVkIGZvciB1c2Ugd2hlbiB0aGUga2VybmVsIGxvYWRlciBlbnRlcnMgdGhlIHRh
YmxlLgorICovCitzdGF0aWMgdm9pZAorYWRkc3ltdGFiX2VsZihjb25zdCBjaGFyICpuYW1lLCBF
bGZfRWhkciAqZWhkciwgc3RydWN0IHN5bXRhYiAqdGFiKQoreworCWludCBpLCBqOworCWNhZGRy
X3Qgc3RhcnQgPSAoY2FkZHJfdCllaGRyOworCUVsZl9TaGRyICpzaGRyOworCWNhZGRyX3Qgc3lt
c3RhcnQgPSBOVUxMLCBzdHJzdGFydCA9IE5VTEw7CisJc2l6ZV90IHN5bXNpemUgPSAwLCBzdHJz
aXplID0gMDsKKworCS8qIEZpbmQgdGhlIHN5bWJvbCB0YWJsZSBhbmQgdGhlIGNvcnJlc3BvbmRp
bmcgc3RyaW5nIHRhYmxlLiAqLworCXNoZHIgPSAoRWxmX1NoZHIgKikoc3RhcnQgKyBlaGRyLT5l
X3Nob2ZmKTsKKwlmb3IgKGkgPSAxOyBpIDwgZWhkci0+ZV9zaG51bTsgaSsrKSB7CisJCWlmIChz
aGRyW2ldLnNoX3R5cGUgIT0gU0hUX1NZTVRBQikKKwkJCWNvbnRpbnVlOworCQlpZiAoc2hkcltp
XS5zaF9vZmZzZXQgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlzeW1zdGFydCA9IHN0YXJ0ICsgc2hk
cltpXS5zaF9vZmZzZXQ7CisJCXN5bXNpemUgPSBzaGRyW2ldLnNoX3NpemU7CisJCWogPSBzaGRy
W2ldLnNoX2xpbms7CisJCWlmIChzaGRyW2pdLnNoX29mZnNldCA9PSAwKQorCQkJY29udGludWU7
IC8qIENhbiB0aGlzIGhhcHBlbj8gKi8KKwkJc3Ryc3RhcnQgPSBzdGFydCArIHNoZHJbal0uc2hf
b2Zmc2V0OworCQlzdHJzaXplID0gc2hkcltqXS5zaF9zaXplOworCQlicmVhazsKKwl9CisKKwlL
QVNTRVJUKHN5bXN0YXJ0ICE9IE5VTEwgJiYgc3Ryc3RhcnQgIT0gTlVMTCk7CisKKwlhZGRzeW10
YWIobmFtZSwgc3ltc3RhcnQsIHN5bXNpemUsIHN0cnN0YXJ0LCBzdHJzaXplLCB0YWIsIHN0YXJ0
KTsKK30KKworLyoKICAqIFNldHVwIHRoZSBrZXJuZWwgc3ltYm9sIHRhYmxlIHN0dWZmLgogICov
CiB2b2lkCkBAIC00NjAsNyArNDk3LDcgQEAga3N5bXNfaW5pdChpbnQgc3ltc2l6ZSwgdm9pZCAq
c3RhcnQsIHZvaQogCWtzeW1zX2hkcl9pbml0KHN0YXJ0KTsKICNlbmRpZgogCi0JYWRkc3ltdGFi
KCJuZXRic2QiLCBlaGRyLCAma2VybmVsX3N5bXRhYik7CisJYWRkc3ltdGFiX2VsZigibmV0YnNk
IiwgZWhkciwgJmtlcm5lbF9zeW10YWIpOwogCiAjaWYgTktTWU1TCiAJa3N5bXNfc2l6ZXNfY2Fs
YygpOwpAQCAtNDc2LDYgKzUxMywyOSBAQCBrc3ltc19pbml0KGludCBzeW1zaXplLCB2b2lkICpz
dGFydCwgdm9pCiB9CiAKIC8qCisgKiBTZXR1cCB0aGUga2VybmVsIHN5bWJvbCB0YWJsZSBzdHVm
Zi4KKyAqIFVzZSB0aGlzIHdoZW4gdGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbCBhbmQgc3RyaW5n
IHRhYmxlcyBhcmUga25vd247CisgKiBvdGhlcndpc2UgdXNlIGtzeW1zX2luaXQgd2l0aCBhbiBF
TEYgaW1hZ2UuCisgKi8KK3ZvaWQKK2tzeW1zX2luaXRfZXhwbGljaXQoY2FkZHJfdCBzeW1zdGFy
dCwgc2l6ZV90IHN5bXNpemUsCisgICAgY2FkZHJfdCBzdHJzdGFydCwgc2l6ZV90IHN0cnNpemUp
Cit7CisJS0FTU0VSVChzeW1zdGFydCAhPSBOVUxMKTsKKwlLQVNTRVJUKHN0cnN0YXJ0ICE9IE5V
TEwpOworCUtBU1NFUlQoc3ltc3RhcnQgPD0gc3Ryc3RhcnQpOworCisJYWRkc3ltdGFiKCJuZXRi
c2QiLCBzeW1zdGFydCwgc3ltc2l6ZSwgc3Ryc3RhcnQsIHN0cnNpemUsCisJICAgICZrZXJuZWxf
c3ltdGFiLCBOVUxMKTsKKworI2lmIE5LU1lNUworCWtzeW1zX3NpemVzX2NhbGMoKTsKKyNlbmRp
ZgorCisJa3N5bXNpbml0ZWQgPSAxOworfQorCisvKgogICogR2V0IHRoZSB2YWx1ZSBhc3NvY2lh
dGVkIHdpdGggYSBzeW1ib2wuCiAgKiAibW9kIiBpcyB0aGUgbW9kdWxlIG5hbWUsIG9yIG51bGwg
aWYgYW55IG1vZHVsZS4KICAqICJzeW0iIGlzIHRoZSBzeW1ib2wgbmFtZS4KSW5kZXg6IGFyY2gv
aTM4Ni9jb25mL0FMTAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvY3Zzcm9vdC9zcmMvc3lzL2FyY2gv
aTM4Ni9jb25mL0FMTCx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS42OApkaWZmIC11IC1wIC1yMS42
OCBBTEwKLS0tIGFyY2gvaTM4Ni9jb25mL0FMTAkyMSBPY3QgMjAwNiAxNDoxMDozMyAtMDAwMAkx
LjY4CisrKyBhcmNoL2kzODYvY29uZi9BTEwJMjMgT2N0IDIwMDYgMTk6Mzk6MDAgLTAwMDAKQEAg
LTQ5LDcgKzQ5LDYgQEAgb3B0aW9ucyAJTVRSUgkJIyBtZW1vcnktdHlwZSByYW5nZSByZWdpcwog
b3B0aW9ucyAJUEVSRkNUUlMJIyBwZXJmb3JtYW5jZS1tb25pdG9yaW5nIGNvdW50ZXJzIHN1cHBv
cnQKIAogb3B0aW9ucyAJTVVMVElCT09UCSMgTXVsdGlib290IHN1cHBvcnQgKHNlZSBtdWx0aWJv
b3QoOCkpCi1vcHRpb25zIAlNVUxUSUJPT1RfU1lNVEFCX1NQQUNFPTEwNDg1NzYKIAogIyBkZWxh
eSBiZXR3ZWVuICJyZWJvb3RpbmcgLi4uIiBtZXNzYWdlIGFuZCBoYXJkd2FyZSByZXNldCwgaW4g
bWlsbGlzZWNvbmRzCiBvcHRpb25zIAlDUFVSRVNFVF9ERUxBWT0yMDAwCkluZGV4OiBhcmNoL2kz
ODYvY29uZi9HRU5FUklDCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9jdnNyb290L3NyYy9zeXMvYXJj
aC9pMzg2L2NvbmYvR0VORVJJQyx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS43ODkKZGlmZiAtdSAt
cCAtcjEuNzg5IEdFTkVSSUMKLS0tIGFyY2gvaTM4Ni9jb25mL0dFTkVSSUMJMjIgT2N0IDIwMDYg
MTY6MjY6MjcgLTAwMDAJMS43ODkKKysrIGFyY2gvaTM4Ni9jb25mL0dFTkVSSUMJMjMgT2N0IDIw
MDYgMTk6Mzk6MDEgLTAwMDAKQEAgLTU0LDcgKzU0LDYgQEAgb3B0aW9ucyAJTVRSUgkJIyBtZW1v
cnktdHlwZSByYW5nZSByZWdpcwogI29wdGlvbnMgCVBFUkZDVFJTCSMgcGVyZm9ybWFuY2UtbW9u
aXRvcmluZyBjb3VudGVycyBzdXBwb3J0CiAKIG9wdGlvbnMgCU1VTFRJQk9PVAkjIE11bHRpYm9v
dCBzdXBwb3J0IChzZWUgbXVsdGlib290KDgpKQotI29wdGlvbnMgCU1VTFRJQk9PVF9TWU1UQUJf
U1BBQ0U9MTA0ODU3NgogCiAjIGRlbGF5IGJldHdlZW4gInJlYm9vdGluZyAuLi4iIG1lc3NhZ2Ug
YW5kIGhhcmR3YXJlIHJlc2V0LCBpbiBtaWxsaXNlY29uZHMKICNvcHRpb25zIAlDUFVSRVNFVF9E
RUxBWT0yMDAwCkluZGV4OiBhcmNoL2kzODYvY29uZi9HRU5FUklDX0xBUFRPUAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
ClJDUyBmaWxlOiAvY3Zzcm9vdC9zcmMvc3lzL2FyY2gvaTM4Ni9jb25mL0dFTkVSSUNfTEFQVE9Q
LHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjIwOQpkaWZmIC11IC1wIC1yMS4yMDkgR0VORVJJQ19M
QVBUT1AKLS0tIGFyY2gvaTM4Ni9jb25mL0dFTkVSSUNfTEFQVE9QCTIxIE9jdCAyMDA2IDE0OjEw
OjMzIC0wMDAwCTEuMjA5CisrKyBhcmNoL2kzODYvY29uZi9HRU5FUklDX0xBUFRPUAkyMyBPY3Qg
MjAwNiAxOTozOTowMSAtMDAwMApAQCAtMzcsNyArMzcsNiBAQCBvcHRpb25zIAlNVFJSCQkjIG1l
bW9yeS10eXBlIHJhbmdlIHJlZ2lzCiAjb3B0aW9ucyAJUEVSRkNUUlMJIyBwZXJmb3JtYW5jZS1t
b25pdG9yaW5nIGNvdW50ZXJzIHN1cHBvcnQKIAogb3B0aW9ucyAJTVVMVElCT09UCSMgTXVsdGli
b290IHN1cHBvcnQgKHNlZSBtdWx0aWJvb3QoOCkpCi0jb3B0aW9ucyAJTVVMVElCT09UX1NZTVRB
Ql9TUEFDRT0xMDQ4NTc2CiAKICMgZGVsYXkgYmV0d2VlbiAicmVib290aW5nIC4uLiIgbWVzc2Fn
ZSBhbmQgaGFyZHdhcmUgcmVzZXQsIGluIG1pbGxpc2Vjb25kcwogI29wdGlvbnMgCUNQVVJFU0VU
X0RFTEFZPTIwMDAKSW5kZXg6IGFyY2gvaTM4Ni9jb25mL1FFTVUKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmls
ZTogL2N2c3Jvb3Qvc3JjL3N5cy9hcmNoL2kzODYvY29uZi9RRU1VLHYKcmV0cmlldmluZyByZXZp
c2lvbiAxLjIKZGlmZiAtdSAtcCAtcjEuMiBRRU1VCi0tLSBhcmNoL2kzODYvY29uZi9RRU1VCTIy
IE9jdCAyMDA2IDIxOjA4OjQ4IC0wMDAwCTEuMgorKysgYXJjaC9pMzg2L2NvbmYvUUVNVQkyMyBP
Y3QgMjAwNiAxOTozOTowMSAtMDAwMApAQCAtMzMsNyArMzMsNiBAQCBvcHRpb25zIAlNVFJSCQkj
IG1lbW9yeS10eXBlIHJhbmdlIHJlZ2lzCiAjb3B0aW9ucyAJUEVSRkNUUlMJIyBwZXJmb3JtYW5j
ZS1tb25pdG9yaW5nIGNvdW50ZXJzIHN1cHBvcnQKIAogb3B0aW9ucyAJTVVMVElCT09UCSMgTXVs
dGlib290IHN1cHBvcnQgKHNlZSBtdWx0aWJvb3QoOCkpCi0jb3B0aW9ucyAJTVVMVElCT09UX1NZ
TVRBQl9TUEFDRT0xMDQ4NTc2CiAKICMgZGVsYXkgYmV0d2VlbiAicmVib290aW5nIC4uLiIgbWVz
c2FnZSBhbmQgaGFyZHdhcmUgcmVzZXQsIGluIG1pbGxpc2Vjb25kcwogI29wdGlvbnMgCUNQVVJF
U0VUX0RFTEFZPTIwMDAKSW5kZXg6IGFyY2gvaTM4Ni9jb25mL2ZpbGVzLmkzODYKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQpSQ1MgZmlsZTogL2N2c3Jvb3Qvc3JjL3N5cy9hcmNoL2kzODYvY29uZi9maWxlcy5pMzg2LHYK
cmV0cmlldmluZyByZXZpc2lvbiAxLjI5NApkaWZmIC11IC1wIC1yMS4yOTQgZmlsZXMuaTM4Ngot
LS0gYXJjaC9pMzg2L2NvbmYvZmlsZXMuaTM4NgkxOSBPY3QgMjAwNiAxNjo1NTozNyAtMDAwMAkx
LjI5NAorKysgYXJjaC9pMzg2L2NvbmYvZmlsZXMuaTM4NgkyMyBPY3QgMjAwNiAxOTozOTowMiAt
MDAwMApAQCAtNTksNyArNTksNiBAQCBkZWZmbGFnCQkJRU5IQU5DRURfU1BFRURTVEVQCiAKICMg
TXVsdGlib290IHN1cHBvcnQKIGRlZmZsYWcgb3B0X211bHRpYm9vdC5oCQlNVUxUSUJPT1QKLWRl
ZnBhcmFtIG9wdF9tdWx0aWJvb3QuaAlNVUxUSUJPT1RfU1lNVEFCX1NQQUNFCiBmaWxlCWFyY2gv
aTM4Ni9pMzg2L211bHRpYm9vdC5jCW11bHRpYm9vdAogCiAjIFBvd2VyTm93IEs3CkluZGV4OiBh
cmNoL2kzODYvaTM4Ni9sb2NvcmUuUwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvY3Zzcm9vdC9zcmMv
c3lzL2FyY2gvaTM4Ni9pMzg2L2xvY29yZS5TLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjQzCmRp
ZmYgLXUgLXAgLXIxLjQzIGxvY29yZS5TCi0tLSBhcmNoL2kzODYvaTM4Ni9sb2NvcmUuUwkyNSBK
dWwgMjAwNiAwMDoyMzozOCAtMDAwMAkxLjQzCisrKyBhcmNoL2kzODYvaTM4Ni9sb2NvcmUuUwky
MyBPY3QgMjAwNiAxOTozOTowMiAtMDAwMApAQCAtMjE1LDE2ICsyMTUsMTAgQEAgc3RhcnQ6CW1v
dncJJDB4MTIzNCwweDQ3MgkJCSMgd2FybSBib290CiAJLmFsaWduCTQKIAkuZ2xvYmwJTXVsdGli
b290X0hlYWRlcgogX0NfTEFCRUwoTXVsdGlib290X0hlYWRlcik6Ci0jZGVmaW5lIE1VTFRJQk9P
VF9IRUFERVJfRkxBR1MJKE1VTFRJQk9PVF9IRUFERVJfV0FOVF9NRU1PUlkgfCBcCi0JCQkJIE1V
TFRJQk9PVF9IRUFERVJfSEFTX0FERFIpCisjZGVmaW5lIE1VTFRJQk9PVF9IRUFERVJfRkxBR1MJ
KE1VTFRJQk9PVF9IRUFERVJfV0FOVF9NRU1PUlkpCiAJLmxvbmcJTVVMVElCT09UX0hFQURFUl9N
QUdJQwogCS5sb25nCU1VTFRJQk9PVF9IRUFERVJfRkxBR1MKIAkubG9uZwktKE1VTFRJQk9PVF9I
RUFERVJfTUFHSUMgKyBNVUxUSUJPT1RfSEVBREVSX0ZMQUdTKQotCS5sb25nCVJFTE9DKE11bHRp
Ym9vdF9IZWFkZXIpCi0JLmxvbmcJUkVMT0Moc3RhcnQpCi0JLmxvbmcJUkVMT0MoX2VkYXRhKQot
CS5sb25nCVJFTE9DKF9lbmQpICsgTVVMVElCT09UX1NZTVRBQl9TUEFDRQotCS5sb25nCVJFTE9D
KHN0YXJ0KQogCiAxOgogCS8qIENoZWNrIGlmIHdlIGFyZSBiZWluZyBleGVjdXRlZCBieSBhIE11
bHRpYm9vdC1jb21wbGlhbnQgYm9vdApJbmRleDogYXJjaC9pMzg2L2kzODYvbWFjaGRlcC5jCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KUkNTIGZpbGU6IC9jdnNyb290L3NyYy9zeXMvYXJjaC9pMzg2L2kzODYvbWFjaGRl
cC5jLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjU4NApkaWZmIC11IC1wIC1yMS41ODQgbWFjaGRl
cC5jCi0tLSBhcmNoL2kzODYvaTM4Ni9tYWNoZGVwLmMJMjIgT2N0IDIwMDYgMTM6Mjk6MTMgLTAw
MDAJMS41ODQKKysrIGFyY2gvaTM4Ni9pMzg2L21hY2hkZXAuYwkyMyBPY3QgMjAwNiAxOTozOTow
MyAtMDAwMApAQCAtMjA5LDYgKzIwOSw4IEBAIGNoYXIgbWFjaGluZV9hcmNoW10gPSAiaTM4NiI7
CQkvKiBtYWNoaW4KIGV4dGVybiBzdHJ1Y3QgYmlfZGV2bWF0Y2ggKng4Nl9hbGxkaXNrczsKIGV4
dGVybiBpbnQgeDg2X25kaXNrczsKIAordm9pZAorc3R1cGlkX3NldHVwX3N5bSh2b2lkKTsKICNp
ZmRlZiBDUFVSRVNFVF9ERUxBWQogaW50CWNwdXJlc2V0X2RlbGF5ID0gQ1BVUkVTRVRfREVMQVk7
CiAjZWxzZQpAQCAtMTk4MywyMiArMTk4NSwyOCBAQCBpbml0Mzg2KHBhZGRyX3QgZmlyc3RfYXZh
aWwpCiAjaWYgTktTWU1TIHx8IGRlZmluZWQoRERCKSB8fCBkZWZpbmVkKExLTSkKIAl7CiAJCWV4
dGVybiBpbnQgZW5kOworCQlib29sZWFuX3QgbG9hZGVkOwogCQlzdHJ1Y3QgYnRpbmZvX3N5bXRh
YiAqc3ltdGFiOwogCiAjaWZkZWYgRERCCiAJCWRiX21hY2hpbmVfaW5pdCgpOwogI2VuZGlmCiAK
LQkJc3ltdGFiID0gbG9va3VwX2Jvb3RpbmZvKEJUSU5GT19TWU1UQUIpOwotCi0JCWlmIChzeW10
YWIpIHsKLQkJCXN5bXRhYi0+c3N5bSArPSBLRVJOQkFTRTsKLQkJCXN5bXRhYi0+ZXN5bSArPSBL
RVJOQkFTRTsKLQkJCWtzeW1zX2luaXQoc3ltdGFiLT5uc3ltLCAoaW50ICopc3ltdGFiLT5zc3lt
LAotCQkJICAgIChpbnQgKilzeW10YWItPmVzeW0pOworI2lmIGRlZmluZWQoTVVMVElCT09UKQor
CQlsb2FkZWQgPSBtdWx0aWJvb3Rfa3N5bXNfaW5pdCgpOworI2Vsc2UKKwkJbG9hZGVkID0gRkFM
U0U7CisjZW5kaWYKKwkJaWYgKCFsb2FkZWQpIHsKKwkJICAgIHN5bXRhYiA9IGxvb2t1cF9ib290
aW5mbyhCVElORk9fU1lNVEFCKTsKKwkJICAgIGlmIChzeW10YWIpIHsKKwkJCSAgICBzeW10YWIt
PnNzeW0gKz0gS0VSTkJBU0U7CisJCQkgICAgc3ltdGFiLT5lc3ltICs9IEtFUk5CQVNFOworCQkJ
ICAgIGtzeW1zX2luaXQoc3ltdGFiLT5uc3ltLCAoaW50ICopc3ltdGFiLT5zc3ltLAorCQkJCShp
bnQgKilzeW10YWItPmVzeW0pOworCQkgICAgfSBlbHNlCisJCQkgICAga3N5bXNfaW5pdCgqKGlu
dCAqKSZlbmQsICgoaW50ICopJmVuZCkgKyAxLCBlc3ltKTsKIAkJfQotCQllbHNlCi0JCQlrc3lt
c19pbml0KCooaW50ICopJmVuZCwgKChpbnQgKikmZW5kKSArIDEsIGVzeW0pOwogCX0KICNlbmRp
ZgogI2lmZGVmIEREQgpJbmRleDogYXJjaC9pMzg2L2kzODYvbXVsdGlib290LmMKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQpSQ1MgZmlsZTogL2N2c3Jvb3Qvc3JjL3N5cy9hcmNoL2kzODYvaTM4Ni9tdWx0aWJvb3QuYyx2
CnJldHJpZXZpbmcgcmV2aXNpb24gMS43CmRpZmYgLXUgLXAgLXIxLjcgbXVsdGlib290LmMKLS0t
IGFyY2gvaTM4Ni9pMzg2L211bHRpYm9vdC5jCTEyIE9jdCAyMDA2IDAxOjMwOjQyIC0wMDAwCTEu
NworKysgYXJjaC9pMzg2L2kzODYvbXVsdGlib290LmMJMjMgT2N0IDIwMDYgMTk6Mzk6MDMgLTAw
MDAKQEAgLTQ2LDYgKzQ2LDcgQEAgX19LRVJORUxfUkNTSUQoMCwgIiROZXRCU0Q6IG11bHRpYm9v
dC5jLAogI2luY2x1ZGUgPHN5cy9leGVjLmg+CiAjaW5jbHVkZSA8c3lzL2V4ZWNfZWxmLmg+CiAj
aW5jbHVkZSA8c3lzL29wdHN0ci5oPgorI2luY2x1ZGUgPHN5cy9rc3ltcy5oPgogCiAjaW5jbHVk
ZSA8bWFjaGluZS9ib290aW5mby5oPgogI2luY2x1ZGUgPG1hY2hpbmUvbXVsdGlib290Lmg+CkBA
IC01Nyw2ICs1OCwxOSBAQCBfX0tFUk5FTF9SQ1NJRCgwLCAiJE5ldEJTRDogbXVsdGlib290LmMs
CiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogLyoKKyAqIFN5bWJvbCBhbmQgc3RyaW5nIHRhYmxlIGZv
ciB0aGUgbG9hZGVkIGtlcm5lbC4KKyAqLworCitzdHJ1Y3QgbXVsdGlib290X3N5bWJvbHMgewor
CWNhZGRyX3QJCXNfc3ltc3RhcnQ7CisJc2l6ZV90CQlzX3N5bXNpemU7CisJY2FkZHJfdAkJc19z
dHJzdGFydDsKKwlzaXplX3QJCXNfc3Ryc2l6ZTsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwor
CisvKgogICogRXh0ZXJuYWwgdmFyaWFibGVzLiAgQWxsIG9mIHRoZW0sIHdpdGggdGhlIGV4Y2Vw
dGlvbiBvZiAnZW5kJywgbXVzdAogICogYmUgc2V0IGF0IHNvbWUgcG9pbnQgd2l0aGluIHRoaXMg
ZmlsZS4KICAqCkBAIC04NSwyMyArOTksNyBAQCBzdGF0aWMgc3RydWN0IG11bHRpYm9vdF9pbmZv
CU11bHRpYm9vdF9JCiBzdGF0aWMgYm9vbGVhbl90CQlNdWx0aWJvb3RfTG9hZGVyID0gRkFMU0U7
CiBzdGF0aWMgY2hhcgkJCU11bHRpYm9vdF9Mb2FkZXJfTmFtZVsyNTVdOwogc3RhdGljIHVpbnQ4
X3QJCQlNdWx0aWJvb3RfTW1hcFsxMDI0XTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qCi0g
KiBTaW1wbGlmaWVkIEVMRiBpbWFnZSB0aGF0IGNvbnRhaW5zIHRoZSBzeW1ib2wgdGFibGUgZm9y
IHRoZSBib290ZWQKLSAqIGtlcm5lbC4gIFN0dWNrIGFmdGVyIHRoZSBrZXJuZWwgaW1hZ2UgKGlu
IG1lbW9yeSkuCi0gKgotICogTXVzdCBiZSBsZXNzIHRoYW4gTVVMVElCT09UX1NZTVRBQl9TUEFD
RSBpbiBieXRlcy4gIE90aGVyd2lzZSwgdGhlcmUKLSAqIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGl0
IHdpbGwgbm90IG92ZXJ3cml0ZSBvdGhlciBzdHVmZiBwYXNzZWQgaW4gYnkKLSAqIHRoZSBib290
IGxvYWRlci4KLSAqLwotc3RydWN0IHN5bWJvbHNfaW1hZ2UgewotCUVsZjMyX0VoZHIJaV9laGRy
OwotCUVsZjMyX1NoZHIJaV9zaGRyWzRdOwotCWNoYXIJCWlfc3RydGFiWzMyXTsKLQljaGFyCQlp
X2RhdGE7IC8qIEFjdHVhbGx5IGxvbmdlci4gKi8KLX07CitzdGF0aWMgc3RydWN0IG11bHRpYm9v
dF9zeW1ib2xzCU11bHRpYm9vdF9TeW1ib2xzOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAt
MTE3LDcgKzExNSw2IEBAIHN0YXRpYyB2b2lkCXNldHVwX2NvbnNvbGUoc3RydWN0IG11bHRpYm8K
IHN0YXRpYyB2b2lkCXNldHVwX2hvd3RvKHN0cnVjdCBtdWx0aWJvb3RfaW5mbyAqKTsKIHN0YXRp
YyB2b2lkCXNldHVwX21lbW9yeShzdHJ1Y3QgbXVsdGlib290X2luZm8gKik7CiBzdGF0aWMgdm9p
ZAlzZXR1cF9tZW1tYXAoc3RydWN0IG11bHRpYm9vdF9pbmZvICopOwotc3RhdGljIHZvaWQJc2V0
dXBfc3ltcyhzdHJ1Y3QgbXVsdGlib290X2luZm8gKik7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwog
CkBAIC0yMDAsNyArMTk3LDYgQEAgbXVsdGlib290X3Bvc3RfcmVsb2Modm9pZCkKIAlzZXR1cF9i
aW9zZ2VvbShtaSk7CiAJc2V0dXBfYm9vdGRpc2sobWkpOwogCXNldHVwX21lbW1hcChtaSk7Ci0J
c2V0dXBfc3ltcyhtaSk7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjE0LDYgKzIxMCw3
IEBAIHZvaWQKIG11bHRpYm9vdF9wcmludF9pbmZvKHZvaWQpCiB7CiAJc3RydWN0IG11bHRpYm9v
dF9pbmZvICptaSA9ICZNdWx0aWJvb3RfSW5mbzsKKwlzdHJ1Y3QgbXVsdGlib290X3N5bWJvbHMg
Km1zID0gJk11bHRpYm9vdF9TeW1ib2xzOwogCiAJaWYgKCEgTXVsdGlib290X0xvYWRlcikKIAkJ
cmV0dXJuOwpAQCAtMjMxLDkgKzIyOCwxMyBAQCBtdWx0aWJvb3RfcHJpbnRfaW5mbyh2b2lkKQog
CQlwcmludGYoIm11bHRpYm9vdDogJXUgS0IgbG93ZXIgbWVtb3J5LCAldSBLQiB1cHBlciBtZW1v
cnlcbiIsCiAJCSAgICBtaS0+bWlfbWVtX2xvd2VyLCBtaS0+bWlfbWVtX3VwcGVyKTsKIAotCWlm
IChtaS0+bWlfZmxhZ3MgJiBNVUxUSUJPT1RfSU5GT19IQVNfRUxGX1NZTVMgJiYgZXN5bSA9PSAw
KQotCQlwcmludGYoIm11bHRpYm9vdDogU3ltYm9sIHRhYmxlIHRvbyBiaWc7IHRyeSBpbmNyZWFz
aW5nICIKLQkJICAgICJNVUxUSUJPT1RfU1lNVEFCX1NQQUNFXG4iKTsKKwlpZiAobWktPm1pX2Zs
YWdzICYgTVVMVElCT09UX0lORk9fSEFTX0VMRl9TWU1TKSB7CisJCUtBU1NFUlQoZXN5bSAhPSAw
KTsKKwkJcHJpbnRmKCJtdWx0aWJvb3Q6IFN5bWJvbCB0YWJsZSBhdCAlcCwgbGVuZ3RoICVkIGJ5
dGVzXG4iLAorCQkgICAgbXMtPnNfc3ltc3RhcnQsIG1zLT5zX3N5bXNpemUpOworCQlwcmludGYo
Im11bHRpYm9vdDogU3RyaW5nIHRhYmxlIGF0ICVwLCBsZW5ndGggJWQgYnl0ZXNcbiIsCisJCSAg
ICBtcy0+c19zdHJzdGFydCwgbXMtPnNfc3Ryc2l6ZSk7CisJfQogfQogCiAvKiAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0gKi8KQEAgLTI4MSw4ICsyODIsMTEgQEAgY29weV9zeW1zKHN0cnVjdCBtdWx0aWJvb3RfaW5m
byAqbWkpCiAjZGVmaW5lIFJFTE9DKHR5cGUsIHgpICgodHlwZSkoKHZhZGRyX3QpKHgpIC0gS0VS
TkJBU0UpKQogCWludCBpOwogCUVsZjMyX1NoZHIgKnN5bXRhYnAsICpzdHJ0YWJwOwotCXN0cnVj
dCBzeW1ib2xzX2ltYWdlICpzaTsKLQlleHRlcm4gdm9pZCBzdGFydCh2b2lkKTsKKwlzdHJ1Y3Qg
bXVsdGlib290X3N5bWJvbHMgKm1zOworCXNpemVfdCBzeW1zaXplLCBzdHJzaXplOworCXBhZGRy
X3Qgc3ltYWRkciwgc3RyYWRkcjsKKwlwYWRkcl90IHN5bXN0YXJ0LCBzdHJzdGFydDsKKwogCiAJ
LyoKIAkgKiBDaGVjayBpZiB0aGUgTXVsdGlib290IGluZm9ybWF0aW9uIGhlYWRlciBoYXMgc3lt
Ym9scyBvciBub3QuCkBAIC0yOTAsNiArMjk0LDggQEAgY29weV9zeW1zKHN0cnVjdCBtdWx0aWJv
b3RfaW5mbyAqbWkpCiAJaWYgKCEobWktPm1pX2ZsYWdzICYgTVVMVElCT09UX0lORk9fSEFTX0VM
Rl9TWU1TKSkKIAkJcmV0dXJuOwogCisJbXMgPSBSRUxPQyhzdHJ1Y3QgbXVsdGlib290X3N5bWJv
bHMgKiwgJk11bHRpYm9vdF9TeW1ib2xzKTsKKwogCS8qCiAJICogTG9jYXRlIGEgc3ltYm9sIHRh
YmxlIGFuZCBpdHMgbWF0Y2hpbmcgc3RyaW5nIHRhYmxlIGluIHRoZQogCSAqIHNlY3Rpb24gaGVh
ZGVycyBwYXNzZWQgaW4gYnkgdGhlIGJvb3QgbG9hZGVyLiAgU2V0ICdzeW10YWJwJwpAQCAtMzE4
LDk5ICszMjQsNjEgQEAgY29weV9zeW1zKHN0cnVjdCBtdWx0aWJvb3RfaW5mbyAqbWkpCiAJaWYg
KHN5bXRhYnAgPT0gTlVMTCB8fCBzdHJ0YWJwID09IE5VTEwpCiAJCXJldHVybjsKIAotCS8qCi0J
ICogQ2hlY2sgaWYgdGhlIHN5bWJvbCB0YWJsZSB3aWxsIGZpdCBhZnRlciB0aGUga2VybmVsIGlt
YWdlLgotCSAqIElmIG5vdCwgaWdub3JlIGl0OyB0aGVyZSBpcyBub3RoaW5nIGVsc2Ugd2UgY2Fu
IGRvIChleGNlcHQKLQkgKiBtYXliZSBjb3B5aW5nIG9ubHkgcGFydCBvZiB0aGUgdGFibGUuLi4g
YnV0IHRoYXQgY291bGQgYmUKLQkgKiBhcyB1c2VsZXNzIGFzIG5vdCBjb3B5aW5nIGl0KS4KLQkg
Ki8KLQlpZiAoc2l6ZW9mKHNpKSArIHN5bXRhYnAtPnNoX3NpemUgKyBzdHJ0YWJwLT5zaF9zaXpl
ID4KLQkgICAgTVVMVElCT09UX1NZTVRBQl9TUEFDRSkKLQkJcmV0dXJuOworCXN5bWFkZHIgPSBz
eW10YWJwLT5zaF9hZGRyOworCXN0cmFkZHIgPSBzdHJ0YWJwLT5zaF9hZGRyOworCXN5bXNpemUg
PSBzeW10YWJwLT5zaF9zaXplOworCXN0cnNpemUgPSBzdHJ0YWJwLT5zaF9zaXplOwogCiAJLyoK
LQkgKiBQcmVwYXJlIHNwYWNlIGFmdGVyIHRoZSBrZXJuZWwgdG8gY3JlYXRlIGEgc2ltcGxlIEVM
RiBpbWFnZQotCSAqIHRoYXQgaG9sZHMgdGhlIHN5bWJvbCB0YWJsZSBhbmQgdGhlIHN0cmluZyB0
YWJsZSBwcmV2aW91c2x5Ci0JICogZm91bmQuCisJICogQ29weSB0aGUgc3ltYm9sIGFuZCBzdHJp
bmcgdGFibGVzIGp1c3QgYWZ0ZXIgdGhlIGtlcm5lbCdzCisJICogZW5kIGFkZHJlc3MsIGluIHRo
aXMgb3JkZXIuICBPbmx5IHRoZSBjb250ZW50cyBvZiB0aGVzZSBFTEYKKwkgKiBzZWN0aW9ucyBh
cmUgY29waWVkOyBoZWFkZXJzIGFyZSBkaXNjYXJkZWQuICBlc3ltIGlzIGxhdGVyCisJICogdXBk
YXRlZCB0byBwb2ludCB0byB0aGUgbG93ZXN0ICJmcmVlIiBhZGRyZXNzIGFmdGVyIHRoZSB0YWJs
ZXMKKwkgKiBzbyB0aGF0IHRoZXkgYXJlIG1hcHBlZCBhcHByb3ByaWF0ZWx5IHdoZW4gZW5hYmxp
bmcgcGFnaW5nLgogCSAqCi0JICogVGhpcyBnb2VzIGp1c3QgYWZ0ZXIgdGhlIEJTUyBzZWN0aW9u
IHRvIGxldCB0aGUgYm9vdHN0cmFwaW5nCi0JICogY29kZSByZWxvY2F0ZSBpdCAodXAgdG8gZXN5
bSdzIHZhbHVlKS4KKwkgKiBXZSBuZWVkIHRvIGJlIGNhcmVmdWwgdG8gbm90IG92ZXJ3cml0ZSB2
YWxpZCBkYXRhIGRvaW5nIHRoZQorCSAqIGNvcGllcywgaGVuY2UgYWxsIHRoZSBkaWZmZXJlbnQg
Y2FzZXMgYmVsb3cuICBXZSBjYW4gYXNzdW1lCisJICogdGhhdCBpZiB0aGUgdGFibGVzIHN0YXJ0
IGJlZm9yZSB0aGUga2VybmVsJ3MgZW5kIGFkZHJlc3MsCisJICogdGhleSB3aWxsIG5vdCBncm93
IG92ZXIgdGhpcyBhZGRyZXNzLgogCSAqLwotCW1lbXNldChSRUxPQyhjaGFyICosICZlbmQpLCAw
LCBNVUxUSUJPT1RfU1lNVEFCX1NQQUNFKTsKLQlzaSA9IFJFTE9DKHN0cnVjdCBzeW1ib2xzX2lt
YWdlICosICZlbmQpOwotCi0JLyoKLQkgKiBDcmVhdGUgYSBtaW5pbWFsIEVMRiBoZWFkZXIgKGFz
IHJlcXVpcmVkIGJ5IGtzeW1zX2luaXQpLgotCSAqLwotCW1lbWNweShzaS0+aV9laGRyLmVfaWRl
bnQsIEVMRk1BRywgU0VMRk1BRyk7Ci0Jc2ktPmlfZWhkci5lX2lkZW50W0VJX0NMQVNTXSA9IEVM
RkNMQVNTMzI7Ci0Jc2ktPmlfZWhkci5lX2lkZW50W0VJX0RBVEFdID0gRUxGREFUQTJMU0I7Ci0J
c2ktPmlfZWhkci5lX2lkZW50W0VJX1ZFUlNJT05dID0gRVZfQ1VSUkVOVDsKLQlzaS0+aV9laGRy
LmVfdHlwZSA9IEVUX0VYRUM7Ci0Jc2ktPmlfZWhkci5lX21hY2hpbmUgPSBFTV8zODY7Ci0Jc2kt
PmlfZWhkci5lX3ZlcnNpb24gPSAxOwotCXNpLT5pX2VoZHIuZV9lbnRyeSA9IChFbGYzMl9BZGRy
KXN0YXJ0OwotCXNpLT5pX2VoZHIuZV9zaG9mZiA9IG9mZnNldG9mKHN0cnVjdCBzeW1ib2xzX2lt
YWdlLCBpX3NoZHIpOwotCXNpLT5pX2VoZHIuZV9laHNpemUgPSBzaXplb2Yoc2ktPmlfZWhkcik7
Ci0Jc2ktPmlfZWhkci5lX3NoZW50c2l6ZSA9IHNpemVvZihzaS0+aV9zaGRyWzBdKTsKLQlzaS0+
aV9laGRyLmVfc2hudW0gPSAyOwotCXNpLT5pX2VoZHIuZV9zaHN0cm5keCA9IFNITl9VTkRFRjsK
LQotCS8qCi0JICogRmlyc3Qgc2VjdGlvbjogZGVmYXVsdCBlbXB0eSBlbnRyeTsgY2xlYXJlZCBi
eSB0aGUgcHJldmlvdXMKLQkgKiBtZW1zZXQuICBFeHBsaWNpdGx5IHNldCBmaWVsZHMgdGhhdCB1
c2Ugc3ltYm9saWMgdmFsdWVzLgotCSAqLwotCXNpLT5pX3NoZHJbMF0uc2hfdHlwZSA9IFNIVF9O
VUxMOwotCXNpLT5pX3NoZHJbMF0uc2hfbGluayA9IFNITl9VTkRFRjsKLQotCS8qCi0JICogU2Vj
b25kIHNlY3Rpb246IHRoZSBzeW1ib2wgdGFibGUuCi0JICovCi0JbWVtY3B5KCZzaS0+aV9zaGRy
WzFdLCBzeW10YWJwLCBzaXplb2Yoc2ktPmlfc2hkclsxXSkpOwotCXNpLT5pX3NoZHJbMV0uc2hf
bmFtZSA9IDE7Ci0Jc2ktPmlfc2hkclsxXS5zaF9hZGRyID0gKHZhZGRyX3QpKCZlbmQpICsKLQkg
ICAgb2Zmc2V0b2Yoc3RydWN0IHN5bWJvbHNfaW1hZ2UsIGlfc2hkclsxXSk7Ci0Jc2ktPmlfc2hk
clsxXS5zaF9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc3ltYm9sc19pbWFnZSwgaV9kYXRhKTsK
LQlzaS0+aV9zaGRyWzFdLnNoX2xpbmsgPSAyOwotCi0JbWVtY3B5KFJFTE9DKHVpbnQ4X3QgKiwg
KHZhZGRyX3QpKCZlbmQpKSArIHNpLT5pX3NoZHJbMV0uc2hfb2Zmc2V0LAotCSAgICAodm9pZCAq
KXN5bXRhYnAtPnNoX2FkZHIsIHN5bXRhYnAtPnNoX3NpemUpOwotCi0JLyoKLQkgKiBUaGlyZCBz
ZWN0aW9uOiB0aGUgc3RyaW5ncyB0YWJsZS4KLQkgKi8KLQltZW1jcHkoJnNpLT5pX3NoZHJbMl0s
IHN0cnRhYnAsIHNpemVvZihzaS0+aV9zaGRyWzJdKSk7Ci0Jc2ktPmlfc2hkclsxXS5zaF9uYW1l
ID0gOTsKLQlzaS0+aV9zaGRyWzJdLnNoX2FkZHIgPSAodmFkZHJfdCkoJmVuZCkgKwotCSAgICBv
ZmZzZXRvZihzdHJ1Y3Qgc3ltYm9sc19pbWFnZSwgaV9zaGRyWzJdKTsKLQlzaS0+aV9zaGRyWzJd
LnNoX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzeW1ib2xzX2ltYWdlLCBpX2RhdGEpICsKLQkg
ICAgc2ktPmlfc2hkclsxXS5zaF9zaXplOwotCXNpLT5pX3NoZHJbMl0uc2hfbGluayA9IFNITl9V
TkRFRjsKLQotCW1lbWNweShSRUxPQyh1aW50OF90ICosICh2YWRkcl90KSgmZW5kKSkgKyBzaS0+
aV9zaGRyWzJdLnNoX29mZnNldCwKLQkgICAgKHZvaWQgKilzdHJ0YWJwLT5zaF9hZGRyLCBzdHJ0
YWJwLT5zaF9zaXplKTsKLQotCS8qCi0JICogRm91cnRoIHNlY3Rpb246IHRoZSBzZWN0aW9uIGhl
YWRlciBzdHJpbmdzIHRhYmxlIHVzZWQgYnkgdGhpcwotCSAqIG1pbmltYWwgRUxGIGltYWdlLgot
CSAqLwotCXNpLT5pX3NoZHJbM10uc2hfbmFtZSA9IDE3OwotCXNpLT5pX3NoZHJbM10uc2hfdHlw
ZSA9IFNIVF9TVFJUQUI7Ci0Jc2ktPmlfc2hkclszXS5zaF9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1
Y3Qgc3ltYm9sc19pbWFnZSwgaV9zdHJ0YWIpOwotCXNpLT5pX3NoZHJbM10uc2hfc2l6ZSA9IHNp
emVvZihzaS0+aV9zdHJ0YWIpOwotCXNpLT5pX3NoZHJbM10uc2hfYWRkcmFsaWduID0gMTsKLQlz
aS0+aV9zaGRyWzNdLnNoX2xpbmsgPSBTSE5fVU5ERUY7Ci0KLQlzdHJjcHkoJnNpLT5pX3N0cnRh
YlsxXSwgIi5zeW10YWIiKTsKLQlzdHJjcHkoJnNpLT5pX3N0cnRhYls5XSwgIi5zdHJ0YWIiKTsK
LQlzdHJjcHkoJnNpLT5pX3N0cnRhYlsxN10sICIuc2hzdHJ0YWIiKTsKKyAgICAgICAgaWYgKChw
YWRkcl90KXN5bXRhYnAgPCAocGFkZHJfdCkmZW5kIC0gS0VSTkJBU0UgJiYKKwkgICAgKHBhZGRy
X3Qpc3RydGFicCA8IChwYWRkcl90KSZlbmQgLSBLRVJOQkFTRSkgeworCQlzeW1zdGFydCA9IChw
YWRkcl90KSgodmFkZHJfdCkmZW5kIC0gS0VSTkJBU0UpOworCQlzdHJzdGFydCA9IHN5bXN0YXJ0
ICsgc3ltc2l6ZTsKKwkJbWVtY3B5KCh2b2lkICopc3ltc3RhcnQsICh2b2lkICopc3ltYWRkciwg
c3ltc2l6ZSk7CisJCW1lbWNweSgodm9pZCAqKXN0cnN0YXJ0LCAodm9pZCAqKXN0cmFkZHIsIHN0
cnNpemUpOworICAgICAgICB9IGVsc2UgaWYgKChwYWRkcl90KXN5bXRhYnAgPiAocGFkZHJfdCkm
ZW5kIC0gS0VSTkJBU0UgJiYKKwkgICAgICAgICAgIChwYWRkcl90KXN0cnRhYnAgPCAocGFkZHJf
dCkmZW5kIC0gS0VSTkJBU0UpIHsKKwkJc3ltc3RhcnQgPSAocGFkZHJfdCkoKHZhZGRyX3QpJmVu
ZCAtIEtFUk5CQVNFKTsKKwkJc3Ryc3RhcnQgPSBzeW1zdGFydCArIHN5bXNpemU7CisJCW1lbWNw
eSgodm9pZCAqKXN5bXN0YXJ0LCAodm9pZCAqKXN5bWFkZHIsIHN5bXNpemUpOworCQltZW1jcHko
KHZvaWQgKilzdHJzdGFydCwgKHZvaWQgKilzdHJhZGRyLCBzdHJzaXplKTsKKyAgICAgICAgfSBl
bHNlIGlmICgocGFkZHJfdClzeW10YWJwIDwgKHBhZGRyX3QpJmVuZCAtIEtFUk5CQVNFICYmCisJ
ICAgICAgICAgICAocGFkZHJfdClzdHJ0YWJwID4gKHBhZGRyX3QpJmVuZCAtIEtFUk5CQVNFKSB7
CisJCXN0cnN0YXJ0ID0gKHBhZGRyX3QpKCh2YWRkcl90KSZlbmQgLSBLRVJOQkFTRSk7CisJCXN5
bXN0YXJ0ID0gc3Ryc3RhcnQgKyBzdHJzaXplOworCQltZW1jcHkoKHZvaWQgKilzdHJzdGFydCwg
KHZvaWQgKilzdHJhZGRyLCBzdHJzaXplKTsKKwkJbWVtY3B5KCh2b2lkICopc3ltc3RhcnQsICh2
b2lkICopc3ltYWRkciwgc3ltc2l6ZSk7CisJfSBlbHNlIHsKKwkJLyogc3ltdGFicCBhbmQgc3Ry
dGFicCBhcmUgYm90aCBvdmVyIGVuZCAqLworCQlpZiAoKHBhZGRyX3Qpc3ltdGFicCA8IChwYWRk
cl90KXN0cnRhYnApIHsKKwkJCXN5bXN0YXJ0ID0gKHBhZGRyX3QpKCh2YWRkcl90KSZlbmQgLSBL
RVJOQkFTRSk7CisJCQlzdHJzdGFydCA9IHN5bXN0YXJ0ICsgc3ltc2l6ZTsKKwkJCW1lbWNweSgo
dm9pZCAqKXN5bXN0YXJ0LCAodm9pZCAqKXN5bWFkZHIsIHN5bXNpemUpOworCQkJbWVtY3B5KCh2
b2lkICopc3Ryc3RhcnQsICh2b2lkICopc3RyYWRkciwgc3Ryc2l6ZSk7CisJCX0gZWxzZSB7CisJ
CQlzdHJzdGFydCA9IChwYWRkcl90KSgodmFkZHJfdCkmZW5kIC0gS0VSTkJBU0UpOworCQkJc3lt
c3RhcnQgPSBzdHJzdGFydCArIHN0cnNpemU7CisJCQltZW1jcHkoKHZvaWQgKilzdHJzdGFydCwg
KHZvaWQgKilzdHJhZGRyLCBzdHJzaXplKTsKKwkJCW1lbWNweSgodm9pZCAqKXN5bXN0YXJ0LCAo
dm9pZCAqKXN5bWFkZHIsIHN5bXNpemUpOworCQl9CisJfQorCSpSRUxPQyhpbnQgKiwgJmVzeW0p
ID0gKGludCkoc3Ryc3RhcnQgKyBzdHJzaXplICsgS0VSTkJBU0UpOwogCi0JLyoKLQkgKiBTZXQg
dXAgdGhlICdlc3ltJyBnbG9iYWwgdmFyaWFibGUgdG8gcG9pbnQgdG8gdGhlIGVuZCBvZiB0aGUK
LQkgKiBtaW5pbWFsIEVMRiBpbWFnZSAoZW5kIG9mIHN5bWJvbHMpLgotCSAqLwotCSpSRUxPQyhp
bnQgKiwgJmVzeW0pID0gKCh2YWRkcl90KSZlbmQpICsgc2ktPmlfc2hkclsyXS5zaF9vZmZzZXQg
KwotCSAgICBzaS0+aV9zaGRyWzJdLnNoX3NpemU7CisJbXMtPnNfc3ltc3RhcnQgPSAoY2FkZHJf
dCkoc3ltc3RhcnQgKyBLRVJOQkFTRSk7CisJbXMtPnNfc3ltc2l6ZSAgPSBzeW1zaXplOworCW1z
LT5zX3N0cnN0YXJ0ID0gKGNhZGRyX3QpKHN0cnN0YXJ0ICsgS0VSTkJBU0UpOworCW1zLT5zX3N0
cnNpemUgID0gc3Ryc2l6ZTsKICN1bmRlZiBSRUxPQwogfQogCkBAIC03MDksMjQgKzY3NywyMSBA
QCBzZXR1cF9tZW1vcnkoc3RydWN0IG11bHRpYm9vdF9pbmZvICptaSkKIC8qIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LSAqLwogCiAvKgotICogU2V0cyB1cCB0aGUgc3ltdGFiIGJvb3RpbmZvIHN0cnVjdHVyZSB0byBk
ZXNjcmliZSB3aGVyZSB0aGUgc3ltYm9scwotICogYXJlIGlmIGNvcHlfc3ltcygpIGZvdW5kIHRo
ZW0uCisgKiBTZXRzIHVwIHRoZSBpbml0aWFsIGtlcm5lbCBzeW1ib2wgdGFibGUuICBSZXR1cm5z
IHRydWUgaWYgdGhpcyB3YXMKKyAqIHBhc3NlZCBpbiBieSBNdWx0aWJvb3Q7IGZhbHNlIG90aGVy
d2lzZS4KICAqLwotc3RhdGljIHZvaWQKLXNldHVwX3N5bXMoc3RydWN0IG11bHRpYm9vdF9pbmZv
ICptaSBfX3VudXNlZCkKK2Jvb2xlYW5fdAorbXVsdGlib290X2tzeW1zX2luaXQodm9pZCkKIHsK
LQlzdHJ1Y3QgYnRpbmZvX3N5bXRhYiBiaTsKLQlzdHJ1Y3Qgc3ltYm9sc19pbWFnZSAqc2k7Ci0K
LQlpZiAoZXN5bSA9PSAwKQotCQlyZXR1cm47CisJc3RydWN0IG11bHRpYm9vdF9pbmZvICptaSA9
ICZNdWx0aWJvb3RfSW5mbzsKKwlzdHJ1Y3QgbXVsdGlib290X3N5bWJvbHMgKm1zID0gJk11bHRp
Ym9vdF9TeW1ib2xzOwogCi0Jc2kgPSAoc3RydWN0IHN5bWJvbHNfaW1hZ2UgKikoJmVuZCk7CisJ
aWYgKG1pLT5taV9mbGFncyAmIE1VTFRJQk9PVF9JTkZPX0hBU19FTEZfU1lNUykgeworCQlLQVNT
RVJUKGVzeW0gIT0gMCk7CiAKLQliaS5zc3ltID0gKGludCkoJmVuZCkgLSBLRVJOQkFTRTsKLQli
aS5lc3ltID0gKGludCllc3ltIC0gS0VSTkJBU0U7Ci0JYmkubnN5bSA9IHNpLT5pX3NoZHJbMV0u
c2hfc2l6ZSAvIHNpemVvZihFbGYzMl9TeW0pOworCQlrc3ltc19pbml0X2V4cGxpY2l0KG1zLT5z
X3N5bXN0YXJ0LCBtcy0+c19zeW1zaXplLAorCQkgICAgbXMtPnNfc3Ryc3RhcnQsIG1zLT5zX3N0
cnNpemUpOworCX0KIAotCWJvb3RpbmZvX2FkZCgoc3RydWN0IGJ0aW5mb19jb21tb24gKikmYmks
IEJUSU5GT19TWU1UQUIsCi0JICAgIHNpemVvZihzdHJ1Y3QgYnRpbmZvX3N5bXRhYikpOworCXJl
dHVybiBtaS0+bWlfZmxhZ3MgJiBNVUxUSUJPT1RfSU5GT19IQVNfRUxGX1NZTVM7CiB9CkluZGV4
OiBhcmNoL2kzODYvaW5jbHVkZS9tdWx0aWJvb3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvY3Zz
cm9vdC9zcmMvc3lzL2FyY2gvaTM4Ni9pbmNsdWRlL211bHRpYm9vdC5oLHYKcmV0cmlldmluZyBy
ZXZpc2lvbiAxLjMKZGlmZiAtdSAtcCAtcjEuMyBtdWx0aWJvb3QuaAotLS0gYXJjaC9pMzg2L2lu
Y2x1ZGUvbXVsdGlib290LmgJNCBGZWIgMjAwNiAxMToyNDo0MiAtMDAwMAkxLjMKKysrIGFyY2gv
aTM4Ni9pbmNsdWRlL211bHRpYm9vdC5oCTIzIE9jdCAyMDA2IDE5OjM5OjAzIC0wMDAwCkBAIC00
NSwxNyArNDUsNiBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIC8qCi0gKiBTcGFjZSByZXNlcnZl
ZCBhZnRlciB0aGUga2VybmVsIGltYWdlIHRvIHN0aWNrIHRoZSBzeW1ib2wgdGFibGUuCi0gKiBU
aGUgYm9vdCBsb2FkZXIgd2lsbCBsZWF2ZSB0aGlzIG1lbW9yeSB1bnRvdWNoZWQgKGl0IHdpbGwg
YmUgdHJlYXRlZAotICogYXMgaWYgaXQgd2FzIHBhcnQgb2YgdGhlIEJTUyBzZWN0aW9uKS4KLSAq
LwotI2lmICFkZWZpbmVkKE1VTFRJQk9PVF9TWU1UQUJfU1BBQ0UpCi0jICBkZWZpbmUgTVVMVElC
T09UX1NZTVRBQl9TUEFDRSAxMDQ4NTc2Ci0jZW5kaWYKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0K
LS8qCiAgKiBNdWx0aWJvb3QgaGVhZGVyIHN0cnVjdHVyZS4KICAqLwogI2RlZmluZSBNVUxUSUJP
T1RfSEVBREVSX01BR0lDCQkweDFCQURCMDAyCkBAIC0yMDksNiArMTk4LDcgQEAgc3RydWN0IG11
bHRpYm9vdF9tbWFwIHsKIHZvaWQJCW11bHRpYm9vdF9wcmVfcmVsb2Moc3RydWN0IG11bHRpYm9v
dF9pbmZvICopOwogdm9pZAkJbXVsdGlib290X3Bvc3RfcmVsb2Modm9pZCk7CiB2b2lkCQltdWx0
aWJvb3RfcHJpbnRfaW5mbyh2b2lkKTsKK2Jvb2xlYW5fdAltdWx0aWJvb3Rfa3N5bXNfaW5pdCh2
b2lkKTsKICNlbmRpZiAvKiAhZGVmaW5lZChfTE9DT1JFKSAqLwogCiAvKiAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0g
Ki8K
------=_Part_126618_19888887.1161632799838--