Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 11 Mar 2010 12:47:02 -0800
From:      "Matthew Fleming" <matthew.fleming@isilon.com>
To:        "FreeBSD Hackers" <freebsd-hackers@freebsd.org>
Subject:   memguard(9) rewrite
Message-ID:  <06D5F9F6F655AD4C92E28B662F7F853E037DD783@seaxch09.desktop.isilon.com>

next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.

------_=_NextPart_001_01CAC15B.FD6C5005
Content-Type: text/plain;
	charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

This patch is against something close to stable/7.

We've found internally that memguard(9) isn't very usable for debugging;
it seems to run out of resources and do other unfriendly things.  This
patch is my first attempt to make it more usable.

The basic changes are:

 - take a lot more KVA if available
 - use vm_map_findspace() directly, with a moving cursor, so that KVA is
   not reused for a while.  When the cursor gets to the end of the map,
   start from the beginning which will re-use KVA.
 - free the physical pages and KVA on a memguard_free().

This requires no extra space for tracking, and no additional locks
beyond
the vm_map lock.  Since on amd64 the KVA reserved is generally more than
physical memory, there's also a limit on the physical memory used to
keep
memguard's page promotions from using up all the system resources.

I hope this is useful.  I'm working on code to add unused pages on each
side of the allocation to detect memory overflow and underflow, and also
some knobs to limit page promotions to larger allocations, and also
randomly guarding any call to malloc(9).

This code is going into our HEAD build today; in a few days I'll have
good system test results to know if I butchered anything.  I don't have
a good test rig for CURRENT, but I can produce a patch against CURRENT
that has no references to Isilon tags or isi_* filenames if desired.  Is
there anyone who wants to take such a patch and commit it?  Should I
send
this to freebsd-arch as well?

Thanks,
matthew

------_=_NextPart_001_01CAC15B.FD6C5005
Content-Type: application/octet-stream;
	name="memguard.diff"
Content-Transfer-Encoding: base64
Content-Description: memguard.diff
Content-Disposition: attachment;
	filename="memguard.diff"

