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>