Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 25 Oct 2011 13:42:46 +0800
From:      Adrian Chadd <adrian@freebsd.org>
To:        freebsd-wireless@freebsd.org
Subject:   ath 11n update: locking, regressions, testing
Message-ID:  <CAJ-Vmo=9KkQbiCCBQm5Xm_9dNZtY6jQ1hzO0SWSZ4z323jF=Hw@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
--20cf30363cef507c7704b0190203
Content-Type: text/plain; charset=ISO-8859-1

Hi all,

In working out kinks in how the ath driver handles things during an
interface reset or reconfigure, I've discovered a couple of things:

* all the frames in the tx/rx queues are just dropped on the floor,
which breaks 802.11n aggregation state in very bad ways; and
* there's just a lot of cases where things can overlap each other,
causing temporary situations of unpredictability (and likely some of
the "wtf?" situations that people have been seeing with the stock
freebsd ath driver.)

I've been tinkering with some code which does two things:

* it introduces locking of most operational paths, much like how the
iwn driver does things, and
* in cases of a recoverable reset (eg a configuration change such as
enabling/disabling ANI, or a stuck beacon condition or watchdog
timeout), the TX/RX queues are properly handled:
  + the TX queue is kept how it is and DMA is simply restarted once
the reset completes;
  + the RX queue is completely drained before the reset occurs, so all
frames are thrown at net80211 and handled.

For reference, linux doesn't do this kind of locking - the ath9k
driver hides reset, channel change and RX behind a new lock - the "PCU
lock" - whilst the TX path doesn't use the PCU lock, it just uses the
normal per-queue TX locking that freebsd/ath9k currently has.

Now, this has shown a few issues which make me kind of wary about
committing this as-is and I'd like some testing and feedback before I
am even remotely comfortable.

Firstly - holding any lock during _both_ TX _and_ RX causes all kinds
of LOR'ing in the IP stack, leading to very quick deadlocks.
The iwn driver releases the IWN_LOCK before calling ieee80211_input,
so it avoids this - but by doing that, it too could lead to some
inconsistencies (eg another process could cause a state change during
active RX.)
So I fixed that in my code - and yes, this means that things such as
ath_start() (ie, the normal TX path), or ath_raw_xmit() (the raw TX
path, for things like management/probe frames) can occur. So I
introduced some variables which keep track of whether the code is in
tx, tx complete, rx process, rx tasklet and reset. This way the driver
can avoid situations where:

* there's a reset, or rx process occuring, which grabs the lock;
* some other task occurs - say, you change the ANI configuration, or
add/remove a VAP;
* rxproc releases the lock to call net80211_input;
* .. and the configuration change, VAP change, etc occurs;
* .. then rxproc continues trying to process RX frames, after the
hardware has been reset.

Now this kind of thing currently can occur, so I'm leaning to just
ignoring it and adding very loud printf()s if the situation is
detected. It can then be fixed at a later stage.

Next - the net80211 scan code (which ath uses, but iwn doesn't as the
firmware does its own scanning) holds the net80211 interface lock
(comlock) during the duration of sending probe requests to a channel.
This means that when scanning, this occurs:

* grab comlock;
* iterate over scan cache contents, sending probe requests
* each probe request calls ath_raw_xmit(), which grabs ATH_LOCK for
the duration of the TX.

Then for normal TX completion:

* ATH_LOCK is grabbed;
* the completed frame has net80211_free_node() called, which grabs the comlock

.. and the above is a very obvious LOR.

I'm not sure how to resolve/fix this without either:

* abandoning my idea for locking the ath driver this way and instead
having to shoehorn in some more complicated state change / taskqueue
drain code (eg so on an operation change, all RX/TX is suspended in
its entirety before the reset occurs); which will require some
net80211 cooperation as the ic_raw_xmit() API can be called by any
thing, and is typically done without any locks being held (except for
the scan code example), so it's likely this will require some
complicated hackery to avoid this;
* fix the scan cache code to not hold the comlock whilst TX'ing probe
request frames - and this likely requires introducing some kind of
generation count to the scan cache contents and if the generation
count changes, the scan process restarts TX'ing probe frames or
something.

That said, this still doesn't fix all of the ath locking problems (and
likely some net80211 locking problems too), which seem increasingly
like they should be fixed, as they seem to be making my 802.11n ath
work _much_ more complicated than it needs to be..

So, I'd like some testing of the attached patch against  my if_ath_tx
branch, and I'd like some feedback/comments. You can trigger beacon
stuck conditions by:

# sysctl dev.ath.X.forcebstuck=1

So you can spam that and generate errors/resets (along with the
occasional hardware error, which is kind of surprising, and I'm going
to try and track down.)

Thanks!



Adrian

--20cf30363cef507c7704b0190203
Content-Type: application/octet-stream; name="lock-enable-9.diff"
Content-Disposition: attachment; filename="lock-enable-9.diff"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gu6gs1f70