SW5kZXg6IGNvbmYvZmlsZXMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gY29uZi9maWxlcwkocmV2aXNpb24gMTQz
NTUwKQorKysgY29uZi9maWxlcwkod29ya2luZyBjb3B5KQpAQCAtMjI2NiwzMSArMjI2NiwzMiBA
QCB1ZnMvdWZzL3Vmc19leHRhdHRyLmMJCW9wdGlvbmFsIGZmcwogdWZzL3Vmcy91ZnNfZ2pvdXJu
YWwuYwkJb3B0aW9uYWwgZmZzCiB1ZnMvdWZzL3Vmc19pbm9kZS5jCQlvcHRpb25hbCBmZnMKIHVm
cy91ZnMvdWZzX2xvb2t1cC5jCQlvcHRpb25hbCBmZnMKIHVmcy91ZnMvdWZzX3F1b3RhLmMJCW9w
dGlvbmFsIGZmcwogdWZzL3Vmcy91ZnNfdmZzb3BzLmMJCW9wdGlvbmFsIGZmcwogdWZzL3Vmcy91
ZnNfdm5vcHMuYwkJb3B0aW9uYWwgZmZzCiB2bS9kZWZhdWx0X3BhZ2VyLmMJCXN0YW5kYXJkCiB2
bS9kZXZpY2VfcGFnZXIuYwkJc3RhbmRhcmQKIHZtL3BoeXNfcGFnZXIuYwkJCXN0YW5kYXJkCiB2
bS9yZWR6b25lLmMJCQlvcHRpb25hbCBERUJVR19SRURaT05FCiB2bS9zZ19wYWdlci5jCQkJc3Rh
bmRhcmQKIHZtL3N3YXBfcGFnZXIuYwkJCXN0YW5kYXJkCiB2bS91bWFfY29yZS5jCQkJc3RhbmRh
cmQKIHZtL3VtYV9kYmcuYwkJCXN0YW5kYXJkCiB2bS92bV9jb250aWcuYwkJCXN0YW5kYXJkCi12
bS9tZW1ndWFyZC5jCQkJb3B0aW9uYWwgREVCVUdfTUVNR1VBUkQKKyN2bS9tZW1ndWFyZC5jCQkJ
b3B0aW9uYWwgREVCVUdfTUVNR1VBUkQKK3ZtL2lzaV9tZW1ndWFyZC5jCQlvcHRpb25hbCBERUJV
R19NRU1HVUFSRAogdm0vdm1fZmF1bHQuYwkJCXN0YW5kYXJkCiB2bS92bV9nbHVlLmMJCQlzdGFu
ZGFyZAogdm0vdm1faW5pdC5jCQkJc3RhbmRhcmQKIHZtL3ZtX2tlcm4uYwkJCXN0YW5kYXJkCiB2
bS92bV9tYXAuYwkJCXN0YW5kYXJkCiB2bS92bV9tZXRlci5jCQkJc3RhbmRhcmQKIHZtL3ZtX21t
YXAuYwkJCXN0YW5kYXJkCiB2bS92bV9vYmplY3QuYwkJCXN0YW5kYXJkCiB2bS92bV9wYWdlLmMJ
CQlzdGFuZGFyZAogdm0vdm1fcGFnZW91dC5jCQkJc3RhbmRhcmQKIHZtL3ZtX3BhZ2VyLmMJCQlz
dGFuZGFyZAogdm0vdm1fcGh5cy5jCQkJc3RhbmRhcmQKIHZtL3ZtX3Jlc2Vydi5jCQkJc3RhbmRh
cmQKIHZtL3ZtX3VuaXguYwkJCXN0YW5kYXJkCiB2bS92bV96ZXJvaWRsZS5jCQlzdGFuZGFyZApJ
bmRleDoga2Vybi9rZXJuX21hbGxvYy5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtlcm4va2Vybl9tYWxsb2Mu
YwkocmV2aXNpb24gMTQzNTUwKQorKysga2Vybi9rZXJuX21hbGxvYy5jCSh3b3JraW5nIGNvcHkp
CkBAIC02OCwzMyArNjgsMzEgQEAgX19GQlNESUQoIiRGcmVlQlNEJCIpOwogI2lmZGVmIE1BTExP
Q19MRUFLU19DSEVDSwogI2luY2x1ZGUgPHN5cy9pc2lfZm9ybWF0Lmg+CiAjZW5kaWYgLyogTUFM
TE9DX0xFQUtTX0NIRUNLICovCiAKICNpbmNsdWRlIDx2bS92bS5oPgogI2luY2x1ZGUgPHZtL3Bt
YXAuaD4KICNpbmNsdWRlIDx2bS92bV9wYXJhbS5oPgogI2luY2x1ZGUgPHZtL3ZtX2tlcm4uaD4K
ICNpbmNsdWRlIDx2bS92bV9leHRlcm4uaD4KICNpbmNsdWRlIDx2bS92bV9tYXAuaD4KICNpbmNs
dWRlIDx2bS92bV9wYWdlLmg+CiAjaW5jbHVkZSA8dm0vdW1hLmg+CiAjaW5jbHVkZSA8dm0vdW1h
X2ludC5oPgogI2luY2x1ZGUgPHZtL3VtYV9kYmcuaD4KIAotI2lmZGVmIERFQlVHX01FTUdVQVJE
CiAjaW5jbHVkZSA8dm0vbWVtZ3VhcmQuaD4KLSNlbmRpZgogI2lmZGVmIERFQlVHX1JFRFpPTkUK
ICNpbmNsdWRlIDx2bS9yZWR6b25lLmg+CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoSU5WQVJJQU5U
UykgJiYgZGVmaW5lZChfX2kzODZfXykKICNpbmNsdWRlIDxtYWNoaW5lL2NwdS5oPgogI2VuZGlm
CiAKICNpbmNsdWRlIDxkZGIvZGRiLmg+CiAKICNpZmRlZiBLRFRSQUNFX0hPT0tTCiAjaW5jbHVk
ZSA8c3lzL2R0cmFjZV9ic2QuaD4KIAogZHRyYWNlX21hbGxvY19wcm9iZV9mdW5jX3QJZHRyYWNl
X21hbGxvY19wcm9iZTsKICNlbmRpZgpAQCAtNjQyLDM0ICs2NDAsMzYgQEAgbWFsbG9jKHVuc2ln
bmVkIGxvbmcgc2l6ZSwgc3RydWN0IG1hbGxvYwogCWlmICgoZmxhZ3MgJiBNX05PV0FJVCkgJiYg
KG1hbGxvY19mYWlsdXJlX3JhdGUgIT0gMCkpIHsKIAkJYXRvbWljX2FkZF9pbnQoJm1hbGxvY19u
b3dhaXRfY291bnQsIDEpOwogCQlpZiAoKG1hbGxvY19ub3dhaXRfY291bnQgJSBtYWxsb2NfZmFp
bHVyZV9yYXRlKSA9PSAwKSB7CiAJCQlhdG9taWNfYWRkX2ludCgmbWFsbG9jX2ZhaWx1cmVfY291
bnQsIDEpOwogCQkJdF9tYWxsb2NfZmFpbCA9IHRpbWVfdXB0aW1lOwogCQkJcmV0dXJuIChOVUxM
KTsKIAkJfQogCX0KICNlbmRpZgogI2lmIDAJLyogWFhYIFByZXNlbnRseSBJc2lsb24gYWxsb3dz
IGJsb2NraW5nIGluIGludGVycnVwdCBjb250ZXh0LiAqLwogCWlmIChmbGFncyAmIE1fV0FJVE9L
KQogCQlLQVNTRVJUKGN1cnRocmVhZC0+dGRfaW50cl9uZXN0aW5nX2xldmVsID09IDAsCiAJCSAg
ICgibWFsbG9jKE1fV0FJVE9LKSBpbiBpbnRlcnJ1cHQgY29udGV4dCIpKTsKICNlbmRpZgogCi0j
aWZkZWYgREVCVUdfTUVNR1VBUkQKLQlpZiAobWVtZ3VhcmRfY21wKG10cCkpCi0JCXJldHVybiBt
ZW1ndWFyZF9hbGxvYyhzaXplLCBmbGFncyk7Ci0jZW5kaWYKKwlpZiAobWVtZ3VhcmRfY21wKG10
cCwgc2l6ZSkpIHsKKwkJdmEgPSBtZW1ndWFyZF9hbGxvYyhzaXplLCBmbGFncyk7CisJCWlmICh2
YSAhPSBOVUxMKQorCQkJcmV0dXJuIHZhOworCQkvKiBUaGlzIGlzIHVuZm9ydHVuYXRlIGJ1dCBz
aG91bGQgbm90IGJlIGZhdGFsLiAqLworCX0KIAogI2lmZGVmIERFQlVHX1JFRFpPTkUKIAlzaXpl
ID0gcmVkem9uZV9zaXplX250b3Ioc2l6ZSk7CiAjZW5kaWYKIAogI2lmZGVmIE1BTExPQ19MRUFL
U19DSEVDSwogCWlmIChtdHAtPmtzX2NoZWNrX2xlYWtzKSB7CiAJCWZvciAocGFkID0gNjQ7IHBh
ZCA8IHNpemUgJiYgcGFkIDwgUEFHRV9TSVpFOyBwYWQgPDw9IDEpCiAJCQk7CiAJCXNpemUgKz0g
cGFkOwogCX0gZWxzZQogCQlwYWQgPSAwOwogI2VuZGlmIC8qIE1BTExPQ19MRUFLU19DSEVDSyAq
LwogCiAJaWYgKHNpemUgPD0gS01FTV9aTUFYKSB7CkBAIC03NDMsMzYgKzc0MywzNCBAQCBtYWxs
b2ModW5zaWduZWQgbG9uZyBzaXplLCBzdHJ1Y3QgbWFsbG9jCiAgKglUaGlzIHJvdXRpbmUgbWF5
IG5vdCBibG9jay4KICAqLwogdm9pZAogZnJlZSh2b2lkICphZGRyLCBzdHJ1Y3QgbWFsbG9jX3R5
cGUgKm10cCkKIHsKIAl1bWFfc2xhYl90IHNsYWI7CiAJdV9sb25nIHNpemU7CiAjaWZkZWYgTUFM
TE9DX0xFQUtTX0NIRUNLCiAJc3RydWN0IGxlYWtfbm9kZSAqbm9kZTsKICNlbmRpZiAvKiBNQUxM
T0NfTEVBS1NfQ0hFQ0sgKi8KIAogCS8qIGZyZWUoTlVMTCwgLi4uKSBkb2VzIG5vdGhpbmcgKi8K
IAlpZiAoYWRkciA9PSBOVUxMKQogCQlyZXR1cm47CiAKLSNpZmRlZiBERUJVR19NRU1HVUFSRAot
CWlmIChtZW1ndWFyZF9jbXAobXRwKSkgeworCWlmIChpc19tZW1ndWFyZF9hZGRyKGFkZHIpKSB7
CiAJCW1lbWd1YXJkX2ZyZWUoYWRkcik7CiAJCXJldHVybjsKIAl9Ci0jZW5kaWYKIAogI2lmZGVm
IERFQlVHX1JFRFpPTkUKIAlyZWR6b25lX2NoZWNrKGFkZHIpOwogCWFkZHIgPSByZWR6b25lX2Fk
ZHJfbnRvcihhZGRyKTsKICNlbmRpZgogCiAJc2l6ZSA9IDA7CiAKICNpZmRlZiBNQUxMT0NfTEVB
S1NfQ0hFQ0sKIAlpZiAobXRwLT5rc19jaGVja19sZWFrcykgewogCQlub2RlID0gKChzdHJ1Y3Qg
bGVha19ub2RlICoqKWFkZHIpWy0xXTsKIAkJbXR4X2xvY2soJmxlYWtfbXR4KTsKIAkJTElTVF9S
RU1PVkUobm9kZSwgbGVha19saW5rKTsKIAkJbXR4X3VubG9jaygmbGVha19tdHgpOwogCQljYWxs
X3N0YWNrX2NsZWFuKCZub2RlLT5zdGFjayk7CkBAIC04MjEsNzUgKzgxOSw3MCBAQCBmcmVlKHZv
aWQgKmFkZHIsIHN0cnVjdCBtYWxsb2NfdHlwZSAqbXRwCiB2b2lkICoKIHJlYWxsb2Modm9pZCAq
YWRkciwgdW5zaWduZWQgbG9uZyBzaXplLCBzdHJ1Y3QgbWFsbG9jX3R5cGUgKm10cCwgaW50IGZs
YWdzKQogewogCXVtYV9zbGFiX3Qgc2xhYjsKIAl1bnNpZ25lZCBsb25nIGFsbG9jOwogCXZvaWQg
Km5ld2FkZHI7CiAKIAkvKiByZWFsbG9jKE5VTEwsIC4uLikgaXMgZXF1aXZhbGVudCB0byBtYWxs
b2MoLi4uKSAqLwogCWlmIChhZGRyID09IE5VTEwpCiAJCXJldHVybiAobWFsbG9jKHNpemUsIG10
cCwgZmxhZ3MpKTsKIAogCS8qCiAJICogWFhYOiBTaG91bGQgcmVwb3J0IGZyZWUgb2Ygb2xkIG1l
bW9yeSBhbmQgYWxsb2Mgb2YgbmV3IG1lbW9yeSB0bwogCSAqIHBlci1DUFUgc3RhdHMuCiAJICov
Ci0KLSNpZmRlZiBERUJVR19NRU1HVUFSRAotaWYgKG1lbWd1YXJkX2NtcChtdHApKSB7Ci0Jc2xh
YiA9IE5VTEw7Ci0JYWxsb2MgPSBzaXplOwotfSBlbHNlIHsKLSNlbmRpZgotCisJaWYgKGlzX21l
bWd1YXJkX2FkZHIoYWRkcikpIHsKKwkJc2xhYiA9IE5VTEw7CisJCWFsbG9jID0gc2l6ZTsKKwkJ
Z290byByZW1hbGxvYzsKKwl9CiAjaWZkZWYgREVCVUdfUkVEWk9ORQogCXNsYWIgPSBOVUxMOwog
CWFsbG9jID0gcmVkem9uZV9nZXRfc2l6ZShhZGRyKTsKLSNlbHNlCisJZ290byByZW1hbGxvYzsK
KyNlbmRpZiAvKiAhREVCVUdfUkVEWk9ORSAqLworCiAjaWZkZWYgTUFMTE9DX0xFQUtTX0NIRUNL
CiAJaWYgKG10cC0+a3NfY2hlY2tfbGVha3MpCiAJCXNsYWIgPSB2dG9zbGFiKCgodm1fb2Zmc2V0
X3QgKilhZGRyKVstMV0gJiB+KFVNQV9TTEFCX01BU0spKTsKIAllbHNlCiAjZW5kaWYgLyogTUFM
TE9DX0xFQUtTX0NIRUNLICovCiAJCXNsYWIgPSB2dG9zbGFiKCh2bV9vZmZzZXRfdClhZGRyICYg
fihVTUFfU0xBQl9NQVNLKSk7CiAKIAkvKiBTYW5pdHkgY2hlY2sgKi8KIAlLQVNTRVJUKHNsYWIg
IT0gTlVMTCwKIAkgICAgKCJyZWFsbG9jOiBhZGRyZXNzICVwIG91dCBvZiByYW5nZSIsICh2b2lk
ICopYWRkcikpOwogCiAJLyogR2V0IHRoZSBzaXplIG9mIHRoZSBvcmlnaW5hbCBibG9jayAqLwog
CWlmICghKHNsYWItPnVzX2ZsYWdzICYgVU1BX1NMQUJfTUFMTE9DKSkKIAkJYWxsb2MgPSBzbGFi
LT51c19rZWctPnVrX3NpemU7CiAJZWxzZQogCQlhbGxvYyA9IHNsYWItPnVzX3NpemU7CiAKICNp
ZmRlZiBNQUxMT0NfTEVBS1NfQ0hFQ0sKIAlpZiAobXRwLT5rc19jaGVja19sZWFrcykKIAkJLyoq
IEFkanVzdCB0aGUgYWxsb2Mgc2l6ZSBieSBzdWJ0cmFjdGluZyB0aGUgc2l6ZSBvZiB0aGUgcGFk
LiAqLwogCQlhbGxvYyAtPSAoKGNhZGRyX3QpYWRkciAtICgoY2FkZHJfdCAqKWFkZHIpWy0xXSk7
CiAjZW5kaWYgLyogTUFMTE9DX0xFQUtTX0NIRUNLICovCiAKIAkvKiBSZXVzZSB0aGUgb3JpZ2lu
YWwgYmxvY2sgaWYgYXBwcm9wcmlhdGUgKi8KIAlpZiAoc2l6ZSA8PSBhbGxvYwogCSAgICAmJiAo
c2l6ZSA+IChhbGxvYyA+PiBSRUFMTE9DX0ZSQUNUSU9OKSB8fCBhbGxvYyA9PSBNSU5BTExPQ1NJ
WkUpKQogCQlyZXR1cm4gKGFkZHIpOwotI2VuZGlmIC8qICFERUJVR19SRURaT05FICovCi0KLSNp
ZmRlZiBERUJVR19NRU1HVUFSRAotfQotI2VuZGlmCiAKK3JlbWFsbG9jOgogCS8qIEFsbG9jYXRl
IGEgbmV3LCBiaWdnZXIgKG9yIHNtYWxsZXIpIGJsb2NrICovCiAJaWYgKChuZXdhZGRyID0gbWFs
bG9jKHNpemUsIG10cCwgZmxhZ3MpKSA9PSBOVUxMKQogCQlyZXR1cm4gKE5VTEwpOwogCiAJLyog
Q29weSBvdmVyIG9yaWdpbmFsIGNvbnRlbnRzICovCiAJYmNvcHkoYWRkciwgbmV3YWRkciwgbWlu
KHNpemUsIGFsbG9jKSk7CiAJZnJlZShhZGRyLCBtdHApOwogCXJldHVybiAobmV3YWRkcik7CiB9
CiAKIC8qCiAgKglyZWFsbG9jZjogc2FtZSBhcyByZWFsbG9jKCkgYnV0IGZyZWUgbWVtb3J5IG9u
IGZhaWx1cmUuCiAgKi8KIHZvaWQgKgogcmVhbGxvY2Yodm9pZCAqYWRkciwgdW5zaWduZWQgbG9u
ZyBzaXplLCBzdHJ1Y3QgbWFsbG9jX3R5cGUgKm10cCwgaW50IGZsYWdzKQpAQCAtOTAwLDMxICs4
OTMsMzEgQEAgcmVhbGxvY2Yodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLAogCQlmcmVl
KGFkZHIsIG10cCk7CiAJcmV0dXJuIChtZW0pOwogfQogCiAvKiBYWFhSU1MgdHVybiBzb21lIGV4
dHJhIGNoZWNrcyBvbiBpZiB3ZSdyZSBzZWVpbmcgc2NyaWJibGVycyAqLwogI2RlZmluZSBTQ1JJ
QkJMRVJfQ0hFQ0tTIDEKIAogLyoKICAqIEluaXRpYWxpemUgdGhlIGtlcm5lbCBtZW1vcnkgYWxs
b2NhdG9yCiAgKi8KIC8qIEFSR1NVU0VEKi8KIHN0YXRpYyB2b2lkCiBrbWVtaW5pdCh2b2lkICpk
dW1teSkKIHsKIAl1X2ludDhfdCBpbmR4OwotCXVfbG9uZyBtZW1fc2l6ZTsKKwl1X2xvbmcgbWVt
X3NpemUsIHRtcDsKIAlpbnQgaTsKICAKIAltdHhfaW5pdCgmbWFsbG9jX210eCwgIm1hbGxvYyIs
IE5VTEwsIE1UWF9ERUYpOwogCW10eF9pbml0KCZtYWxsb2NfcGlnc19tdHgsICJtYWxsb2NfcGln
cyIsIE5VTEwsIE1UWF9ERUYpOwogI2lmZGVmIE1BTExPQ19MRUFLU19DSEVDSwogCW10eF9pbml0
KCZsZWFrX210eCwgIm1hbGxvY19sZWFrcyIsIE5VTEwsIE1UWF9ERUYpOwogI2VuZGlmIC8qIE1B
TExPQ19MRUFLU19DSEVDSyAqLwogCiAJLyoKIAkgKiBUcnkgdG8gYXV0by10dW5lIHRoZSBrZXJu
ZWwgbWVtb3J5IHNpemUsIHNvIHRoYXQgaXQgaXMKIAkgKiBtb3JlIGFwcGxpY2FibGUgZm9yIGEg
d2lkZXIgcmFuZ2Ugb2YgbWFjaGluZSBzaXplcy4KIAkgKiBPbiBhbiBYODYsIGEgVk1fS01FTV9T
SVpFX1NDQUxFIHZhbHVlIG9mIDQgaXMgZ29vZCwgd2hpbGUKIAkgKiBhIFZNX0tNRU1fU0laRSBv
ZiAxMk1CIGlzIGEgZmFpciBjb21wcm9taXNlLiAgVGhlCiAJICogVk1fS01FTV9TSVpFX01BWCBp
cyBkZXBlbmRlbnQgb24gdGhlIG1heGltdW0gS1ZBIHNwYWNlCiAJICogYXZhaWxhYmxlLCBhbmQg
b24gYW4gWDg2IHdpdGggYSB0b3RhbCBLVkEgc3BhY2Ugb2YgMjU2TUIsCkBAIC05NjgsNDkgKzk2
MSw0MCBAQCBrbWVtaW5pdCh2b2lkICpkdW1teSkKIAogCS8qCiAJICogTGltaXQga21lbSB2aXJ0
dWFsIHNpemUgdG8gdHdpY2UgdGhlIHBoeXNpY2FsIG1lbW9yeS4KIAkgKiBUaGlzIGFsbG93cyBm
b3Iga21lbSBtYXAgc3BhcnNlbmVzcywgYnV0IGxpbWl0cyB0aGUgc2l6ZQogCSAqIHRvIHNvbWV0
aGluZyBzYW5lLiBCZSBjYXJlZnVsIHRvIG5vdCBvdmVyZmxvdyB0aGUgMzJiaXQKIAkgKiBpbnRz
IHdoaWxlIGRvaW5nIHRoZSBjaGVjay4KIAkgKi8KIAlpZiAoKCh2bV9rbWVtX3NpemUgLyAyKSAv
IFBBR0VfU0laRSkgPiB2bV9jbnQudl9wYWdlX2NvdW50KQogCQl2bV9rbWVtX3NpemUgPSAyICog
dm1fY250LnZfcGFnZV9jb3VudCAqIFBBR0VfU0laRTsKIAogCS8qCiAJICogVHVuZSBzZXR0aW5n
cyBiYXNlZCBvbiB0aGUga21lbSBtYXAncyBzaXplIGF0IHRoaXMgdGltZS4KIAkgKi8KIAlpbml0
X3BhcmFtMyh2bV9rbWVtX3NpemUgLyBQQUdFX1NJWkUpOwogCisJdG1wID0gbWVtZ3VhcmRfZnVk
Z2Uodm1fa21lbV9zaXplLCB2bV9rbWVtX3NpemVfbWF4KTsKIAlrbWVtX21hcCA9IGttZW1fc3Vi
YWxsb2Moa2VybmVsX21hcCwgJmttZW1iYXNlLCAma21lbWxpbWl0LAotCSAgICB2bV9rbWVtX3Np
emUsIFRSVUUpOworCSAgICB0bXAsIFRSVUUpOwogCWttZW1fbWFwLT5zeXN0ZW1fbWFwID0gMTsK
LQotI2lmZGVmIERFQlVHX01FTUdVQVJECiAJLyoKIAkgKiBJbml0aWFsaXplIE1lbUd1YXJkIGlm
IHN1cHBvcnQgY29tcGlsZWQgaW4uICBNZW1HdWFyZCBpcyBhCiAJICogcmVwbGFjZW1lbnQgYWxs
b2NhdG9yIHVzZWQgZm9yIGRldGVjdGluZyB0YW1wZXItYWZ0ZXItZnJlZQogCSAqIHNjZW5hcmlv
cyBhcyB0aGV5IG9jY3VyLiAgSXQgaXMgb25seSB1c2VkIGZvciBkZWJ1Z2dpbmcuCiAJICovCi0J
dm1fbWVtZ3VhcmRfZGl2aXNvciA9IDEwOwotCVRVTkFCTEVfSU5UX0ZFVENIKCJ2bS5tZW1ndWFy
ZC5kaXZpc29yIiwgJnZtX21lbWd1YXJkX2Rpdmlzb3IpOwotCi0JLyogUGljayBhIGNvbnNlcnZh
dGl2ZSB2YWx1ZSBpZiBwcm92aWRlZCB2YWx1ZSBzdWNrcy4gKi8KLQlpZiAoKHZtX21lbWd1YXJk
X2Rpdmlzb3IgPD0gMCkgfHwKLQkgICAgKCh2bV9rbWVtX3NpemUgLyB2bV9tZW1ndWFyZF9kaXZp
c29yKSA9PSAwKSkKLQkJdm1fbWVtZ3VhcmRfZGl2aXNvciA9IDEwOwotCW1lbWd1YXJkX2luaXQo
a21lbV9tYXAsIHZtX2ttZW1fc2l6ZSAvIHZtX21lbWd1YXJkX2Rpdmlzb3IpOwotI2VuZGlmCisJ
bWVtZ3VhcmRfaW5pdChrbWVtX21hcCk7CiAKIAl1bWFfc3RhcnR1cDIoKTsKIAogCW10X3pvbmUg
PSB1bWFfemNyZWF0ZSgibXRfem9uZSIsIHNpemVvZihzdHJ1Y3QgbWFsbG9jX3R5cGVfaW50ZXJu
YWwpLAogI2lmIGRlZmluZWQoSU5WQVJJQU5UUykgfHwgZGVmaW5lZChTQ1JJQkJMRVJfQ0hFQ0tT
KQogCSAgICBtdHJhc2hfY3RvciwgbXRyYXNoX2R0b3IsIG10cmFzaF9pbml0LCBtdHJhc2hfZmlu
aSwKICNlbHNlCiAJICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCiAjZW5kaWYKIAkgICAgVU1B
X0FMSUdOX1BUUiwgVU1BX1pPTkVfTUFMTE9DCiAjaWZkZWYgU0NSSUJCTEVSX0NIRUNLUwogCSAg
ICB8IFVNQV9aT05FX01BWEJVQ0tFVAogI2VuZGlmCiAJICAgICk7CiAJZm9yIChpID0gMCwgaW5k
eCA9IDA7IGttZW16b25lc1tpbmR4XS5rel9zaXplICE9IDA7IGluZHgrKykgewpJbmRleDogdm0v
dm1fa2Vybi5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIHZtL3ZtX2tlcm4uYwkocmV2aXNpb24gMTQzNTUwKQor
Kysgdm0vdm1fa2Vybi5jCSh3b3JraW5nIGNvcHkpCkBAIC0yOTAsMzUgKzI5MCwzMiBAQCBpc2lf
a21lbV9tYWxsb2NfZmFpbGVkKHZtX21hcF90IG1hcCwgdm1fCiAgKiAJKGttZW1fb2JqZWN0KS4g
IFRoaXMsIGNvbWJpbmVkIHdpdGggdGhlIGZhY3QgdGhhdCBvbmx5IG1hbGxvYyB1c2VzCiAgKiAJ
dGhpcyByb3V0aW5lLCBlbnN1cmVzIHRoYXQgd2Ugd2lsbCBuZXZlciBibG9jayBpbiBtYXAgb3Ig
b2JqZWN0IHdhaXRzLgogICoKICAqIAlXZSBkb24ndCB3b3JyeSBhYm91dCBleHBhbmRpbmcgdGhl
IG1hcCAoYWRkaW5nIGVudHJpZXMpIHNpbmNlIGVudHJpZXMKICAqIAlmb3Igd2lyZWQgbWFwcyBh
cmUgc3RhdGljYWxseSBhbGxvY2F0ZWQuCiAgKgogICoJYG1hcCcgaXMgT05MWSBhbGxvd2VkIHRv
IGJlIGttZW1fbWFwIG9yIG9uZSBvZiB0aGUgbWJ1ZiBzdWJtYXBzIHRvCiAgKgl3aGljaCB3ZSBu
ZXZlciBmcmVlLgogICovCiB2bV9vZmZzZXRfdAoga21lbV9tYWxsb2MobWFwLCBzaXplLCBmbGFn
cykKIAl2bV9tYXBfdCBtYXA7CiAJdm1fc2l6ZV90IHNpemU7CiAJaW50IGZsYWdzOwogewotCXZt
X29mZnNldF90IG9mZnNldCwgaTsKLQl2bV9tYXBfZW50cnlfdCBlbnRyeTsKIAl2bV9vZmZzZXRf
dCBhZGRyOwotCXZtX3BhZ2VfdCBtOwotCWludCBwZmxhZ3M7CisJaW50IGksIHJ2OwogCiAJc2l6
ZSA9IHJvdW5kX3BhZ2Uoc2l6ZSk7CiAJYWRkciA9IHZtX21hcF9taW4obWFwKTsKIAogCS8qCiAJ
ICogTG9jYXRlIHN1ZmZpY2llbnQgc3BhY2UgaW4gdGhlIG1hcC4gIFRoaXMgd2lsbCBnaXZlIHVz
IHRoZSBmaW5hbAogCSAqIHZpcnR1YWwgYWRkcmVzcyBmb3IgdGhlIG5ldyBtZW1vcnksIGFuZCB0
aHVzIHdpbGwgdGVsbCB1cyB0aGUKIAkgKiBvZmZzZXQgd2l0aGluIHRoZSBrZXJuZWwgbWFwLgog
CSAqLwogCXZtX21hcF9sb2NrKG1hcCk7CiAJaWYgKHZtX21hcF9maW5kc3BhY2UobWFwLCB2bV9t
YXBfbWluKG1hcCksIHNpemUsICZhZGRyKSkgewogCQl2bV9tYXBfdW5sb2NrKG1hcCk7CiAKICAg
ICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgTV9OT1dBSVQpID09IDApIHsKIAkJCWZvciAoaSA9
IDA7IGkgPCA4OyBpKyspIHsKQEAgLTMzOCwzMCArMzM1LDU3IEBAIGttZW1fbWFsbG9jKG1hcCwg
c2l6ZSwgZmxhZ3MpCiAJCQkJcGFuaWNfc3RhcnQoImttZW1fbWFsbG9jKCVsZCk6ICVzIHRvbyBz
bWFsbC4iLAogCQkJCSAgICAobG9uZylzaXplLCBtYXAgPT0ga21lbV9tYXAgPyAia21lbV9tYXAi
IDoKIAkJCQkgICAgIm1idWYgc3BhY2UiKTsKIAkJCQlpZiAobV9leGhhdXN0ZWRfY2IpCiAJCQkJ
CW1fZXhoYXVzdGVkX2NiKCk7CiAJCQkJZWxzZQogCQkJCQlwcmludF9tYnVmX3VzYWdlKCk7CiAJ
CQkJcHJpbnRfYWxsb2NfcGlncygpOwogCQkJCXBhbmljX2ZpbmlzaCgpOwogCQkJfQogCQl9IGVs
c2UgewogCQkJaXNpX2ttZW1fbWFsbG9jX2ZhaWxlZChtYXAsIHNpemUpOwogCQkJcmV0dXJuICgw
KTsKIAkJfQogCX0KKworCS8qIGJlZ2luIElzaWxvbiAqLworCXJ2ID0ga21lbV9iYWNrKG1hcCwg
YWRkciwgc2l6ZSwgZmxhZ3MpOworCS8qIGVuZCBJc2lsb24gKi8KKwl2bV9tYXBfdW5sb2NrKG1h
cCk7CisKKwlyZXR1cm4gKHJ2ID09IEtFUk5fU1VDQ0VTUyA/IGFkZHIgOiAodm1fb2Zmc2V0X3Qp
TlVMTCk7Cit9CisKKy8qCisgKiBJc2lsb246IHNwbGl0IHVwIHRoZSB3b3JrIG9mIGttZW1fbWFs
bG9jIGludG8gb25lIHJvdXRpbmUgdGhhdAorICogZmluZHMgdGhlIGFkZHJlc3MgdG8gdXNlLCBh
bmQgYW5vdGhlciB0byBnZXQgcGFnZXMgZm9yIHRoZQorICogYWRkcmVzc2VzLgorICovCitpbnQK
K2ttZW1fYmFjayh2bV9tYXBfdCBtYXAsIHZtX29mZnNldF90IGFkZHIsIHZtX3NpemVfdCBzaXpl
LCBpbnQgZmxhZ3MpCit7CisJdm1fb2Zmc2V0X3Qgb2Zmc2V0LCBpOworCXZtX21hcF9lbnRyeV90
IGVudHJ5OworCXZtX3BhZ2VfdCBtOworCWludCBwZmxhZ3M7CisKKwkvKgorCSAqIFhYWCB0aGUg
bWFwIG11c3QgYmUgbG9ja2VkIGZvciB3cml0ZSBvbiBlbnRyeSwgYnV0IHRoZXJlJ3MKKwkgKiBu
byB3YXkgdG8gYXNzZXJ0IHRoYXQuCisJICovCisKIAlvZmZzZXQgPSBhZGRyIC0gVk1fTUlOX0tF
Uk5FTF9BRERSRVNTOwogCXZtX29iamVjdF9yZWZlcmVuY2Uoa21lbV9vYmplY3QpOwogCXZtX21h
cF9pbnNlcnQobWFwLCBrbWVtX29iamVjdCwgb2Zmc2V0LCBhZGRyLCBhZGRyICsgc2l6ZSwKIAkJ
Vk1fUFJPVF9BTEwsIFZNX1BST1RfQUxMLCAwKTsKIAogCWlmICgoZmxhZ3MgJiAoTV9OT1dBSVR8
TV9VU0VfUkVTRVJWRSkpID09IE1fTk9XQUlUKQogCQlwZmxhZ3MgPSBWTV9BTExPQ19JTlRFUlJV
UFQgfCBWTV9BTExPQ19XSVJFRDsKIAllbHNlCiAJCXBmbGFncyA9IFZNX0FMTE9DX1NZU1RFTSB8
IFZNX0FMTE9DX1dJUkVEOwogCiAJaWYgKGZsYWdzICYgTV9aRVJPKQogCQlwZmxhZ3MgfD0gVk1f
QUxMT0NfWkVSTzsKIAlpZiAoZmxhZ3MgJiBNX05PRFVNUCkKIAkJcGZsYWdzIHw9IFZNX0FMTE9D
X05PRFVNUDsKIApAQCAtMzkwLDMyICs0MTQsMzEgQEAgcmV0cnk6CiAJCQkgKiBUaGV5IGFyZSBh
bHJlYWR5IG1hcmtlZCBidXN5LiAgQ2FsbGluZwogCQkJICogdm1fbWFwX2RlbGV0ZSBiZWZvcmUg
dGhlIHBhZ2VzIGhhcyBiZWVuIGZyZWVkIG9yCiAJCQkgKiB1bmJ1c2llZCB3aWxsIGNhdXNlIGEg
ZGVhZGxvY2suCiAJCQkgKi8KIAkJCXdoaWxlIChpICE9IDApIHsKIAkJCQlpIC09IFBBR0VfU0la
RTsKIAkJCQltID0gdm1fcGFnZV9sb29rdXAoa21lbV9vYmplY3QsCiAJCQkJCQkgICBPRkZfVE9f
SURYKG9mZnNldCArIGkpKTsKIAkJCQl2bV9wYWdlX2xvY2tfcXVldWVzKCk7CiAJCQkJdm1fcGFn
ZV91bndpcmUobSwgMCk7CiAJCQkJdm1fcGFnZV9mcmVlKG0pOwogCQkJCXZtX3BhZ2VfdW5sb2Nr
X3F1ZXVlcygpOwogCQkJfQogCQkJVk1fT0JKRUNUX1VOTE9DSyhrbWVtX29iamVjdCk7CiAJCQl2
bV9tYXBfZGVsZXRlKG1hcCwgYWRkciwgYWRkciArIHNpemUpOwotCQkJdm1fbWFwX3VubG9jayht
YXApOwotCQkJcmV0dXJuICgwKTsKKwkJCXJldHVybiAoS0VSTl9OT19TUEFDRSk7CiAJCX0KIAkJ
aWYgKGZsYWdzICYgTV9aRVJPICYmIChtLT5mbGFncyAmIFBHX1pFUk8pID09IDApCiAJCQlwbWFw
X3plcm9fcGFnZShtKTsKIAkJbS0+dmFsaWQgPSBWTV9QQUdFX0JJVFNfQUxMOwogCQlLQVNTRVJU
KChtLT5mbGFncyAmIFBHX1VOTUFOQUdFRCkgIT0gMCwKIAkJICAgICgia21lbV9tYWxsb2M6IHBh
Z2UgJXAgaXMgbWFuYWdlZCIsIG0pKTsKIAl9CiAJVk1fT0JKRUNUX1VOTE9DSyhrbWVtX29iamVj
dCk7CiAKIAkvKgogCSAqIE1hcmsgbWFwIGVudHJ5IGFzIG5vbi1wYWdlYWJsZS4gQXNzZXJ0OiB2
bV9tYXBfaW5zZXJ0KCkgd2lsbCBuZXZlcgogCSAqIGJlIGFibGUgdG8gZXh0ZW5kIHRoZSBwcmV2
aW91cyBlbnRyeSBzbyB0aGVyZSB3aWxsIGJlIGEgbmV3IGVudHJ5CiAJICogZXhhY3RseSBjb3Jy
ZXNwb25kaW5nIHRvIHRoaXMgYWRkcmVzcyByYW5nZSBhbmQgaXQgd2lsbCBoYXZlCiAJICogd2ly
ZWRfY291bnQgPT0gMC4KIAkgKi8KQEAgLTQzNCwzMyArNDU3LDMxIEBAIHJldHJ5OgogCiAJLyoK
IAkgKiBMb29wIHRocnUgcGFnZXMsIGVudGVyaW5nIHRoZW0gaW4gdGhlIHBtYXAuCiAJICovCiAJ
Vk1fT0JKRUNUX0xPQ0soa21lbV9vYmplY3QpOwogCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpICs9
IFBBR0VfU0laRSkgewogCQltID0gdm1fcGFnZV9sb29rdXAoa21lbV9vYmplY3QsIE9GRl9UT19J
RFgob2Zmc2V0ICsgaSkpOwogCQkvKgogCQkgKiBCZWNhdXNlIHRoaXMgaXMga2VybmVsX3BtYXAs
IHRoaXMgY2FsbCB3aWxsIG5vdCBibG9jay4KIAkJICovCiAJCXBtYXBfZW50ZXIoa2VybmVsX3Bt
YXAsIGFkZHIgKyBpLCBWTV9QUk9UX0FMTCwgbSwgVk1fUFJPVF9BTEwsCiAJCSAgICBUUlVFKTsK
IAkJdm1fcGFnZV93YWtldXAobSk7CiAJfQogCVZNX09CSkVDVF9VTkxPQ0soa21lbV9vYmplY3Qp
OwotCXZtX21hcF91bmxvY2sobWFwKTsKLQotCXJldHVybiAoYWRkcik7CisJcmV0dXJuIChLRVJO
X1NVQ0NFU1MpOwogfQogCiAvKgogICoJa21lbV9hbGxvY193YWl0OgogICoKICAqCUFsbG9jYXRl
cyBwYWdlYWJsZSBtZW1vcnkgZnJvbSBhIHN1Yi1tYXAgb2YgdGhlIGtlcm5lbC4gIElmIHRoZSBz
dWJtYXAKICAqCWhhcyBubyByb29tLCB0aGUgY2FsbGVyIHNsZWVwcyB3YWl0aW5nIGZvciBtb3Jl
IG1lbW9yeSBpbiB0aGUgc3VibWFwLgogICoKICAqCVRoaXMgcm91dGluZSBtYXkgYmxvY2suCiAg
Ki8KIHZtX29mZnNldF90CiBrbWVtX2FsbG9jX3dhaXQobWFwLCBzaXplKQogCXZtX21hcF90IG1h
cDsKIAl2bV9zaXplX3Qgc2l6ZTsKIHsKSW5kZXg6IHZtL21lbWd1YXJkLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gdm0vbWVtZ3VhcmQuaAkocmV2aXNpb24gMTQzNTUwKQorKysgdm0vbWVtZ3VhcmQuaAkod29y
a2luZyBjb3B5KQpAQCAtMTQsMjEgKzE0LDMyIEBACiAgKgogICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKICAqIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMKICAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCiAgKiBJTiBOTyBFVkVOVCBTSEFMTCBU
SEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCiAgKiBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQKICAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKICAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQogICogVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAogICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCiAgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICoKICAqICRGcmVlQlNEJAog
ICovCiAKLWV4dGVybiB1X2ludCB2bV9tZW1ndWFyZF9kaXZpc29yOworI2luY2x1ZGUgIm9wdF92
bS5oIgogCi12b2lkCW1lbWd1YXJkX2luaXQodm1fbWFwX3QgcGFyZW50X21hcCwgdW5zaWduZWQg
bG9uZyBzaXplKTsKLXZvaWQgCSptZW1ndWFyZF9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUsIGlu
dCBmbGFncyk7Ci12b2lkCW1lbWd1YXJkX2ZyZWUodm9pZCAqYWRkcik7Ci1pbnQJbWVtZ3VhcmRf
Y21wKHN0cnVjdCBtYWxsb2NfdHlwZSAqbXRwKTsKKyNpZmRlZiBERUJVR19NRU1HVUFSRAordW5z
aWduZWQgbG9uZwltZW1ndWFyZF9mdWRnZSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsK
K3ZvaWQJbWVtZ3VhcmRfaW5pdChzdHJ1Y3Qgdm1fbWFwICopOwordm9pZCAJKm1lbWd1YXJkX2Fs
bG9jKHVuc2lnbmVkIGxvbmcsIGludCk7Cit2b2lkCW1lbWd1YXJkX2ZyZWUodm9pZCAqKTsKK2lu
dAltZW1ndWFyZF9jbXAoc3RydWN0IG1hbGxvY190eXBlICosIHVuc2lnbmVkIGxvbmcpOworaW50
CWlzX21lbWd1YXJkX2FkZHIodm9pZCAqKTsKKyNlbHNlCisjZGVmaW5lCW1lbWd1YXJkX2Z1ZGdl
KHNpemUsIHh4eCkJKHNpemUpCisjZGVmaW5lCW1lbWd1YXJkX2luaXQobWFwKQkJZG8geyB9IHdo
aWxlICgwKQorI2RlZmluZQltZW1ndWFyZF9hbGxvYyhzaXplLCBmbGFncykJTlVMTAorI2RlZmlu
ZQltZW1ndWFyZF9mcmVlKGFkZHIpCQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lCW1lbWd1YXJk
X2NtcChtdHAsIHNpemUpCQkwCisjZGVmaW5lCWlzX21lbWd1YXJkX2FkZHIoYWRkcikJCTAKKyNl
bmRpZgpJbmRleDogdm0vaXNpX21lbWd1YXJkLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gdm0vaXNpX21lbWd1
YXJkLmMJKHJldmlzaW9uIDApCisrKyB2bS9pc2lfbWVtZ3VhcmQuYwkocmV2aXNpb24gMCkKQEAg
LTAsMCArMSwzNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsCisgKiAgICAgQm9za28g
TWlsZWtpYyA8Ym1pbGVraWNARnJlZUJTRC5vcmc+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UgdW5tb2RpZmllZCwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUg
Zm9sbG93aW5nCisgKiAgICBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVU
SE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2Rl
ZnMuaD4KK19fRkJTRElEKCIkRnJlZUJTRCQiKTsKKworLyoKKyAqIE1lbUd1YXJkIGlzIGEgc2lt
cGxlIHJlcGxhY2VtZW50IGFsbG9jYXRvciBmb3IgZGVidWdnaW5nIG9ubHkKKyAqIHdoaWNoIHBy
b3ZpZGVzIEVsZWN0cmljRmVuY2Utc3R5bGUgbWVtb3J5IGJhcnJpZXIgcHJvdGVjdGlvbiBvbgor
ICogb2JqZWN0cyBiZWluZyBhbGxvY2F0ZWQsIGFuZCBpcyB1c2VkIHRvIGRldGVjdCB0YW1wZXJp
bmctYWZ0ZXItZnJlZQorICogc2NlbmFyaW9zLgorICoKKyAqIFNlZSB0aGUgbWVtZ3VhcmQoOSkg
bWFuIHBhZ2UgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdXNpbmcgTWVtR3VhcmQuCisgKi8KKwor
I2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9zeXN0bS5oPgorI2luY2x1ZGUg
PHN5cy9rZXJuZWwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcXVl
dWUuaD4KKyNpbmNsdWRlIDxzeXMvbG9jay5oPgorI2luY2x1ZGUgPHN5cy9tdXRleC5oPgorI2lu
Y2x1ZGUgPHN5cy9tYWxsb2MuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CisKKyNpbmNsdWRl
IDx2bS92bS5oPgorI2luY2x1ZGUgPHZtL3VtYS5oPgorI2luY2x1ZGUgPHZtL3ZtX3BhcmFtLmg+
CisjaW5jbHVkZSA8dm0vdm1fcGFnZS5oPgorI2luY2x1ZGUgPHZtL3ZtX21hcC5oPgorI2luY2x1
ZGUgPHZtL3ZtX29iamVjdC5oPgorI2luY2x1ZGUgPHZtL3ZtX2V4dGVybi5oPgorI2luY2x1ZGUg
PHZtL21lbWd1YXJkLmg+CisKK1NZU0NUTF9OT0RFKF92bSwgT0lEX0FVVE8sIG1lbWd1YXJkLCBD
VExGTEFHX1JXLCBOVUxMLCAiTWVtR3VhcmQgZGF0YSIpOworLyoKKyAqIFRoZSB2bV9tZW1ndWFy
ZF9kaXZpc29yIHZhcmlhYmxlIGNvbnRyb2xzIGhvdyBtdWNoIG9mIGttZW1fbWFwIHNob3VsZCBi
ZQorICogcmVzZXJ2ZWQgZm9yIE1lbUd1YXJkLgorICovCitzdGF0aWMgdV9pbnQgdm1fbWVtZ3Vh
cmRfZGl2aXNvcjsKK1NZU0NUTF9VSU5UKF92bV9tZW1ndWFyZCwgT0lEX0FVVE8sIGRpdmlzb3Is
IENUTEZMQUdfUkRUVU4sCisgICAgJnZtX21lbWd1YXJkX2Rpdmlzb3IsCisgICAgMCwgIihrbWVt
X3NpemUvbWVtZ3VhcmRfZGl2aXNvcikgPT0gbWVtZ3VhcmQgc3VibWFwIHNpemUiKTsgICAgIAor
CisvKgorICogU2hvcnQgZGVzY3JpcHRpb24gKGtzX3Nob3J0ZGVzYykgb2YgbWVtb3J5IHR5cGUg
dG8gbW9uaXRvci4KKyAqLworc3RhdGljIGNoYXIgdm1fbWVtZ3VhcmRfZGVzY1sxMjhdID0gIiI7
CitzdGF0aWMgc3RydWN0IG1hbGxvY190eXBlICp2bV9tZW1ndWFyZF9tdHlwZSA9IE5VTEw7CitU
VU5BQkxFX1NUUigidm0ubWVtZ3VhcmQuZGVzYyIsIHZtX21lbWd1YXJkX2Rlc2MsIHNpemVvZih2
bV9tZW1ndWFyZF9kZXNjKSk7CitzdGF0aWMgaW50CittZW1ndWFyZF9zeXNjdGxfZGVzYyhTWVND
VExfSEFORExFUl9BUkdTKQoreworCWNoYXIgZGVzY1tzaXplb2Yodm1fbWVtZ3VhcmRfZGVzYyld
OworCWludCBlcnJvcjsKKworCXN0cmxjcHkoZGVzYywgdm1fbWVtZ3VhcmRfZGVzYywgc2l6ZW9m
KGRlc2MpKTsKKwllcnJvciA9IHN5c2N0bF9oYW5kbGVfc3RyaW5nKG9pZHAsIGRlc2MsIHNpemVv
ZihkZXNjKSwgcmVxKTsKKwlpZiAoZXJyb3IgIT0gMCB8fCByZXEtPm5ld3B0ciA9PSBOVUxMKQor
CQlyZXR1cm4gKGVycm9yKTsKKworCW10eF9sb2NrKCZtYWxsb2NfbXR4KTsKKwkvKgorCSAqIElm
IG10cCBpcyBOVUxMLCBpdCB3aWxsIGJlIGluaXRpYWxpemVkIGluIG1lbWd1YXJkX2NtcCgpLgor
CSAqLworCXZtX21lbWd1YXJkX210eXBlID0gbWFsbG9jX2Rlc2MydHlwZShkZXNjKTsKKwlzdHJs
Y3B5KHZtX21lbWd1YXJkX2Rlc2MsIGRlc2MsIHNpemVvZih2bV9tZW1ndWFyZF9kZXNjKSk7CisJ
bXR4X3VubG9jaygmbWFsbG9jX210eCk7CisJcmV0dXJuIChlcnJvcik7Cit9CitTWVNDVExfUFJP
Qyhfdm1fbWVtZ3VhcmQsIE9JRF9BVVRPLCBkZXNjLAorICAgIENUTFRZUEVfU1RSSU5HIHwgQ1RM
RkxBR19SVyB8IENUTEZMQUdfTVBTQUZFLCAwLCAwLAorICAgIG1lbWd1YXJkX3N5c2N0bF9kZXNj
LCAiQSIsICJTaG9ydCBkZXNjcmlwdGlvbiBvZiBtZW1vcnkgdHlwZSB0byBtb25pdG9yIik7CisK
K3N0YXRpYyBzdHJ1Y3Qgdm1fbWFwICptZW1ndWFyZF9tYXA7CitzdGF0aWMgdm1fb2Zmc2V0X3Qg
bWVtZ3VhcmRfY3Vyc29yOworc3RhdGljIHZtX3NpemVfdCBtZW1ndWFyZF9tYXBzaXplOworc3Rh
dGljIHZtX3NpemVfdCBtZW1ndWFyZF9waHlzbGltaXQ7CitzdGF0aWMgdV9sb25nIG1lbWd1YXJk
X3dyYXA7CitzdGF0aWMgdV9sb25nIG1lbWd1YXJkX3N1Y2M7CitzdGF0aWMgdV9sb25nIG1lbWd1
YXJkX2ZhaWxfa3ZhOworc3RhdGljIHVfbG9uZyBtZW1ndWFyZF9mYWlsX3BnczsKKworU1lTQ1RM
X1VMT05HKF92bV9tZW1ndWFyZCwgT0lEX0FVVE8sIGN1cnNvciwgQ1RMRkxBR19SRCwKKyAgICAm
bWVtZ3VhcmRfY3Vyc29yLCAwLCAiTWVtR3VhcmQgY3Vyc29yIik7CitTWVNDVExfVUxPTkcoX3Zt
X21lbWd1YXJkLCBPSURfQVVUTywgbWFwc2l6ZSwgQ1RMRkxBR19SRCwKKyAgICAmbWVtZ3VhcmRf
bWFwc2l6ZSwgMCwgIk1lbUd1YXJkIHByaXZhdGUgdm1fbWFwIHNpemUiKTsKK1NZU0NUTF9VTE9O
Ryhfdm1fbWVtZ3VhcmQsIE9JRF9BVVRPLCBwaHlzX2xpbWl0LCBDVExGTEFHX1JELAorICAgICZt
ZW1ndWFyZF9waHlzbGltaXQsIDAsICJMaW1pdCBvbiBNZW1HdWFyZCBtZW1vcnkgY29uc3VtcHRp
b24iKTsKK1NZU0NUTF9VTE9ORyhfdm1fbWVtZ3VhcmQsIE9JRF9BVVRPLCB3cmFwY250LCBDVExG
TEFHX1JELAorICAgICZtZW1ndWFyZF93cmFwLCAwLCAiTWVtR3VhcmQgY3Vyc29yIHdyYXAgY291
bnQiKTsKK1NZU0NUTF9VTE9ORyhfdm1fbWVtZ3VhcmQsIE9JRF9BVVRPLCBudW1hbGxvYywgQ1RM
RkxBR19SRCwKKyAgICAmbWVtZ3VhcmRfc3VjYywgMCwgIkNvdW50IG9mIHN1Y2Nlc3NmdWwgTWVt
R3VhcmQgYWxsb2NhdGlvbnMiKTsKK1NZU0NUTF9VTE9ORyhfdm1fbWVtZ3VhcmQsIE9JRF9BVVRP
LCBmYWlsX2t2YSwgQ1RMRkxBR19SRCwKKyAgICAmbWVtZ3VhcmRfZmFpbF9rdmEsIDAsICJNZW1H
dWFyZCBmYWlsdXJlcyBkdWUgdG8gbGFjayBvZiBLVkEiKTsKK1NZU0NUTF9VTE9ORyhfdm1fbWVt
Z3VhcmQsIE9JRF9BVVRPLCBmYWlsX3BncywgQ1RMRkxBR19SRCwKKyAgICAmbWVtZ3VhcmRfZmFp
bF9wZ3MsIDAsICJNZW1HdWFyZCBmYWlsdXJlcyBkdWUgdG8gbGFjayBvZiBwYWdlcyIpOworCisv
KgorICogUmV0dXJuIGEgZnVkZ2VkIHZhbHVlIGZvciB2bV9rbWVtX3NpemUgZm9yIGFsbG9jYXRp
bmcgdGhlCisgKiBrZXJuZWxfbWFwLiAgVGhlIG1lbWd1YXJkIG1lbW9yeSB3aWxsIGJlIGEgc3Vi
bWFwLgorICovCit1bnNpZ25lZCBsb25nCittZW1ndWFyZF9mdWRnZSh1bnNpZ25lZCBsb25nIHZt
X2ttZW1fc2l6ZSwgdW5zaWduZWQgbG9uZyB2bV9rbWVtX21heCkKK3sKKwl1X2xvbmcgbWVtX3Bn
cyA9IHZtX2NudC52X3BhZ2VfY291bnQ7CisKKwl2bV9tZW1ndWFyZF9kaXZpc29yID0gMTA7CisJ
VFVOQUJMRV9JTlRfRkVUQ0goInZtLm1lbWd1YXJkLmRpdmlzb3IiLCAmdm1fbWVtZ3VhcmRfZGl2
aXNvcik7CisKKwkvKiBQaWNrIGEgY29uc2VydmF0aXZlIHZhbHVlIGlmIHByb3ZpZGVkIHZhbHVl
IHN1Y2tzLiAqLworCWlmICgodm1fbWVtZ3VhcmRfZGl2aXNvciA8PSAwKSB8fAorCSAgICAoKHZt
X2ttZW1fc2l6ZSAvIHZtX21lbWd1YXJkX2Rpdmlzb3IpID09IDApKQorCQl2bV9tZW1ndWFyZF9k
aXZpc29yID0gMTA7CisJLyoKKwkgKiBMaW1pdCBjb25zdW1wdGlvbiBvZiBwYWdlcyB0byAxL3Zt
X21lbWd1YXJkX2Rpdmlzb3Igb2YKKwkgKiBzeXN0ZW0gbWVtb3J5LiAgSWYgdGhlIEtWQSBpcyBz
bWFsbGVyIHRoYW4gdGhpcyB0aGVuIHRoZQorCSAqIEtWQSBsaW1pdCBjb21lcyBpbnRvIHBsYXkg
Zmlyc3QuICBUaGlzIHByZXZlbnRzIG1lbWd1YXJkJ3MKKwkgKiBwYWdlIHByb21vdGlvbnMgZnJv
bSBjb21wbGV0ZWx5IHVzaW5nIHVwIG1lbW9yeSwgc2luY2UgbW9zdAorCSAqIG1hbGxvYyg5KSBj
YWxscyBhcmUgc3ViLXBhZ2UuCisJICovCisJbWVtZ3VhcmRfcGh5c2xpbWl0ID0gKG1lbV9wZ3Mg
LyB2bV9tZW1ndWFyZF9kaXZpc29yKSAqIFBBR0VfU0laRTsKKwkvKgorCSAqIFdlIHdhbnQgYXMg
bXVjaCBLVkEgYXMgd2UgY2FuIHRha2Ugc2FmZWx5LiAgVXNlIGF0IG1vc3Qgb3VyCisJICogYWxs
b3R0ZWQgZnJhY3Rpb24gb2Yga21lbV9tYXguICBMaW1pdCB0aGlzIHRvIHR3aWNlIHRoZQorCSAq
IHBoeXNpY2FsIG1lbW9yeSB0byBhdm9pZCB1c2luZyB0b28gbXVjaCBtZW1vcnkgYXMgcGFnZXRh
YmxlCisJICogcGFnZXMuCisJICovCisJbWVtZ3VhcmRfbWFwc2l6ZSA9IHZtX2ttZW1fbWF4IC8g
dm1fbWVtZ3VhcmRfZGl2aXNvcjsKKwkvKiBzaXplIG11c3QgYmUgbXVsdGlwbGUgb2YgUEFHRV9T
SVpFICovCisJbWVtZ3VhcmRfbWFwc2l6ZSA9IHJvdW5kX3BhZ2UobWVtZ3VhcmRfbWFwc2l6ZSk7
CisJaWYgKG1lbWd1YXJkX21hcHNpemUgLyAoMiAqIFBBR0VfU0laRSkgPiBtZW1fcGdzKQorCQlt
ZW1ndWFyZF9tYXBzaXplID0gbWVtX3BncyAqIDIgKiBQQUdFX1NJWkU7CisJaWYgKHZtX2ttZW1f
c2l6ZSArIG1lbWd1YXJkX21hcHNpemUgPiB2bV9rbWVtX21heCkKKwkJcmV0dXJuICh2bV9rbWVt
X21heCk7CisJcmV0dXJuICh2bV9rbWVtX3NpemUgKyBtZW1ndWFyZF9tYXBzaXplKTsKK30KKwor
LyoKKyAqIEluaXRpYWxpemUgdGhlIE1lbUd1YXJkIG1vY2sgYWxsb2NhdG9yLiAgQWxsIG9iamVj
dHMgZnJvbSBNZW1HdWFyZCBjb21lCisgKiBvdXQgb2YgYSBzaW5nbGUgVk0gbWFwIChjb250aWd1
b3VzIGNodW5rIG9mIGFkZHJlc3Mgc3BhY2UpLgorICovCit2b2lkCittZW1ndWFyZF9pbml0KHZt
X21hcF90IHBhcmVudF9tYXApCit7CisJdm1fb2Zmc2V0X3QgYmFzZSwgbGltaXQ7CisKKwltZW1n
dWFyZF9tYXAgPSBrbWVtX3N1YmFsbG9jKHBhcmVudF9tYXAsICZiYXNlLCAmbGltaXQsCisJICAg
IG1lbWd1YXJkX21hcHNpemUsIEZBTFNFKTsKKwltZW1ndWFyZF9tYXAtPnN5c3RlbV9tYXAgPSAx
OworCUtBU1NFUlQobWVtZ3VhcmRfbWFwc2l6ZSA9PSBsaW1pdCAtIGJhc2UsCisJICAgICgiRXhw
ZWN0ZWQgJWxkLCBnb3QgJWxkIiwgbWVtZ3VhcmRfbWFwc2l6ZSwgbGltaXQgLSBiYXNlKSk7CisJ
bWVtZ3VhcmRfY3Vyc29yID0gYmFzZTsKKworCXByaW50ZigiTUVNR1VBUkQgREVCVUdHSU5HIEFM
TE9DQVRPUiBJTklUSUFMSVpFRDpcbiIpOworCXByaW50ZigiXHRNRU1HVUFSRCBtYXAgYmFzZTog
MHglbHhcbiIsIGJhc2UpOworCXByaW50ZigiXHRNRU1HVUFSRCBtYXAgbGltaXQ6IDB4JWx4XG4i
LCBsaW1pdCk7CisJcHJpbnRmKCJcdE1FTUdVQVJEIG1hcCBzaXplOiAlbGQgS0J5dGVzXG4iLCBt
ZW1ndWFyZF9tYXBzaXplID4+IDEwKTsKK30KKworLyoKKyAqIFJ1biB0aGluZ3MgdGhhdCBjYW4n
dCBiZSBkb25lIGFzIGVhcmx5IGFzIG1lbWd1YXJkX2luaXQoKS4KKyAqLworc3RhdGljIHZvaWQK
K21lbWd1YXJkX3N5c2luaXQodm9pZCkKK3sKKwlzdHJ1Y3Qgc3lzY3RsX29pZF9saXN0ICpwYXJl
bnQ7CisKKwlwYXJlbnQgPSBTWVNDVExfU1RBVElDX0NISUxEUkVOKF92bV9tZW1ndWFyZCk7CisK
KwlTWVNDVExfQUREX1VMT05HKE5VTEwsIHBhcmVudCwgT0lEX0FVVE8sICJtYXBzdGFydCIsIENU
TEZMQUdfUkQsCisJICAgICZtZW1ndWFyZF9tYXAtPm1pbl9vZmZzZXQsICJNZW1HdWFyZCBLVkEg
YmFzZSIpOworCVNZU0NUTF9BRERfVUxPTkcoTlVMTCwgcGFyZW50LCBPSURfQVVUTywgIm1hcGxp
bWl0IiwgQ1RMRkxBR19SRCwKKwkgICAgJm1lbWd1YXJkX21hcC0+bWF4X29mZnNldCwgIk1lbUd1
YXJkIEtWQSBlbmQiKTsKKwlTWVNDVExfQUREX1VMT05HKE5VTEwsIHBhcmVudCwgT0lEX0FVVE8s
ICJtYXB1c2VkIiwgQ1RMRkxBR19SRCwKKwkgICAgJm1lbWd1YXJkX21hcC0+c2l6ZSwgIk1lbUd1
YXJkIEtWQSB1c2VkIik7Cit9CitTWVNJTklUKG1lbWd1YXJkLCBTSV9TVUJfS0xELCBTSV9PUkRF
Ul9BTlksIG1lbWd1YXJkX3N5c2luaXQsIE5VTEwpOworCisvKgorICogdjJzaXplcCgpIGNvbnZl
cnRzIGEgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBmaXJzdCBwYWdlIGFsbG9jYXRlZCBmb3IKKyAq
IGFuIGl0ZW0gdG8gYSBwb2ludGVyIHRvIHVfbG9uZyByZWNvcmRpbmcgdGhlIHNpemUgb2YgdGhl
IG9yaWdpbmFsCisgKiBhbGxvY2F0aW9uIHJlcXVlc3QuCisgKgorICogVGhpcyByb3V0aW5lIGlz
IHZlcnkgc2ltaWxhciB0byB0aG9zZSBkZWZpbmVkIGJ5IFVNQSBpbiB1bWFfaW50LmguCisgKiBU
aGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoaXMgcm91dGluZSBzdG9yZXMgdGhlIG1nZmlmbyBpbiBv
bmUgb2YgdGhlCisgKiBwYWdlJ3MgZmllbGRzIHRoYXQgaXMgdW51c2VkIHdoZW4gdGhlIHBhZ2Ug
aXMgd2lyZWQgcmF0aGVyIHRoYW4gdGhlCisgKiBvYmplY3QgZmllbGQsIHdoaWNoIGlzIHVzZWQu
CisgKi8KK3N0YXRpYyB1X2xvbmcgKgordjJzaXplcCh2bV9vZmZzZXRfdCB2YSkKK3sKKwlzdHJ1
Y3Qgdm1fcGFnZSAqcDsKKworCXAgPSBQSFlTX1RPX1ZNX1BBR0UocG1hcF9rZXh0cmFjdCh2YSkp
OworCUtBU1NFUlQocC0+d2lyZV9jb3VudCAhPSAwICYmIHAtPnF1ZXVlID09IFBRX05PTkUsCisJ
ICAgICgiTUVNR1VBUkQ6IEV4cGVjdGVkIHdpcmVkIHBhZ2UgJXAgaW4gdnRvbWdmaWZvISIsIHAp
KTsKKwlyZXR1cm4gKHVfbG9uZyAqKSZwLT5wYWdlcS50cWVfbmV4dDsKK30KKworLyoKKyAqIEFs
bG9jYXRlIGEgc2luZ2xlIG9iamVjdCBvZiBzcGVjaWZpZWQgc2l6ZSB3aXRoIHNwZWNpZmllZCBm
bGFncworICogKGVpdGhlciBNX1dBSVRPSyBvciBNX05PV0FJVCkuCisgKi8KK3ZvaWQgKgorbWVt
Z3VhcmRfYWxsb2ModW5zaWduZWQgbG9uZyByZXFfc2l6ZSwgaW50IGZsYWdzKQoreworCXZtX29m
ZnNldF90IGFkZHI7CisJdV9sb25nIHNpemU7CisJaW50IHJ2OworCisJc2l6ZSA9IHJvdW5kX3Bh
Z2UocmVxX3NpemUpOworCWlmIChzaXplID09IDApCisJCXJldHVybiBOVUxMOworCXZtX21hcF9s
b2NrKG1lbWd1YXJkX21hcCk7CisJLyoKKwkgKiBXaGVuIHdlIHBhc3Mgb3VyIG1lbW9yeSBsaW1p
dCwgcmVqZWN0IHN1Yi1wYWdlIGFsbG9jYXRpb25zLgorCSAqIFBhZ2Utc2l6ZSBhbmQgbGFyZ2Vy
IGFsbG9jYXRpb25zIHdpbGwgdXNlIHRoZSBzYW1lIGFtb3VudAorCSAqIG9mIHBoeXNpY2FsIG1l
bW9yeSB3aGV0aGVyIHdlIGFsbG9jYXRlIG9yIGhhbmQgb2ZmIHRvCisJICogdW1hX2xhcmdlX2Fs
bG9jKCksIHNvIGtlZXAgdGhvc2UuCisJICovCisJaWYgKG1lbWd1YXJkX21hcC0+c2l6ZSA+PSBt
ZW1ndWFyZF9waHlzbGltaXQgJiYKKwkgICAgcmVxX3NpemUgPCBQQUdFX1NJWkUpIHsKKwkJYWRk
ciA9ICh2bV9vZmZzZXRfdClOVUxMOworCQltZW1ndWFyZF9mYWlsX3BncysrOworCQlnb3RvIG91
dDsKKwl9CisJLyoKKwkgKiBLZWVwIGEgbW92aW5nIGN1cnNvciBzbyB3ZSBkb24ndCByZWN5Y2xl
IEtWQSBhcyBsb25nIGFzCisJICogcG9zc2libGUuICBJdCdzIG5vdCBwZXJmZWN0LCBzaW5jZSB3
ZSBkb24ndCBrbm93IGluIHdoYXQKKwkgKiBvcmRlciBwcmV2aW91cyBhbGxvY2F0aW9ucyB3aWxs
IGJlIGZyZWUnZCwgYnV0IGl0J3Mgc2ltcGxlCisJICogYW5kIGZhc3QsIGFuZCByZXF1aXJlcyBP
KDEpIGFkZGl0aW9uYWwgc3RvcmFnZS4KKwkgKgorCSAqIFhYWCBUaGlzIHNjaGVtZSB3aWxsIGxl
YWQgdG8gZ3JlYXRlciBmcmFnbWVudGF0aW9uIG9mIHRoZQorCSAqIG1hcCwgdW5sZXNzIHZtX21h
cF9maW5kc3BhY2UoKSBpcyB0d2Vha2VkLgorCSAqLworCWZvciAoOzspIHsKKwkJcnYgPSB2bV9t
YXBfZmluZHNwYWNlKG1lbWd1YXJkX21hcCwgbWVtZ3VhcmRfY3Vyc29yLAorCQkgICAgc2l6ZSwg
JmFkZHIpOworCQlpZiAocnYgPT0gS0VSTl9TVUNDRVNTKQorCQkJYnJlYWs7CisJCS8qCisJCSAq
IFRoZSBtYXAgaGFzIG5vIHNwYWNlLiAgVGhpcyBtYXkgYmUgZHVlIHRvCisJCSAqIGZyYWdtZW50
YXRpb24sIG9yIGJlY2F1c2UgdGhlIGN1cnNvciBpcyBuZWFyIHRoZQorCQkgKiBlbmQgb2YgdGhl
IG1hcC4KKwkJICovCisJCWlmIChtZW1ndWFyZF9jdXJzb3IgPT0gdm1fbWFwX21pbihtZW1ndWFy
ZF9tYXApKSB7CisJCQltZW1ndWFyZF9mYWlsX2t2YSsrOworCQkJYWRkciA9ICh2bV9vZmZzZXRf
dClOVUxMOworCQkJZ290byBvdXQ7CisJCX0KKwkJbWVtZ3VhcmRfd3JhcCsrOworCQltZW1ndWFy
ZF9jdXJzb3IgPSB2bV9tYXBfbWluKG1lbWd1YXJkX21hcCk7CisJfQorCXJ2ID0ga21lbV9iYWNr
KG1lbWd1YXJkX21hcCwgYWRkciwgc2l6ZSwgZmxhZ3MpOworCWlmIChydiAhPSBLRVJOX1NVQ0NF
U1MpIHsKKwkJbWVtZ3VhcmRfZmFpbF9wZ3MrKzsKKwkJYWRkciA9ICh2bV9vZmZzZXRfdClOVUxM
OworCQlnb3RvIG91dDsKKwl9CisJbWVtZ3VhcmRfY3Vyc29yID0gYWRkciArIHNpemU7CisJKnYy
c2l6ZXAodHJ1bmNfcGFnZShhZGRyKSkgPSByZXFfc2l6ZTsKKwltZW1ndWFyZF9zdWNjKys7Citv
dXQ6CisJdm1fbWFwX3VubG9jayhtZW1ndWFyZF9tYXApOworCXJldHVybiAoKHZvaWQgKilhZGRy
KTsKK30KKworaW50Citpc19tZW1ndWFyZF9hZGRyKHZvaWQgKmFkZHIpCit7CisJdm1fb2Zmc2V0
X3QgYSA9ICh2bV9vZmZzZXRfdCkodWludHB0cl90KWFkZHI7CisKKwlyZXR1cm4gKGEgPj0gbWVt
Z3VhcmRfbWFwLT5taW5fb2Zmc2V0ICYmIGEgPCBtZW1ndWFyZF9tYXAtPm1heF9vZmZzZXQpOwor
fQorCisvKgorICogRnJlZSBzcGVjaWZpZWQgc2luZ2xlIG9iamVjdC4KKyAqLwordm9pZAorbWVt
Z3VhcmRfZnJlZSh2b2lkICpwdHIpCit7CisJdm1fb2Zmc2V0X3QgYWRkcjsKKwl1X2xvbmcgcmVx
X3NpemUsIHNpemU7CisJY2hhciAqdGVtcDsKKwlpbnQgaTsKKworCWFkZHIgPSB0cnVuY19wYWdl
KCh1aW50cHRyX3QpcHRyKTsKKwlyZXFfc2l6ZSA9ICp2MnNpemVwKGFkZHIpOworCXNpemUgPSBy
b3VuZF9wYWdlKHJlcV9zaXplKTsKKworCS8qCisJICogUGFnZSBzaG91bGQgbm90IGJlIGd1YXJk
ZWQgcmlnaHQgbm93LCBzbyBmb3JjZSBhIHdyaXRlLgorCSAqIFRoZSBwdXJwb3NlIG9mIHRoaXMg
aXMgdG8gaW5jcmVhc2UgdGhlIGxpa2VsaWhvb2Qgb2YKKwkgKiBjYXRjaGluZyBhIGRvdWJsZS1m
cmVlLCBidXQgbm90IG5lY2Vzc2FyaWx5IGEKKwkgKiB0YW1wZXItYWZ0ZXItZnJlZSAodGhlIHNl
Y29uZCB0aHJlYWQgZnJlZWluZyBtaWdodCBub3QKKwkgKiB3cml0ZSBiZWZvcmUgZnJlZWluZywg
c28gdGhpcyBmb3JjZXMgaXQgdG8gYW5kLAorCSAqIHN1YnNlcXVlbnRseSwgdHJpZ2dlciBhIGZh
dWx0KS4KKwkgKi8KKwl0ZW1wID0gcHRyOworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpICs9IFBB
R0VfU0laRSkKKwkJdGVtcFtpXSA9ICdNJzsKKworCWttZW1fZnJlZShtZW1ndWFyZF9tYXAsIGFk
ZHIsIHNpemUpOworfQorCitpbnQKK21lbWd1YXJkX2NtcChzdHJ1Y3QgbWFsbG9jX3R5cGUgKm10
cCwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCisjaWYgMQorCS8qCisJICogVGhlIHNhZmVzdCB3
YXkgb2YgY29tcGFyc2lvbiBpcyB0byBhbHdheXMgY29tcGFyZSBzaG9ydCBkZXNjcmlwdGlvbgor
CSAqIHN0cmluZyBvZiBtZW1vcnkgdHlwZSwgYnV0IGl0IGlzIGFsc28gdGhlIHNsb3dlc3Qgd2F5
LgorCSAqLworCXJldHVybiAoc3RyY21wKG10cC0+a3Nfc2hvcnRkZXNjLCB2bV9tZW1ndWFyZF9k
ZXNjKSA9PSAwKTsKKyNlbHNlCisJLyoKKwkgKiBJZiB3ZSBjb21wYXJlIHBvaW50ZXJzLCB0aGVy
ZSBhcmUgdHdvIHBvc3NpYmxlIHByb2JsZW1zOgorCSAqIDEuIE1lbW9yeSB0eXBlIHdhcyB1bmxv
YWRlZCBhbmQgbmV3IG1lbW9yeSB0eXBlIHdhcyBhbGxvY2F0ZWQgYXQgdGhlCisJICogICAgc2Ft
ZSBhZGRyZXNzLgorCSAqIDIuIE1lbW9yeSB0eXBlIHdhcyB1bmxvYWRlZCBhbmQgbG9hZGVkIGFn
YWluLCBidXQgYWxsb2NhdGVkIGF0IGEKKwkgKiAgICBkaWZmZXJlbnQgYWRkcmVzcy4KKwkgKi8K
KwlpZiAodm1fbWVtZ3VhcmRfbXR5cGUgIT0gTlVMTCkKKwkJcmV0dXJuIChtdHAgPT0gdm1fbWVt
Z3VhcmRfbXR5cGUpOworCWlmIChzdHJjbXAobXRwLT5rc19zaG9ydGRlc2MsIHZtX21lbWd1YXJk
X2Rlc2MpID09IDApIHsKKwkJdm1fbWVtZ3VhcmRfbXR5cGUgPSBtdHA7CisJCXJldHVybiAoMSk7
CisJfQorCXJldHVybiAoMCk7CisjZW5kaWYKK30KClByb3BlcnR5IGNoYW5nZXMgb246IHZtL2lz
aV9tZW1ndWFyZC5jCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX18KQWRkZWQ6IHN2bjptaW1lLXR5cGUKICAgKyB0ZXh0L3Bs
YWluCkFkZGVkOiBzdm46ZW9sLXN0eWxlCiAgICsgbmF0aXZlCgpJbmRleDogdm0vdm1fZXh0ZXJu
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gdm0vdm1fZXh0ZXJuLmgJKHJldmlzaW9uIDE0MzU1MCkKKysrIHZt
L3ZtX2V4dGVybi5oCSh3b3JraW5nIGNvcHkpCkBAIC01NCwzMCArNTQsMzEgQEAgaW50IHNicmso
c3RydWN0IHRocmVhZCAqLCB2b2lkICosIGludCAqKQogaW50IHNzdGsoc3RydWN0IHRocmVhZCAq
LCB2b2lkICosIGludCAqKTsKIGludCBzd2Fwb24oc3RydWN0IHRocmVhZCAqLCB2b2lkICosIGlu
dCAqKTsKICNlbmRpZgkJCS8qIFRZUEVERUZfRk9SX1VBUCAqLwogCiBpbnQga2VybmFjYyh2b2lk
ICosIGludCwgaW50KTsKIHZtX29mZnNldF90IGttZW1fYWxsb2Modm1fbWFwX3QsIHZtX3NpemVf
dCk7CiB2bV9vZmZzZXRfdCBrbWVtX2FsbG9jX2NvbnRpZyh2bV9tYXBfdCBtYXAsIHZtX3NpemVf
dCBzaXplLCBpbnQgZmxhZ3MsCiAgICAgdm1fcGFkZHJfdCBsb3csIHZtX3BhZGRyX3QgaGlnaCwg
dW5zaWduZWQgbG9uZyBhbGlnbm1lbnQsCiAgICAgdW5zaWduZWQgbG9uZyBib3VuZGFyeSwgdm1f
bWVtYXR0cl90IG1lbWF0dHIpOwogdm1fb2Zmc2V0X3Qga21lbV9hbGxvY19ub2ZhdWx0KHZtX21h
cF90LCB2bV9zaXplX3QpOwogdm1fb2Zmc2V0X3Qga21lbV9hbGxvY193YWl0KHZtX21hcF90LCB2
bV9zaXplX3QpOwogdm9pZCBrbWVtX2ZyZWUodm1fbWFwX3QsIHZtX29mZnNldF90LCB2bV9zaXpl
X3QpOwogdm9pZCBrbWVtX2ZyZWVfd2FrZXVwKHZtX21hcF90LCB2bV9vZmZzZXRfdCwgdm1fc2l6
ZV90KTsKIHZvaWQga21lbV9pbml0KHZtX29mZnNldF90LCB2bV9vZmZzZXRfdCk7CiB2bV9vZmZz
ZXRfdCBrbWVtX21hbGxvYyh2bV9tYXBfdCwgdm1fc2l6ZV90LCBib29sZWFuX3QpOworaW50IGtt
ZW1fYmFjayh2bV9tYXBfdCwgdm1fb2Zmc2V0X3QsIHZtX3NpemVfdCwgaW50KTsKIHZtX21hcF90
IGttZW1fc3ViYWxsb2Modm1fbWFwX3QsIHZtX29mZnNldF90ICosIHZtX29mZnNldF90ICosIHZt
X3NpemVfdCwKICAgICBib29sZWFuX3QpOwogdm9pZCBzd2Fwb3V0X3Byb2NzKGludCk7CiBpbnQg
dXNlcmFjYyh2b2lkICosIGludCwgaW50KTsKIGludCB2bV9mYXVsdCh2bV9tYXBfdCwgdm1fb2Zm
c2V0X3QsIHZtX3Byb3RfdCwgaW50KTsKIHZvaWQgdm1fZmF1bHRfY29weV9lbnRyeSh2bV9tYXBf
dCwgdm1fbWFwX3QsIHZtX21hcF9lbnRyeV90LCB2bV9tYXBfZW50cnlfdCk7CiB2b2lkIHZtX2Zh
dWx0X3Vud2lyZSh2bV9tYXBfdCwgdm1fb2Zmc2V0X3QsIHZtX29mZnNldF90LCBib29sZWFuX3Qp
OwogaW50IHZtX2ZhdWx0X3dpcmUodm1fbWFwX3QsIHZtX29mZnNldF90LCB2bV9vZmZzZXRfdCwg
Ym9vbGVhbl90LCBib29sZWFuX3QpOwogaW50IHZtX2Zvcmtwcm9jKHN0cnVjdCB0aHJlYWQgKiwg
c3RydWN0IHByb2MgKiwgc3RydWN0IHRocmVhZCAqLCBzdHJ1Y3Qgdm1zcGFjZSAqLCBpbnQpOwog
dm9pZCB2bV93YWl0cHJvYyhzdHJ1Y3QgcHJvYyAqKTsKIGludCB2bV9tbWFwKHZtX21hcF90LCB2
bV9vZmZzZXRfdCAqLCB2bV9zaXplX3QsIHZtX3Byb3RfdCwgdm1fcHJvdF90LCBpbnQsIG9ianR5
cGVfdCwgdm9pZCAqLCB2bV9vb2Zmc2V0X3QpOwogdm9pZCB2bV9zZXRfcGFnZV9zaXplKHZvaWQp
Owogc3RydWN0IHZtc3BhY2UgKnZtc3BhY2VfYWxsb2Modm1fb2Zmc2V0X3QsIHZtX29mZnNldF90
KTsKIHN0cnVjdCB2bXNwYWNlICp2bXNwYWNlX2Zvcmsoc3RydWN0IHZtc3BhY2UgKik7CiBpbnQg
dm1zcGFjZV9leGVjKHN0cnVjdCBwcm9jICosIHZtX29mZnNldF90LCB2bV9vZmZzZXRfdCk7Cg==

------_=_NextPart_001_01CAC15B.FD6C5005--



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