SW5kZXg6IHN5cy9kZXYvYXRoL2lmX2F0aF90eC5jCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9kZXYvYXRo
L2lmX2F0aF90eC5jCShyZXZpc2lvbiAyMjY2OTEpCisrKyBzeXMvZGV2L2F0aC9pZl9hdGhfdHgu
Ywkod29ya2luZyBjb3B5KQpAQCAtNTAxLDYgKzUwMSwzMCBAQAogCUtBU1NFUlQodHhxLT5heHFf
cW51bSAhPSBBVEhfVFhRX1NXUSwKIAkgICAgICgiYXRoX3R4X2hhbmRvZmZfaHcgY2FsbGVkIGZv
ciBtY2FzdCBxdWV1ZSIpKTsKIAorCUFUSF9MT0NLX0FTU0VSVChzYyk7CisJaWYgKHNjLT5zY19p
bl9yZXNldCkgeworCQlkZXZpY2VfcHJpbnRmKHNjLT5zY19kZXYsICIlczogY2FsbGVkIHdpdGgg
c2NfaW5fcmVzZXQgIT0gMFxuIiwKKwkJICAgIF9fZnVuY19fKTsKKwkJRFBSSU5URihzYywgQVRI
X0RFQlVHX1hNSVQsCisJCSAgICAiJXM6IHF1ZXVlZDogVFhEUFsldV0gPSAlcCAoJXApIGRlcHRo
ICVkXG4iLAorCQkgICAgX19mdW5jX18sIHR4cS0+YXhxX3FudW0sCisJCSAgICAoY2FkZHJfdCli
Zi0+YmZfZGFkZHIsIGJmLT5iZl9kZXNjLAorCQkgICAgdHhxLT5heHFfZGVwdGgpOworCQlBVEhf
VFhRX0lOU0VSVF9UQUlMKHR4cSwgYmYsIGJmX2xpc3QpOworCQlpZiAoYmYtPmJmX3N0YXRlLmJm
c19hZ2dyKQorCQkJdHhxLT5heHFfYWdncl9kZXB0aCsrOworCQkvKgorCQkgKiBXZSBzdGlsbCBo
YXZlIHRvIGxpbmsgZGVzY3JpcHRvcnMgaGVyZToKKwkJICogd2hlbiBETUEgaXMgcmVzdGFydGVk
LCB0aGVzZSBuZWVkIHRvIGJlCisJCSAqIHByb3Blcmx5IGNoYWluZWQgb3IgdGhlIERNQSBlbmdp
bmUgd2lsbAorCQkgKiBnZXQgdXBzZXQuCisJCSAqLworCQlpZiAodHhxLT5heHFfbGluayAhPSBO
VUxMKQorCQkJKnR4cS0+YXhxX2xpbmsgPSBiZi0+YmZfZGFkZHI7CisJCXR4cS0+YXhxX2xpbmsg
PSAmYmYtPmJmX2xhc3Rkcy0+ZHNfbGluazsKKwkJcmV0dXJuOworCX0KKwogCS8qIEZvciBub3cs
IHNvIG5vdCB0byBnZW5lcmF0ZSB3aGl0ZXNwYWNlIGRpZmZzICovCiAJaWYgKDEpIHsKICNpZmRl
ZiBJRUVFODAyMTFfU1VQUE9SVF9URE1BCkBAIC0xNjg4LDYgKzE3MTIsMjIgQEAKIAlzdHJ1Y3Qg
YXRoX2J1ZiAqYmY7CiAJaW50IGVycm9yOwogCisJQVRIX0xPQ0soc2MpOworCXNjLT5zY19pbl90
eHNlbmQrKzsKKwkvKgorCSAqIElmIHdlJ3JlIGNhbGxlZCBkdXJpbmcgYSByZXNldCwganVzdCBm
YWlsLgorCSAqIEl0J2QgYmUgbmljZSBpZiB0aGUgbmV0ODAyMTEgc3RhY2sgd291bGQgYWxsb3cg
dXMgdG8gYnVmZmVyCisJICogcmF3L21hbmFnZW1lbnQgZnJhbWVzLgorCSAqCisJICogQWxsb3cg
aXQgdG8gYmUgY2FsbGVkIGR1cmluZyBhIG5vbi1yZXNldCBSWC4KKwkgKi8KKwlpZiAoc2MtPnNj
X2luX3Jlc2V0KSB7CisJCWRldmljZV9wcmludGYoc2MtPnNjX2RldiwKKwkJICAgICIlczogc2Nf
aW5fcmVzZXQ9JWQ7IGJhaWxpbmdcbiIsIF9fZnVuY19fLCBzYy0+c2NfaW5fcmVzZXQpOworCQll
cnJvciA9IEVJTzsKKwkJZ290byBiYWQ7CisJfQorCiAJaWYgKChpZnAtPmlmX2Rydl9mbGFncyAm
IElGRl9EUlZfUlVOTklORykgPT0gMCB8fCBzYy0+c2NfaW52YWxpZCkgewogCQlEUFJJTlRGKHNj
LCBBVEhfREVCVUdfWE1JVCwgIiVzOiBkaXNjYXJkIGZyYW1lLCAlcyIsIF9fZnVuY19fLAogCQkg
ICAgKGlmcC0+aWZfZHJ2X2ZsYWdzICYgSUZGX0RSVl9SVU5OSU5HKSA9PSAwID8KQEAgLTE3Mjks
NyArMTc2OSw4IEBACiAJc2MtPnNjX3dkX3RpbWVyID0gNTsKIAlpZnAtPmlmX29wYWNrZXRzKys7
CiAJc2MtPnNjX3N0YXRzLmFzdF90eF9yYXcrKzsKLQorCXNjLT5zY19pbl90eHNlbmQtLTsKKwlB
VEhfVU5MT0NLKHNjKTsKIAlyZXR1cm4gMDsKIGJhZDI6CiAJQVRIX1RYQlVGX0xPQ0soc2MpOwpA
QCAtMTczOCw2ICsxNzc5LDggQEAKIGJhZDoKIAlpZnAtPmlmX29lcnJvcnMrKzsKIAlzYy0+c2Nf
c3RhdHMuYXN0X3R4X3Jhd19mYWlsKys7CisJc2MtPnNjX2luX3R4c2VuZC0tOworCUFUSF9VTkxP
Q0soc2MpOwogCWllZWU4MDIxMV9mcmVlX25vZGUobmkpOwogCXJldHVybiBlcnJvcjsKIH0KQEAg
LTM3MjEsNiArMzc2NCw3IEBACiAJICovCiAJciA9IHNjLT5zY19hZGRiYV9yZXNwb25zZShuaSwg
dGFwLCBzdGF0dXMsIGNvZGUsIGJhdGltZW91dCk7CiAKKwlBVEhfTE9DSyhzYyk7CiAJQVRIX1RY
UV9MT0NLKHNjLT5zY19hYzJxW2F0aWQtPmFjXSk7CiAJLyoKIAkgKiBYWFggZGlydHkhCkBAIC0z
NzI4LDggKzM3NzIsMTEgQEAKIAkgKiBSZWFkIGFib3ZlIGZvciBtb3JlIGluZm9ybWF0aW9uLgog
CSAqLwogCXRhcC0+dHhhX3N0YXJ0ID0gbmktPm5pX3R4c2Vxc1t0aWRdOworCXNjLT5zY19pbl90
eHNlbmQrKzsKIAlhdGhfdHhfdGlkX3Jlc3VtZShzYywgYXRpZCk7CisJc2MtPnNjX2luX3R4c2Vu
ZC0tOwogCUFUSF9UWFFfVU5MT0NLKHNjLT5zY19hYzJxW2F0aWQtPmFjXSk7CisJQVRIX1VOTE9D
SyhzYyk7CiAJcmV0dXJuIHI7CiB9CiAKQEAgLTM3NTgsNyArMzgwNSwxMSBAQAogCSAqIGl0J2xs
IHNldCB0aGUgY2xlYW51cCBmbGFnLCBhbmQgaXQnbGwgYmUgdW5wYXVzZWQgb25jZQogCSAqIHRo
aW5ncyBoYXZlIGJlZW4gY2xlYW5lZCB1cC4KIAkgKi8KKwlBVEhfTE9DSyhzYyk7CisJc2MtPnNj
X2luX3R4c2VuZCsrOwogCWF0aF90eF9jbGVhbnVwKHNjLCBhbiwgdGlkKTsKKwlzYy0+c2NfaW5f
dHhzZW5kLS07CisJQVRIX1VOTE9DSyhzYyk7CiB9CiAKIC8qCkBAIC0zNzk0LDkgKzM4NDUsMTMg
QEAKIAkgKiBYWFggVElEIGhlcmUgb3IgaXQnbGwgbmV2ZXIgYmUgZG9uZS4KIAkgKi8KIAlpZiAo
c3RhdHVzID09IDAgfHwgYXR0ZW1wdHMgPT0gNTApIHsKKwkJQVRIX0xPQ0soc2MpOwogCQlBVEhf
VFhRX0xPQ0soc2MtPnNjX2FjMnFbYXRpZC0+YWNdKTsKKwkJc2MtPnNjX2luX3R4c2VuZCsrOwog
CQlhdGhfdHhfdGlkX3Jlc3VtZShzYywgYXRpZCk7CisJCXNjLT5zY19pbl90eHNlbmQtLTsKIAkJ
QVRIX1RYUV9VTkxPQ0soc2MtPnNjX2FjMnFbYXRpZC0+YWNdKTsKKwkJQVRIX1VOTE9DSyhzYyk7
CiAJfQogfQogCkBAIC0zODIwLDcgKzM4NzUsMTEgQEAKIAlzYy0+c2NfYWRkYmFfcmVzcG9uc2Vf
dGltZW91dChuaSwgdGFwKTsKIAogCS8qIFVucGF1c2UgdGhlIFRJRDsgd2hpY2ggcmVzY2hlZHVs
ZXMgaXQgKi8KKwlBVEhfTE9DSyhzYyk7CiAJQVRIX1RYUV9MT0NLKHNjLT5zY19hYzJxW2F0aWQt
PmFjXSk7CisJc2MtPnNjX2luX3R4c2VuZCsrOwogCWF0aF90eF90aWRfcmVzdW1lKHNjLCBhdGlk
KTsKKwlzYy0+c2NfaW5fdHhzZW5kLS07CiAJQVRIX1RYUV9VTkxPQ0soc2MtPnNjX2FjMnFbYXRp
ZC0+YWNdKTsKKwlBVEhfVU5MT0NLKHNjKTsKIH0KSW5kZXg6IHN5cy9kZXYvYXRoL2lmX2F0aF9t
aXNjLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gc3lzL2Rldi9hdGgvaWZfYXRoX21pc2MuaAkocmV2aXNpb24g
MjI2NTU5KQorKysgc3lzL2Rldi9hdGgvaWZfYXRoX21pc2MuaAkod29ya2luZyBjb3B5KQpAQCAt
NTcsMTUgKzU3LDE0IEBACiBleHRlcm4gdm9pZCBhdGhfZnJlZWJ1ZihzdHJ1Y3QgYXRoX3NvZnRj
ICpzYywgc3RydWN0IGF0aF9idWYgKmJmKTsKIAogZXh0ZXJuIGludCBhdGhfcmVzZXQoc3RydWN0
IGlmbmV0ICosIEFUSF9SRVNFVF9UWVBFKTsKK2V4dGVybiBpbnQgYXRoX3Jlc2V0X2xvY2tlZChz
dHJ1Y3QgaWZuZXQgKiwgQVRIX1JFU0VUX1RZUEUpOwogZXh0ZXJuIHZvaWQgYXRoX3R4X2RyYWlu
dHhxKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX3R4cSAqdHhxKTsKIGV4dGVybiB2
b2lkIGF0aF90eF9kZWZhdWx0X2NvbXAoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBhdGhf
YnVmICpiZiwKIAkgICAgaW50IGZhaWwpOwogZXh0ZXJuIHZvaWQgYXRoX3R4X3VwZGF0ZV9yYXRl
Y3RybChzdHJ1Y3QgYXRoX3NvZnRjICpzYywKIAkgICAgc3RydWN0IGllZWU4MDIxMV9ub2RlICpu
aSwgc3RydWN0IGF0aF9yY19zZXJpZXMgKnJjLAogCSAgICBzdHJ1Y3QgYXRoX3R4X3N0YXR1cyAq
dHMsIGludCBmcm1sZW4sIGludCBuZnJhbWVzLCBpbnQgbmJhZCk7Ci0KIGV4dGVybiB2b2lkIGF0
aF90eF9mcmVlYnVmKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX2J1ZiAqYmYsCiAg
ICAgaW50IHN0YXR1cyk7Ci1leHRlcm4gdm9pZCBhdGhfdHhfc2NoZWRfcHJvY19zY2hlZChzdHJ1
Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF90eHEgKnR4cSk7CiAKICNlbmRpZgpJbmRleDog
c3lzL2Rldi9hdGgvaWZfYXRoLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL2Rldi9hdGgvaWZfYXRoLmMJ
KHJldmlzaW9uIDIyNjY5NCkKKysrIHN5cy9kZXYvYXRoL2lmX2F0aC5jCSh3b3JraW5nIGNvcHkp
CkBAIC0xMzEsNiArMTMxLDcgQEAKIHN0YXRpYyB2b2lkCWF0aF9zdG9wX2xvY2tlZChzdHJ1Y3Qg
aWZuZXQgKik7CiBzdGF0aWMgdm9pZAlhdGhfc3RvcChzdHJ1Y3QgaWZuZXQgKik7CiBzdGF0aWMg
dm9pZAlhdGhfc3RhcnQoc3RydWN0IGlmbmV0ICopOworc3RhdGljIHZvaWQJYXRoX3N0YXJ0X2xv
Y2tlZChzdHJ1Y3QgaWZuZXQgKik7CiBzdGF0aWMgaW50CWF0aF9yZXNldF92YXAoc3RydWN0IGll
ZWU4MDIxMXZhcCAqLCB1X2xvbmcpOwogc3RhdGljIGludAlhdGhfbWVkaWFfY2hhbmdlKHN0cnVj
dCBpZm5ldCAqKTsKIHN0YXRpYyB2b2lkCWF0aF93YXRjaGRvZyh2b2lkICopOwpAQCAtODY5LDYg
Kzg3MCw2MiBAQAogCXJldHVybiBmcmVlOwogfQogCisvKgorICogVGhpcyBpcyBhIGRpYWdub3N0
aWMgcm91dGluZSB3aGljaCBzaG91bGQgYmUgcnVuIHdoZW5ldmVyCisgKiBhbnkgcmVzZXQtcmVs
YXRlZCByb3V0aW5lIGdyYWJzIHRoZSBBVEhfTE9DSy4KKyAqCisgKiBTaW5jZSBhdGhfcnhfcHJv
YygpIC1yZWxlYXNlcy0gQVRIX0xPQ0sgZHVyaW5nIG5vcm1hbCBvcGVyYXRpb24sCisgKiBpdCBp
cyBlbnRpcmVseSBwb3NzaWJsZSB0aGF0IGFub3RoZXIgcGFyYWxsZWwgdGFzayAoZWcgY2hhbm5l
bAorICogY2hhbmdlLCByZXNldCwgVkFQIGFkZC9kZWxldGUsIGV0YykgaXMgYWxzbyBydW5uaW5n
LgorICogSW4gdGhpcyBjYXNlLCB0aGF0J2xsIGJlZ2luIHRvIG9jY3VyIHdoaWxzdCBhdGhfcnhf
cHJvYygpIGlzCisgKiBleGVjdXRpbmcuCisgKgorICogQW5kIGl0IGdldHMgYmV0dGVyLiBTaW5j
ZSBhdGhfcnhfcHJvYygpIGlzIG5vdyBiZWluZyBjYWxsZWQgZHVyaW5nCisgKiB0aGUgcmVzZXQs
IGNoYW5uZWwgY2hhbmdlLCBldGMgcGF0aCAoaWUsIGFueXdoZXJlIHdoZXJlIGZyYW1lcworICog
bmVlZCB0byBiZSBkcmFpbmVkKSwgQVRIX0xPQ0sgaXMgYmVpbmcgcmVsZWFzZWQgYW5kIHJlLWFz
c2VydGVkLgorICogU28gaXQgYmVjb21lcyBwb3NzaWJsZSBmb3IgdGhvc2UgdGFza3MgdG8gc3Rh
cnQgdGFraW5nIG92ZXIgZnJvbQorICogZWFjaCBvdGhlci4KKyAqCisgKiBGb3Igbm93LCBpZiBz
Y19pbl9yeHRhc2tsZXQgb3Igc2NfaW5fcnhwcm9jIGlzID4wLCB3ZSBwcmludCBvdXQKKyAqIGEg
d2FybmluZyBzbyB0aGF0IHRoZSByZWFzb24gZm9yIHNhaWQgaXNzdWUgY2FuIGJlIGludmVzdGln
YXRlZC4KKyAqCisgKiBJbiB0aGUgZnV0dXJlLCByb3V0aW5lcyB3aGljaCBhcmUgdHJ5aW5nIHRv
IGRvIHJlc2V0IHR5cGUgYWN0aW9ucworICogd2lsbCBsaWtlbHkgbmVlZCB0byBkbyBzb21lIGtp
bmQgb2YgbG9jayByZWFjcXVpc2l0aW9uIG9uY2UgdGhlCisgKiByeHByb2MgaGFzIGNvbXBsZXRl
ZC4gSSdtIG5vdCBlbnRpcmVseSBzdXJlIG9mIHRoZSBjb3JyZWN0IHdheQorICogdG8gaGFuZGxl
IHRoYXQgdGhvdWdoLgorICoKKyAqIFdlIGRvbid0IGhhdmUgdG8gY2hlY2sgZm9yIFRYIHN0YXRl
IC0gdGhlIFRYIGxvY2sgaXMgaGVsZCBmb3IKKyAqIHRoZSBkdXJhdGlvbiBvZiB0aGUgVFggZnVu
Y3Rpb25zLCBzbyByZXNldCByb3V0aW5lcyB3b24ndCBjbGFzaAorICogd2l0aCBUWC4gVFggbWF5
IG9jY3VyIGluc2lkZSBhIHJlc2V0IHJvdXRpbmUgLSBpZSwgd2hlbiB0aGUKKyAqIFJYIGNvZGUg
cmVsZWFzZXMgdGhlIEFUSF9MT0NLIC0gYnV0IGFzIHNjLT5zY19pbl9yZXNldCA+IDAsCisgKiB0
aGUgVFggcm91dGluZXMgd29uJ3QgY29udGludWUuCisgKgorICogSSdtIHN0aWxsIG5vdCBzdXJl
IHdoYXQgdG8gZG8gaWYga2V5Y2FjaGUgY2hhbmdlcyBjb21lIHRocm91Z2gKKyAqIGR1cmluZyBh
bGwgb2YgdGhpcyAtIEkgc2hvdWxkIGxvb2sgaW50byB0aGlzLi4KKyAqCisgKiBGaW5hbGx5LCB3
ZSdsbCBsb2cgaWYgc2NfaW5fcmVzZXQgPiAxIC0gdGhhdCBtZWFucyB0aGF0IHNvbWUga2luZAor
ICogb2YgcmVjdXJzaW9uIG9yIHBhcmFsbGVsIHJlc2V0IHBhdGggaGFzIG9jY3VyZWQgYW5kIGl0
J3Mgbm90IGNsZWFyCisgKiB3aGljaCBvcmRlciB3aGF0IHdpbGwgcmV0dXJuIGluLiBUaGlzIHNo
b3VsZCBiZSBmaXhlZC4KKyAqLworc3RhdGljIHZvaWQgX2F0aF9sb2NrX3J4X2NoZWNrKHN0cnVj
dCBhdGhfc29mdGMgKnNjLCBjb25zdCBjaGFyICpmaWxlLAorICAgIGludCBsaW5lKQoreworCUFU
SF9MT0NLX0FTU0VSVChzYyk7CisJaWYgKHNjLT5zY19pbl9yeHRhc2tsZXQgfHwgc2MtPnNjX2lu
X3J4cHJvYykgeworCQlkZXZpY2VfcHJpbnRmKHNjLT5zY19kZXYsCisJCSAgICAiJXM6ICVzOiVk
OiByeHRhc2tsZXQ9JWQsIHJ4cHJvYz0lZCwgZGFuZ2VyIVxuIiwKKwkJICAgIF9fZnVuY19fLCBm
aWxlLCBsaW5lLAorCQkgICAgc2MtPnNjX2luX3J4dGFza2xldCwgc2MtPnNjX2luX3J4cHJvYyk7
CisJfQorCWlmIChzYy0+c2NfaW5fcmVzZXQgPiAxKSB7CisJCWRldmljZV9wcmludGYoc2MtPnNj
X2RldiwKKwkJICAgICIlczogJXM6JWQ6IHNjX2luX3Jlc2V0ID4gMSAoPSAlZCksIGRhbmdlciFc
biIsCisJCSAgICBfX2Z1bmNfXywgZmlsZSwgbGluZSwgc2MtPnNjX2luX3Jlc2V0KTsKKwl9Cit9
CisKKyNkZWZpbmUJYXRoX2xvY2tfcnhfY2hlY2soc2MpCV9hdGhfbG9ja19yeF9jaGVjaygoc2Mp
LCBfX0ZJTEVfXywgX19MSU5FX18pCisKIHN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExdmFwICoKIGF0
aF92YXBfY3JlYXRlKHN0cnVjdCBpZWVlODAyMTFjb20gKmljLAogCWNvbnN0IGNoYXIgbmFtZVtJ
Rk5BTVNJWl0sIGludCB1bml0LCBpbnQgb3Btb2RlLCBpbnQgZmxhZ3MsCkBAIC04ODcsNiArOTQ0
LDEwIEBACiAJSUVFRTgwMjExX0FERFJfQ09QWShtYWMsIG1hYzApOwogCiAJQVRIX0xPQ0soc2Mp
OworCXNjLT5zY19pbl9yZXNldCsrOworCS8qIFhYWCBUT0RPOiBzdXNwZW5kIHRhc2txdWV1ZSwg
Zmx1c2ggdGFza3F1ZXVlIG9wcywgc3VzcGVuZCBSWD8gKi8KKwlhdGhfbG9ja19yeF9jaGVjayhz
Yyk7CisKIAlpY19vcG1vZGUgPSBvcG1vZGU7CQkvKiBkZWZhdWx0IHRvIG9wbW9kZSBvZiBuZXcg
dmFwICovCiAJc3dpdGNoIChvcG1vZGUpIHsKIAljYXNlIElFRUU4MDIxMV9NX1NUQToKQEAgLTk4
NSw2ICsxMDQ2LDggQEAKIAllcnJvciA9IGllZWU4MDIxMV92YXBfc2V0dXAoaWMsIHZhcCwgbmFt
ZSwgdW5pdCwgb3Btb2RlLCBmbGFncywKIAkgICAgYnNzaWQsIG1hYyk7CiAJQVRIX0xPQ0soc2Mp
OworCWF0aF9sb2NrX3J4X2NoZWNrKHNjKTsKKwogCWlmIChlcnJvciAhPSAwKSB7CiAJCWRldmlj
ZV9wcmludGYoc2MtPnNjX2RldiwgIiVzOiBlcnJvciAlZCBjcmVhdGluZyB2YXBcbiIsCiAJCSAg
ICBfX2Z1bmNfXywgZXJyb3IpOwpAQCAtMTEwNSw2ICsxMTY4LDcgQEAKIAkJICovCiAJCXNjLT5z
Y19zd2JtaXNzID0gMTsKIAl9CisJc2MtPnNjX2luX3Jlc2V0LS07CiAJQVRIX1VOTE9DSyhzYyk7
CiAKIAkvKiBjb21wbGV0ZSBzZXR1cCAqLwpAQCAtMTExNSw2ICsxMTc5LDcgQEAKIAlhdGhfaGFs
X3NldGJzc2lkbWFzayhzYy0+c2NfYWgsIHNjLT5zY19od2Jzc2lkbWFzayk7CiBiYWQ6CiAJZnJl
ZShhdnAsIE1fODAyMTFfVkFQKTsKKwlzYy0+c2NfaW5fcmVzZXQtLTsKIAlBVEhfVU5MT0NLKHNj
KTsKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTExMzAsMTggKzExOTUsMjUgQEAKIAogCURQUklOVEYo
c2MsIEFUSF9ERUJVR19SRVNFVCwgIiVzOiBjYWxsZWRcbiIsIF9fZnVuY19fKTsKIAorCS8qIFhY
WCBUT0RPOiBzdXNwZW5kIHRhc2txdWV1ZSwgZmx1c2ggdGFza3F1ZXVlIG9wcywgc3VzcGVuZCBS
WD8gKi8KKwlBVEhfTE9DSyhzYyk7CisJc2MtPnNjX2luX3Jlc2V0Kys7CisKIAlpZiAoaWZwLT5p
Zl9kcnZfZmxhZ3MgJiBJRkZfRFJWX1JVTk5JTkcpIHsKIAkJLyoKIAkJICogUXVpZXNjZSB0aGUg
aGFyZHdhcmUgd2hpbGUgd2UgcmVtb3ZlIHRoZSB2YXAuICBJbgogCQkgKiBwYXJ0aWN1bGFyIHdl
IG5lZWQgdG8gcmVjbGFpbSBhbGwgcmVmZXJlbmNlcyB0bwogCQkgKiB0aGUgdmFwIHN0YXRlIGJ5
IGFueSBmcmFtZXMgcGVuZGluZyBvbiB0aGUgdHggcXVldWVzLgogCQkgKi8KKwkJYXRoX2xvY2tf
cnhfY2hlY2soc2MpOwogCQlhdGhfaGFsX2ludHJzZXQoYWgsIDApOwkJLyogZGlzYWJsZSBpbnRl
cnJ1cHRzICovCiAJCWF0aF9kcmFpbnR4cShzYywgQVRIX1JFU0VUX0RFRkFVTFQpOwkJLyogc3Rv
cCBodyB4bWl0IHNpZGUgKi8KLQkJLyogWFhYIERvIGFsbCBmcmFtZXMgZnJvbSBhbGwgdmFwcy9u
b2RlcyBuZWVkIGRyYWluaW5nIGhlcmU/ICovCiAJCWF0aF9zdG9wcmVjdihzYyk7CQkvKiBzdG9w
IHJlY3Ygc2lkZSAqLworCQkvKiBYWFggdGhpcyBkcm9wcyB0aGUgbG9jayB0ZW1wb3JhcmlseSAq
LworCQlhdGhfcnhfcHJvYyhzYywgMCk7CiAJfQogCisJQVRIX1VOTE9DSyhzYyk7CiAJaWVlZTgw
MjExX3ZhcF9kZXRhY2godmFwKTsKIAogCS8qCkBAIC0xMTYxLDkgKzEyMzMsMTAgQEAKIAkgKiBj
YWxsISkKIAkgKi8KIAorCUFUSF9MT0NLKHNjKTsKKwlhdGhfbG9ja19yeF9jaGVjayhzYyk7CiAJ
YXRoX2RyYWludHhxKHNjLCBBVEhfUkVTRVRfREVGQVVMVCk7CiAKLQlBVEhfTE9DSyhzYyk7CiAJ
LyoKIAkgKiBSZWNsYWltIGJlYWNvbiBzdGF0ZS4gIE5vdGUgdGhpcyBtdXN0IGJlIGRvbmUgYmVm
b3JlCiAJICogdGhlIHZhcCBpbnN0YW5jZSBpcyByZWNsYWltZWQgYXMgd2UgbWF5IGhhdmUgYSBy
ZWZlcmVuY2UKQEAgLTEyMzAsNiArMTMwMyw3IEBACiAJCX0KIAkJYXRoX2hhbF9pbnRyc2V0KGFo
LCBzYy0+c2NfaW1hc2spOwogCX0KKwlzYy0+c2NfaW5fcmVzZXQtLTsKIAlBVEhfVU5MT0NLKHNj
KTsKIH0KIApAQCAtMTMzNSw2ICsxNDA5LDEwIEBACiAKIC8qCiAgKiBJbnRlcnJ1cHQgaGFuZGxl
ci4gIE1vc3Qgb2YgdGhlIGFjdHVhbCBwcm9jZXNzaW5nIGlzIGRlZmVycmVkLgorICoKKyAqIEl0
IG1heSBiZSBhIGJhZCBpZGVhIHRvIGdyYWIgdGhlIEFUSF9MT0NLIGhlcmUgdG8gcHJvdGVjdCBr
aWNrcGN1LgorICogUGVyaGFwcyBhIGRpZmZlcmVudCBsb2NrIGlzIG5lZWRlZC4gVGhhdCB3YXkg
YXRoX2ludHIoKSBkb2Vzbid0IGVuZCB1cAorICogd2FpdGluZyBmb3IgYSBsb25nIHRpbWUgdG8g
aGFuZGxlIGFuIGludGVycnVwdCB3aGVuIFRYL1JYIGlzIGJ1c3kuCiAgKi8KIHZvaWQKIGF0aF9p
bnRyKHZvaWQgKmFyZykKQEAgLTE2NTMsNiArMTczMSw5IEBACiAJCV9fZnVuY19fLCBpZnAtPmlm
X2ZsYWdzKTsKIAogCUFUSF9MT0NLKHNjKTsKKwlzYy0+c2NfaW5fcmVzZXQrKzsKKwkvKiBYWFgg
VE9ETzogc3VzcGVuZCB0YXNrcXVldWUsIGZsdXNoIHRhc2txdWV1ZSBvcHMsIHN1c3BlbmQgUlg/
ICovCisJYXRoX2xvY2tfcnhfY2hlY2soc2MpOwogCS8qCiAJICogU3RvcCBhbnl0aGluZyBwcmV2
aW91c2x5IHNldHVwLiAgVGhpcyBpcyBzYWZlCiAJICogd2hldGhlciB0aGlzIGlzIHRoZSBmaXJz
dCB0aW1lIHRocm91Z2ggb3Igbm90LgpAQCAtMTc0MCw2ICsxODIxLDcgQEAKIAljYWxsb3V0X3Jl
c2V0KCZzYy0+c2Nfd2RfY2gsIGh6LCBhdGhfd2F0Y2hkb2csIHNjKTsKIAlhdGhfaGFsX2ludHJz
ZXQoYWgsIHNjLT5zY19pbWFzayk7CiAKKwlzYy0+c2NfaW5fcmVzZXQtLTsKIAlBVEhfVU5MT0NL
KHNjKTsKIAogI2lmZGVmIEFUSF9UWDk5X0RJQUcKQEAgLTE3OTUsNiArMTg3Nyw4IEBACiAJCWF0
aF9kcmFpbnR4cShzYywgQVRIX1JFU0VUX0RFRkFVTFQpOwogCQlpZiAoIXNjLT5zY19pbnZhbGlk
KSB7CiAJCQlhdGhfc3RvcHJlY3Yoc2MpOworCQkJLyogWFhYIHRoaXMgZHJvcHMgdGhlIGxvY2sg
dGVtcG9yYXJpbHkgKi8KKwkJCWF0aF9yeF9wcm9jKHNjLCAwKTsKIAkJCWF0aF9oYWxfcGh5ZGlz
YWJsZShhaCk7CiAJCX0gZWxzZQogCQkJc2MtPnNjX3J4bGluayA9IE5VTEw7CkBAIC0xODA4LDEw
ICsxODkyLDI0IEBACiAJc3RydWN0IGF0aF9zb2Z0YyAqc2MgPSBpZnAtPmlmX3NvZnRjOwogCiAJ
QVRIX0xPQ0soc2MpOworCWF0aF9sb2NrX3J4X2NoZWNrKHNjKTsKIAlhdGhfc3RvcF9sb2NrZWQo
aWZwKTsKIAlBVEhfVU5MT0NLKHNjKTsKIH0KIAoraW50CithdGhfcmVzZXQoc3RydWN0IGlmbmV0
ICppZnAsIEFUSF9SRVNFVF9UWVBFIHJlc2V0X3R5cGUpCit7CisJc3RydWN0IGF0aF9zb2Z0YyAq
c2MgPSBpZnAtPmlmX3NvZnRjOworCWludCByOworCisJQVRIX0xPQ0soc2MpOworCWF0aF9sb2Nr
X3J4X2NoZWNrKHNjKTsKKwlyID0gYXRoX3Jlc2V0X2xvY2tlZChpZnAsIHJlc2V0X3R5cGUpOwor
CUFUSF9VTkxPQ0soc2MpOworCXJldHVybiByOworfQorCiAvKgogICogUmVzZXQgdGhlIGhhcmR3
YXJlIHcvbyBsb3Npbmcgb3BlcmF0aW9uYWwgc3RhdGUuICBUaGlzIGlzCiAgKiBiYXNpY2FsbHkg
YSBtb3JlIGVmZmljaWVudCB3YXkgb2YgZG9pbmcgYXRoX3N0b3AsIGF0aF9pbml0LApAQCAtMTgy
MCw3ICsxOTE4LDcgQEAKICAqIHRvIHJlc2V0IG9yIHJlbG9hZCBoYXJkd2FyZSBzdGF0ZS4KICAq
LwogaW50Ci1hdGhfcmVzZXQoc3RydWN0IGlmbmV0ICppZnAsIEFUSF9SRVNFVF9UWVBFIHJlc2V0
X3R5cGUpCithdGhfcmVzZXRfbG9ja2VkKHN0cnVjdCBpZm5ldCAqaWZwLCBBVEhfUkVTRVRfVFlQ
RSByZXNldF90eXBlKQogewogCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gaWZwLT5pZl9zb2Z0YzsK
IAlzdHJ1Y3QgaWVlZTgwMjExY29tICppYyA9IGlmcC0+aWZfbDJjb207CkBAIC0xODI5LDE4ICsx
OTI3LDE1IEBACiAKIAlEUFJJTlRGKHNjLCBBVEhfREVCVUdfUkVTRVQsICIlczogY2FsbGVkXG4i
LCBfX2Z1bmNfXyk7CiAKLQlBVEhfTE9DSyhzYyk7CisJQVRIX0xPQ0tfQVNTRVJUKHNjKTsKIAlz
Yy0+c2NfaW5fcmVzZXQrKzsKLQlBVEhfVU5MT0NLKHNjKTsKKwlhdGhfbG9ja19yeF9jaGVjayhz
Yyk7CiAKIAlhdGhfaGFsX2ludHJzZXQoYWgsIDApOwkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICov
CiAJYXRoX2RyYWludHhxKHNjLCByZXNldF90eXBlKTsJLyogc3RvcCB4bWl0IHNpZGUgKi8KLQkv
KgotCSAqIFhYWCBEb24ndCBmbHVzaCBpZiBBVEhfUkVTRVRfTk9MT1NTO2J1dCB3ZSBoYXZlIHRv
IGZpcnN0Ci0JICogWFhYIG5lZWQgdG8gZW5zdXJlIHRoaXMgZG9lc24ndCByYWNlIHdpdGggYW4g
b3V0c3RhbmRpbmcKLQkgKiBYWFggdGFza3F1ZXVlIGNhbGwuCi0JICovCiAJYXRoX3N0b3ByZWN2
KHNjKTsJCS8qIHN0b3AgcmVjdiBzaWRlICovCisJLyogWFhYIHRoaXMgZHJvcHMgdGhlIGxvY2sg
dGVtcG9yYXJpbHkgKi8KKwlhdGhfcnhfcHJvYyhzYywgMCk7CiAJYXRoX3NldHRraXBtaWMoc2Mp
OwkJLyogY29uZmlndXJlIFRLSVAgTUlDIGhhbmRsaW5nICovCiAJLyogTkI6IGluZGljYXRlIGNo
YW5uZWwgY2hhbmdlIHNvIHdlIGRvIGEgZnVsbCByZXNldCAqLwogCWlmICghYXRoX2hhbF9yZXNl
dChhaCwgc2MtPnNjX29wbW9kZSwgaWMtPmljX2N1cmNoYW4sIEFIX1RSVUUsICZzdGF0dXMpKQpA
QCAtMTg2NywxMyArMTk2MiwyNiBAQAogI2VuZGlmCiAJCQlhdGhfYmVhY29uX2NvbmZpZyhzYywg
TlVMTCk7CiAJfQorCisJLyogUmVzdGFydCBUWDsgc2NoZWR1bGUgVFggZnJhbWVzIGlmIG5lZWRl
ZCAqLworCWlmIChyZXNldF90eXBlID09IEFUSF9SRVNFVF9OT0xPU1MpIHsKKwkJaW50IGk7CisK
KwkJZm9yIChpID0gMDsgaSA8IEhBTF9OVU1fVFhfUVVFVUVTOyBpKyspIHsKKwkJCWlmIChBVEhf
VFhRX1NFVFVQKHNjLCBpKSkgeworCQkJCUFUSF9UWFFfTE9DSygmc2MtPnNjX3R4cVtpXSk7CisJ
CQkJYXRoX3R4cV9yZXN0YXJ0X2RtYShzYywgJnNjLT5zY190eHFbaV0pOworCQkJCWF0aF90eHFf
c2NoZWQoc2MsICZzYy0+c2NfdHhxW2ldKTsKKwkJCQlBVEhfVFhRX1VOTE9DSygmc2MtPnNjX3R4
cVtpXSk7CisJCQl9CisJCX0KKwl9CisKIAlhdGhfaGFsX2ludHJzZXQoYWgsIHNjLT5zY19pbWFz
ayk7CiAKLQlBVEhfTE9DSyhzYyk7CiAJc2MtPnNjX2luX3Jlc2V0LS07Ci0JQVRIX1VOTE9DSyhz
Yyk7CiAKLQlhdGhfc3RhcnQoaWZwKTsJCQkvKiByZXN0YXJ0IHhtaXQgKi8KKwlhdGhfc3RhcnRf
bG9ja2VkKGlmcCk7CQkJLyogcmVzdGFydCB4bWl0ICovCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIw
MTMsMTQgKzIxMjEsNDUgQEAKIGF0aF9zdGFydChzdHJ1Y3QgaWZuZXQgKmlmcCkKIHsKIAlzdHJ1
Y3QgYXRoX3NvZnRjICpzYyA9IGlmcC0+aWZfc29mdGM7CisKKwlBVEhfTE9DSyhzYyk7CisKKwkv
KgorCSAqIFdlIG1heSBiZSBjYWxsZWQgZHVyaW5nIGFuIGFjdGl2ZSByZXNldCBmcm9tIGFub3Ro
ZXIgdGhyZWFkOworCSAqIGF0IHRoaXMgcG9pbnQgd2UganVzdCBkZWZlciB1bnRpbCB0aGUgcmVz
ZXQgaXMgY29tcGxldGUuCisJICogVGhlIHJlc2V0IHdpbGwgY2FsbCBhdGhfc3RhcnRfbG9ja2Vk
IGZvciB1cy4KKwkgKgorCSAqIEZvciBub3csIGRvbid0IGRlZmVyIGlmIGNhbGxlZCBkdXJpbmcg
YSBub24tcmVzZXQgYXRoX3J4X3Byb2M7CisJICogdGhpcyBtYWludGFpbnMgdGhlIHNhbWUgYmVo
YXZpb3VyIHRoYXQgdGhlIGN1cnJlbnQgZHJpdmVyIGNvZGUKKwkgKiBjYW4gZG8gKGllLCBUWCBh
bmQgUlggcGF0aHMgY2FuIGludGVybGVhdmUuKQorCSAqLworCWlmIChzYy0+c2NfaW5fcmVzZXQp
IHsKKwkJZGV2aWNlX3ByaW50ZihzYy0+c2NfZGV2LAorCQkgICAgIiVzOiBzY19pbl9yZXNldD0l
ZDsgc2tpcHBpbmdcbiIsCisJCSAgICAgICAgX19mdW5jX18sIHNjLT5zY19pbl9yZXNldCk7CisJ
fSBlbHNlIHsKKwkJYXRoX3N0YXJ0X2xvY2tlZChpZnApOworCX0KKwlBVEhfVU5MT0NLKHNjKTsK
K30KKworc3RhdGljIHZvaWQKK2F0aF9zdGFydF9sb2NrZWQoc3RydWN0IGlmbmV0ICppZnApCit7
CisJc3RydWN0IGF0aF9zb2Z0YyAqc2MgPSBpZnAtPmlmX3NvZnRjOwogCXN0cnVjdCBpZWVlODAy
MTFfbm9kZSAqbmk7CiAJc3RydWN0IGF0aF9idWYgKmJmOwogCXN0cnVjdCBtYnVmICptLCAqbmV4
dDsKIAlhdGhfYnVmaGVhZCBmcmFnczsKIAlpbnQgdHggPSAwOwogCisJQVRIX0xPQ0tfQVNTRVJU
KHNjKTsKKwogCWlmICgoaWZwLT5pZl9kcnZfZmxhZ3MgJiBJRkZfRFJWX1JVTk5JTkcpID09IDAg
fHwgc2MtPnNjX2ludmFsaWQpCiAJCXJldHVybjsKKworCXNjLT5zY19pbl90eHNlbmQrKzsKKwog
CWZvciAoOzspIHsKIAkJLyoKIAkJICogR3JhYiBhIFRYIGJ1ZmZlciBhbmQgYXNzb2NpYXRlZCBy
ZXNvdXJjZXMuCkBAIC0yMTA1LDYgKzIyNDQsNyBAQAogCiAJCXNjLT5zY193ZF90aW1lciA9IDU7
CiAJfQorCXNjLT5zY19pbl90eHNlbmQtLTsKIH0KIAogc3RhdGljIGludApAQCAtMzQyMSw2ICsz
NTYxLDggQEAKIAlzdHJ1Y3QgbWJ1ZiAqbTsKIAlzdHJ1Y3QgYXRoX2Rlc2MgKmRzOwogCisJQVRI
X0xPQ0tfQVNTRVJUKHNjKTsKKwogCW0gPSBiZi0+YmZfbTsKIAlpZiAobSA9PSBOVUxMKSB7CiAJ
CS8qCkBAIC0zNzE0LDEwICszODU2LDQxIEBACiBhdGhfcnhfdGFza2xldCh2b2lkICphcmcsIGlu
dCBucGVuZGluZykKIHsKIAlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IGFyZzsKKwlzdHJ1Y3QgaWZu
ZXQgKmlmcCA9IHNjLT5zY19pZnA7CiAKIAlDVFIxKEFUSF9LVFJfSU5UUiwgImF0aF9yeF9wcm9j
OiBwZW5kaW5nPSVkIiwgbnBlbmRpbmcpOwogCURQUklOVEYoc2MsIEFUSF9ERUJVR19SWF9QUk9D
LCAiJXM6IHBlbmRpbmcgJXVcbiIsIF9fZnVuY19fLCBucGVuZGluZyk7CisJQVRIX0xPQ0soc2Mp
OworCisJLyoKKwkgKiBJZiB3ZSd2ZSBvY2N1cmVkIHdoaWxzdCB3ZSdyZSBidXN5IGluIGEgcmVz
ZXQsCisJICogbG9nIGEgd2FybmluZyBhbmQgYmFpbC4gVGhpcyBtYXkgb2NjdXIgd2hpbHN0CisJ
ICogYXRoX3J4X3Byb2MoKSBpcyBmbHVzaGluZyBmcmFtZXMgYW5kIHJlbGVhc2VzCisJICogdGhl
IGNvbWxvY2suCisJICovCisJaWYgKHNjLT5zY19pbl9yZXNldCkgeworCQlkZXZpY2VfcHJpbnRm
KHNjLT5zY19kZXYsICIlczogc2NfaW5fcmVzZXQ9JWQsIGJhaWxpbmchXG4iLAorCQkgICAgX19m
dW5jX18sIHNjLT5zY19pbl9yZXNldCk7CisJCXRhc2txdWV1ZV9lbnF1ZXVlX2Zhc3Qoc2MtPnNj
X3RxLCAmc2MtPnNjX3J4dGFzayk7CisJCUFUSF9VTkxPQ0soc2MpOworCQlyZXR1cm47CisJfQor
CXNjLT5zY19pbl9yeHRhc2tsZXQrKzsKIAlhdGhfcnhfcHJvYyhzYywgMSk7CisKKwkvKgorCSAq
IEFnZSBmcmFtZXMgb24gdGhlIEZGIGFzc2VtYmx5IHF1ZXVlOyB0aGVuCisJICoga2ljayBvZmYg
YW5vdGhlciByb3VuZCBvZiBUWC4KKwkgKi8KKwlpZiAoKGlmcC0+aWZfZHJ2X2ZsYWdzICYgSUZG
X0RSVl9PQUNUSVZFKSA9PSAwKSB7CisjaWZkZWYgSUVFRTgwMjExX1NVUFBPUlRfU1VQRVJHCisJ
CWllZWU4MDIxMV9mZl9hZ2VfYWxsKGljLCAxMDApOworI2VuZGlmCisJCWlmICghSUZRX0lTX0VN
UFRZKCZpZnAtPmlmX3NuZCkpCisJCQlhdGhfc3RhcnRfbG9ja2VkKGlmcCk7CisJfQorCXNjLT5z
Y19pbl9yeHRhc2tsZXQtLTsKKwlBVEhfVU5MT0NLKHNjKTsKIH0KIAogc3RhdGljIHZvaWQKQEAg
LTM3NDAsNiArMzkxMywzMSBAQAogCXVfaW50NjRfdCB0c2Y7CiAJaW50IG5wa3RzID0gMDsKIAor
CS8qCisJICogVGhpcyBpcyBzZXBhcmF0ZSB0byBzY19pbl9yeHRhc2tsZXQuCisJICoKKwkgKiBJ
dCdzIHBvc3NpYmxlIHRoYXQgc29tZSBvdGhlciBmdW5jdGlvbiB3aWxsIHRyeQorCSAqIHRvIGNv
bXBsZXRlIHNvbWUgd29yayBvbmNlIHdlIGxldCBnbyBvZiB0aGUgQVRIX0xPQ0sgLQorCSAqIGVn
IGEgcmVzZXQsIGNoYW5uZWwgY2hhbmdlIGZ1bmN0aW9uLiBTaW5jZSB3ZSBkb24ndCB3YW50CisJ
ICogdGhpcyB0byBvY2N1ciwgd2UgY291bGQgY2hlY2sgc2NfaW5fcnh0YXNrbGV0IC0gYnV0IHRo
ZW4KKwkgKiB3aGF0IGlmIHRoZSByZXNldC9jaGFuY2hhbmdlIGlzIHdoYXQgaGFzIGNhbGxlZCBh
dGhfcnhfcHJvYz8KKwkgKi8KKwlBVEhfTE9DS19BU1NFUlQoc2MpOworCWlmIChzYy0+c2NfaW5f
cmVzZXQgPiAxIHx8IHNjLT5zY19pbl9yeHByb2MgPj0gMSkgeworCQkvKgorCQkgKiBJZiB0aGlz
IGlzIGdyZWF0ZXIgdGhhbiAxLCB3ZSdyZSBiZWluZyByZWN1cnNpdmVseQorCQkgKiBjYWxsZWQg
T1IgYmVpbmcgc2NoZWR1bGVkIG9uID4xIENQVS4KKwkJICogRXZlbiB0aG91Z2ggdGhlcmUncyBs
b2NraW5nIGludm9sdmVkIGhlcmUsIEkgaGF2ZW4ndAorCQkgKiBjaGVja2VkIHRvIGVuc3VyZSB0
aGF0IHR3byByeHByb2MncyBydW5uaW5nIG9uIHRoZSBzYW1lCisJCSAqIGxpc3QsIGNvbXBsZXRl
IHdpdGggbG9ja2luZywgd2lsbCBjb3JyZWN0bHkgaGFuZGxlCisJCSAqIHRoaW5ncy4KKwkJICov
CisJCWRldmljZV9wcmludGYoc2MtPnNjX2RldiwKKwkJICAgICIlczogZGFuZ2VyISBzY19pbl9y
ZXNldD0lZCwgc2NfaW5fcnhwcm9jPSVkXG4iLAorCQkgICAgX19mdW5jX18sIHNjLT5zY19pbl9y
ZXNldCwgc2MtPnNjX2luX3J4cHJvYyk7CisJfQorCXNjLT5zY19pbl9yeHByb2MrKzsKKwogCURQ
UklOVEYoc2MsIEFUSF9ERUJVR19SWF9QUk9DLCAiJXM6IGNhbGxlZFxuIiwgX19mdW5jX18pOwog
CW5nb29kID0gMDsKIAluZiA9IGF0aF9oYWxfZ2V0Y2hhbm5vaXNlKGFoLCBzYy0+c2NfY3VyY2hh
bik7CkBAIC00MDIyLDYgKzQyMjAsMTkgQEAKIAkJbV9hZGoobSwgLUlFRUU4MDIxMV9DUkNfTEVO
KTsKIAogCQkvKgorCQkgKiBEcm9wIHRoZSBBVEhfTE9DSyBoZXJlLgorCQkgKgorCQkgKiBXZSBj
YW4ndCBob2xkIHRoZSBsb2NrIGFjcm9zcyB0aGUgbmV0ODAyMTEgY2FsbHMgb3IKKwkJICogYmFk
IHN0dWZmIG9jY3Vycy4KKwkJICoKKwkJICogSW5zdGVhZCwgd2UgZHJvcCB0aGUgbG9jaywgZG8g
dGhlIG5ldDgwMjExIFJYLCB0aGVuCisJCSAqIHdlIHJlYWNxdWlyZSB0aGUgbG9jay4gTGF0ZXIg
b24gd2Ugc2hvdWxkIGNoZWNrCisJCSAqIHdoZXRoZXIgdGhlIGludGVyZmFjZSBzdGF0ZSBoYXMg
Y2hhbmdlZCwgcmVxdWlyaW5nCisJCSAqIHVzIHRvIGJyZWFrIG91dCBlYXJseS4KKwkJICovCisJ
CUFUSF9VTkxPQ0soc2MpOworCisJCS8qCiAJCSAqIExvY2F0ZSB0aGUgbm9kZSBmb3Igc2VuZGVy
LCB0cmFjayBzdGF0ZSwgYW5kIHRoZW4KIAkJICogcGFzcyB0aGUgKHJlZmVyZW5jZWQpIG5vZGUg
dXAgdG8gdGhlIDgwMi4xMSBsYXllcgogCQkgKiBmb3IgaXRzIHVzZS4KQEAgLTQwNjgsNiArNDI3
OSw5IEBACiAJCX0gZWxzZSB7CiAJCQl0eXBlID0gaWVlZTgwMjExX2lucHV0X2FsbChpYywgbSwg
cnMtPnJzX3Jzc2ksIG5mKTsKIAkJfQorCisJCUFUSF9MT0NLKHNjKTsKKwogCQkvKgogCQkgKiBU
cmFjayByeCByc3NpIGFuZCBkbyBhbnkgcnggYW50ZW5uYSBtYW5hZ2VtZW50LgogCQkgKi8KQEAg
LTQxMzYsMTkgKzQzNTAsMTMgQEAKIAkJYXRoX21vZGVfaW5pdChzYyk7CQkvKiBzZXQgZmlsdGVy
cywgZXRjLiAqLwogCQlhdGhfaGFsX3N0YXJ0cGN1cmVjdihhaCk7CS8qIHJlLWVuYWJsZSBQQ1Uv
RE1BIGVuZ2luZSAqLwogCi0JCUFUSF9MT0NLKHNjKTsKIAkJYXRoX2hhbF9pbnRyc2V0KGFoLCBz
Yy0+c2NfaW1hc2spOwogCQlzYy0+c2Nfa2lja3BjdSA9IDA7Ci0JCUFUSF9VTkxPQ0soc2MpOwog
CX0KIAotCWlmIChyZXNjaGVkICYmIChpZnAtPmlmX2Rydl9mbGFncyAmIElGRl9EUlZfT0FDVElW
RSkgPT0gMCkgewotI2lmZGVmIElFRUU4MDIxMV9TVVBQT1JUX1NVUEVSRwotCQlpZWVlODAyMTFf
ZmZfYWdlX2FsbChpYywgMTAwKTsKLSNlbmRpZgotCQlpZiAoIUlGUV9JU19FTVBUWSgmaWZwLT5p
Zl9zbmQpKQotCQkJYXRoX3N0YXJ0KGlmcCk7Ci0JfQorCS8qIEZpbmlzaGVkIC0gZGVjcmVtZW50
IHRoaXMgKi8KKwlzYy0+c2NfaW5fcnhwcm9jLS07CisKICN1bmRlZiBQQTJERVNDCiB9CiAKQEAg
LTQ1MDIsNiArNDcxMCw4IEBACiAJaW50IG5hY2tlZDsKIAlIQUxfU1RBVFVTIHN0YXR1czsKIAor
CUFUSF9MT0NLX0FTU0VSVChzYyk7CisKIAlEUFJJTlRGKHNjLCBBVEhfREVCVUdfVFhfUFJPQywg
IiVzOiB0eCBxdWV1ZSAldSBoZWFkICVwIGxpbmsgJXBcbiIsCiAJCV9fZnVuY19fLCB0eHEtPmF4
cV9xbnVtLAogCQkoY2FkZHJfdCkodWludHB0cl90KSBhdGhfaGFsX2dldHR4YnVmKHNjLT5zY19h
aCwgdHhxLT5heHFfcW51bSksCkBAIC00NjQxLDkgKzQ4NTEsOSBAQAogCXVpbnQzMl90IHR4cXM7
CiAKIAlBVEhfTE9DSyhzYyk7CisJc2MtPnNjX2luX3R4cHJvYysrOwogCXR4cXMgPSBzYy0+c2Nf
dHhxX2FjdGl2ZTsKIAlzYy0+c2NfdHhxX2FjdGl2ZSAmPSB+dHhxczsKLQlBVEhfVU5MT0NLKHNj
KTsKIAogCWlmIChUWFFBQ1RJVkUodHhxcywgMCkgJiYgYXRoX3R4X3Byb2Nlc3NxKHNjLCAmc2Mt
PnNjX3R4cVswXSwgMSkpCiAJCS8qIFhYWCB3aHkgaXMgbGFzdHJ4IHVwZGF0ZWQgaW4gdHggY29k
ZT8gKi8KQEAgLTQ2NTYsNyArNDg2Niw5IEBACiAJaWYgKHNjLT5zY19zb2Z0bGVkKQogCQlhdGhf
bGVkX2V2ZW50KHNjLCBzYy0+c2NfdHhyaXgpOwogCi0JYXRoX3N0YXJ0KGlmcCk7CisJYXRoX3N0
YXJ0X2xvY2tlZChpZnApOworCXNjLT5zY19pbl90eHByb2MtLTsKKwlBVEhfVU5MT0NLKHNjKTsK
IH0KIAogLyoKQEAgLTQ2NzIsOSArNDg4NCw5IEBACiAJdWludDMyX3QgdHhxczsKIAogCUFUSF9M
T0NLKHNjKTsKKwlzYy0+c2NfaW5fdHhwcm9jKys7CiAJdHhxcyA9IHNjLT5zY190eHFfYWN0aXZl
OwogCXNjLT5zY190eHFfYWN0aXZlICY9IH50eHFzOwotCUFUSF9VTkxPQ0soc2MpOwogCiAJLyoK
IAkgKiBQcm9jZXNzIGVhY2ggYWN0aXZlIHF1ZXVlLgpAQCAtNDY5OSw3ICs0OTExLDkgQEAKIAlp
ZiAoc2MtPnNjX3NvZnRsZWQpCiAJCWF0aF9sZWRfZXZlbnQoc2MsIHNjLT5zY190eHJpeCk7CiAK
LQlhdGhfc3RhcnQoaWZwKTsKKwlhdGhfc3RhcnRfbG9ja2VkKGlmcCk7CisJc2MtPnNjX2luX3R4
cHJvYy0tOworCUFUSF9VTkxPQ0soc2MpOwogfQogCiAvKgpAQCAtNDcxNCw5ICs0OTI4LDkgQEAK
IAl1aW50MzJfdCB0eHFzOwogCiAJQVRIX0xPQ0soc2MpOworCXNjLT5zY19pbl90eHByb2MrKzsK
IAl0eHFzID0gc2MtPnNjX3R4cV9hY3RpdmU7CiAJc2MtPnNjX3R4cV9hY3RpdmUgJj0gfnR4cXM7
Ci0JQVRIX1VOTE9DSyhzYyk7CiAKIAkvKgogCSAqIFByb2Nlc3MgZWFjaCBhY3RpdmUgcXVldWUu
CkBAIC00NzM0LDcgKzQ5NDgsOSBAQAogCWlmIChzYy0+c2Nfc29mdGxlZCkKIAkJYXRoX2xlZF9l
dmVudChzYywgc2MtPnNjX3R4cml4KTsKIAotCWF0aF9zdGFydChpZnApOworCWF0aF9zdGFydF9s
b2NrZWQoaWZwKTsKKwlzYy0+c2NfaW5fdHhwcm9jLS07CisJQVRIX1VOTE9DSyhzYyk7CiB9CiAj
dW5kZWYJVFhRQUNUSVZFCiAKQEAgLTQ5MDMsMTEgKzUxMTksMTggQEAKIAlzdHJ1Y3QgaWZuZXQg
KmlmcCA9IHNjLT5zY19pZnA7CiAJaW50IGk7CiAKKwlBVEhfTE9DS19BU1NFUlQoc2MpOworCiAJ
KHZvaWQpIGF0aF9zdG9wdHhkbWEoc2MpOwogCi0JZm9yIChpID0gMDsgaSA8IEhBTF9OVU1fVFhf
UVVFVUVTOyBpKyspCi0JCWlmIChBVEhfVFhRX1NFVFVQKHNjLCBpKSkKLQkJCWF0aF90eF9kcmFp
bnR4cShzYywgJnNjLT5zY190eHFbaV0pOworCWZvciAoaSA9IDA7IGkgPCBIQUxfTlVNX1RYX1FV
RVVFUzsgaSsrKSB7CisJCWlmIChBVEhfVFhRX1NFVFVQKHNjLCBpKSkgeworCQkJaWYgKHJlc2V0
X3R5cGUgPT0gQVRIX1JFU0VUX05PTE9TUykKKwkJCQlhdGhfdHhfcHJvY2Vzc3Eoc2MsICZzYy0+
c2NfdHhxW2ldLCAwKTsKKwkJCWVsc2UKKwkJCQlhdGhfdHhfZHJhaW50eHEoc2MsICZzYy0+c2Nf
dHhxW2ldKTsKKwkJfQorCX0KICNpZmRlZiBBVEhfREVCVUcKIAlpZiAoc2MtPnNjX2RlYnVnICYg
QVRIX0RFQlVHX1JFU0VUKSB7CiAJCXN0cnVjdCBhdGhfYnVmICpiZiA9IFRBSUxRX0ZJUlNUKCZz
Yy0+c2NfYmJ1Zik7CkBAIC00OTIxLDggKzUxNDQsMTAgQEAKIAkJfQogCX0KICNlbmRpZiAvKiBB
VEhfREVCVUcgKi8KLQlpZnAtPmlmX2Rydl9mbGFncyAmPSB+SUZGX0RSVl9PQUNUSVZFOwotCXNj
LT5zY193ZF90aW1lciA9IDA7CisJaWYgKHJlc2V0X3R5cGUgIT0gQVRIX1JFU0VUX05PTE9TUykg
eworCQlpZnAtPmlmX2Rydl9mbGFncyAmPSB+SUZGX0RSVl9PQUNUSVZFOworCQlzYy0+c2Nfd2Rf
dGltZXIgPSAwOworCX0KIH0KIAogLyoKQEAgLTQ5MzYsNiArNTE2MSwxMCBAQAogCQkoKF9wYSkg
LSAoX3NjKS0+c2NfcnhkbWEuZGRfZGVzY19wYWRkcikpKQogCXN0cnVjdCBhdGhfaGFsICphaCA9
IHNjLT5zY19haDsKIAorCURQUklOVEYoc2MsIEFUSF9ERUJVR19BTlksICIlczogY2FsbGVkXG4i
LCBfX2Z1bmNfXyk7CisKKwlBVEhfTE9DS19BU1NFUlQoc2MpOworCiAJYXRoX2hhbF9zdG9wcGN1
cmVjdihhaCk7CS8qIGRpc2FibGUgUENVICovCiAJYXRoX2hhbF9zZXRyeGZpbHRlcihhaCwgMCk7
CS8qIGNsZWFyIHJlY3YgZmlsdGVyICovCiAJYXRoX2hhbF9zdG9wZG1hcmVjdihhaCk7CS8qIGRp
c2FibGUgRE1BIGVuZ2luZSAqLwpAQCAtNDk3Niw2ICs1MjA1LDggQEAKIAlzdHJ1Y3QgYXRoX2hh
bCAqYWggPSBzYy0+c2NfYWg7CiAJc3RydWN0IGF0aF9idWYgKmJmOwogCisJQVRIX0xPQ0tfQVNT
RVJUKHNjKTsKKwogCXNjLT5zY19yeGxpbmsgPSBOVUxMOwogCXNjLT5zY19yeHBlbmRpbmcgPSBO
VUxMOwogCVRBSUxRX0ZPUkVBQ0goYmYsICZzYy0+c2NfcnhidWYsIGJmX2xpc3QpIHsKQEAgLTUw
MjcsNiArNTI1OCw4IEBACiAJc3RydWN0IGllZWU4MDIxMWNvbSAqaWMgPSBpZnAtPmlmX2wyY29t
OwogCXN0cnVjdCBhdGhfaGFsICphaCA9IHNjLT5zY19haDsKIAorCUFUSF9MT0NLX0FTU0VSVChz
Yyk7CisKIAlEUFJJTlRGKHNjLCBBVEhfREVCVUdfUkVTRVQsICIlczogJXUgKCV1IE1IeiwgZmxh
Z3MgMHgleClcbiIsCiAJICAgIF9fZnVuY19fLCBpZWVlODAyMTFfY2hhbjJpZWVlKGljLCBjaGFu
KSwKIAkgICAgY2hhbi0+aWNfZnJlcSwgY2hhbi0+aWNfZmxhZ3MpOwpAQCAtNTA0MSw2ICs1Mjc0
LDggQEAKIAkJYXRoX2hhbF9pbnRyc2V0KGFoLCAwKTsJCS8qIGRpc2FibGUgaW50ZXJydXB0cyAq
LwogCQlhdGhfZHJhaW50eHEoc2MsIEFUSF9SRVNFVF9GVUxMKTsJLyogY2xlYXIgcGVuZGluZyB0
eCBmcmFtZXMgKi8KIAkJYXRoX3N0b3ByZWN2KHNjKTsJCS8qIHR1cm4gb2ZmIGZyYW1lIHJlY3Yg
Ki8KKwkJLyogWFhYIHRoaXMgZHJvcHMgdGhlIGxvY2sgdGVtcG9yYXJpbHkgKi8KKwkJYXRoX3J4
X3Byb2Moc2MsIDApOwogCQlpZiAoIWF0aF9oYWxfcmVzZXQoYWgsIHNjLT5zY19vcG1vZGUsIGNo
YW4sIEFIX1RSVUUsICZzdGF0dXMpKSB7CiAJCQlpZl9wcmludGYoaWZwLCAiJXM6IHVuYWJsZSB0
byByZXNldCAiCiAJCQkgICAgImNoYW5uZWwgJXUgKCV1IE1IeiwgZmxhZ3MgMHgleCksIGhhbCBz
dGF0dXMgJXVcbiIsCkBAIC01MTI5LDcgKzUzNjQsNyBAQAogCQkJRFBSSU5URihzYywgQVRIX0RF
QlVHX0NBTElCUkFURSwKIAkJCQkiJXM6IHJmZ2FpbiBjaGFuZ2VcbiIsIF9fZnVuY19fKTsKIAkJ
CXNjLT5zY19zdGF0cy5hc3RfcGVyX3JmZ2FpbisrOwotCQkJYXRoX3Jlc2V0KGlmcCwgQVRIX1JF
U0VUX05PTE9TUyk7CisJCQlhdGhfcmVzZXRfbG9ja2VkKGlmcCwgQVRIX1JFU0VUX05PTE9TUyk7
CiAJCX0KIAkJLyoKIAkJICogSWYgdGhpcyBsb25nIGNhbCBpcyBhZnRlciBhbiBpZGxlIHBlcmlv
ZCwgdGhlbgpAQCAtNTI0NywxMSArNTQ4Miw3IEBACiAJc3RydWN0IGlmbmV0ICppZnAgPSBpYy0+
aWNfaWZwOwogCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gaWZwLT5pZl9zb2Z0YzsKIAotCS8qIFRo
aXMgaXNuJ3Qgc3RyaWN0bHkgYSByZXNldCwgYnV0IHdlIHN0aWxsIGhhdmUgdG8gZHJhaW4gKi8K
IAlBVEhfTE9DSyhzYyk7Ci0Jc2MtPnNjX2luX3Jlc2V0Kys7Ci0JQVRIX1VOTE9DSyhzYyk7Ci0K
IAkodm9pZCkgYXRoX2NoYW5fc2V0KHNjLCBpYy0+aWNfY3VyY2hhbik7CiAJLyoKIAkgKiBJZiB3
ZSBhcmUgcmV0dXJuaW5nIHRvIG91ciBic3MgY2hhbm5lbCB0aGVuIG1hcmsgc3RhdGUKQEAgLTUy
NjEsOSArNTQ5Miw2IEBACiAJICovCiAJaWYgKCFzYy0+c2Nfc2Nhbm5pbmcgJiYgaWMtPmljX2N1
cmNoYW4gPT0gaWMtPmljX2Jzc2NoYW4pCiAJCXNjLT5zY19zeW5jYmVhY29uID0gMTsKLQotCUFU
SF9MT0NLKHNjKTsKLQlzYy0+c2NfaW5fcmVzZXQtLTsKIAlBVEhfVU5MT0NLKHNjKTsKIH0KIApA
QCAtNTgwNCw3ICs2MDMyLDcgQEAKIAkJCSAgICBoYW5ncyAmIDB4ZmYgPyAiYmIiIDogIm1hYyIs
IGhhbmdzKTsKIAkJfSBlbHNlCiAJCQlpZl9wcmludGYoaWZwLCAiZGV2aWNlIHRpbWVvdXRcbiIp
OwotCQlhdGhfcmVzZXQoaWZwLCBBVEhfUkVTRVRfTk9MT1NTKTsKKwkJYXRoX3Jlc2V0X2xvY2tl
ZChpZnAsIEFUSF9SRVNFVF9OT0xPU1MpOwogCQlpZnAtPmlmX29lcnJvcnMrKzsKIAkJc2MtPnNj
X3N0YXRzLmFzdF93YXRjaGRvZysrOwogCX0K
--20cf30363cef507c7704b0190203--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAJ-Vmo=9KkQbiCCBQm5Xm_9dNZtY6jQ1hzO0SWSZ4z323jF=Hw>