Generic IDE-DMA (2)

Christian Brunner (chb@muc.de)
Sat, 20 Sep 1997 13:03:40 +0200 (MET DST)


This message is in MIME format. The first part should be readable text,
while the remaining parts are likely unreadable without MIME-aware tools.
Send mail to mime@docserver.cac.washington.edu for more info.

---1363078244-590163263-874753420=:479
Content-Type: TEXT/PLAIN; charset=US-ASCII

Hi,

this is my second patch for Generic PCI bus-mastering DMA support for IDE
chipsets. The only thing I've done, is that I fixed a small problem.
(Actually this makes DMA slower on Intel chipsets, but I will
(re)introduce chipset specific things later.)

Currently I've tested this patch on a SiS 5571 amd an Intel PIIX3. I still
need people willing to try out this patch - especially on *non-Intel*
chips. Please report any success/failure to me.

Thanks, Christian (chb@muc.de)

PS: I suspect, that this patch won't work with NS87415 chipsets. This
chipset seems to need DMA handshaking turned on in PCI-Register 40h. At
least this is what I guessed from the datasheet and David's code. Anyone
willing and able to check this (I don't know what will happen) ?

---1363078244-590163263-874753420=:479
Content-Type: TEXT/PLAIN; charset=US-ASCII; name=ide-patch
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.3.96.970920130340.479C@hefty.schlumpf.muc.de>
Content-Description:

LS0tIGxpbnV4L0RvY3VtZW50YXRpb24vQ29uZmlndXJlLmhlbHAuNTEJTW9u
IFNlcCAxNSAxMjowNDozNCAxOTk3DQorKysgbGludXgvRG9jdW1lbnRhdGlv
bi9Db25maWd1cmUuaGVscAlNb24gU2VwIDE1IDEyOjEzOjA2IDE5OTcNCkBA
IC0yOTQsMTQgKzI5NCwxNCBAQA0KICAgTGludXguICBUaGlzIG1heSBzbG93
IGRpc2sgdGhyb3VnaHB1dCBieSBhIGZldyBwZXJjZW50LCBidXQgYXQgbGVh
c3QNCiAgIHRoaW5ncyB3aWxsIG9wZXJhdGUgMTAwJSByZWxpYWJseS4gSWYg
dW5zdXJlLCBzYXkgWS4NCiANCi1JbnRlbCA4MjM3MSBQSUlYIChUcml0b24g
SS9JSSksIFZJQSBWUC0xIERNQSBzdXBwb3J0DQorR2VuZXJpYyBQQ0kgYnVz
LW1hc3RlcmluZyBETUEgc3VwcG9ydA0KIENPTkZJR19CTEtfREVWX1RSSVRP
Tg0KICAgSWYgeW91ciBQQ0kgc3lzdGVtIHVzZXMgYW4gSURFIGhhcmRkcml2
ZSAoYXMgb3Bwb3NlZCB0byBTQ1NJLCBzYXkpDQotICBhbmQgaW5jbHVkZXMg
dGhlIEludGVsIFRyaXRvbiBJL0lJIElERSBpbnRlcmZhY2UgY2hpcHNldCAo
aTgyMzcxRkIsDQotICBpODIzNzFTQiBvciBpODIzNzFBQiksIG9yIHRoZSBW
SUEgVlAtMSBJREUgaW50ZXJmYWNlIGNoaXBzZXQgDQotICAoVlQ4MkM1ODYp
LCB5b3Ugd2lsbCB3YW50IHRvIGVuYWJsZSB0aGlzIG9wdGlvbiB0byBhbGxv
dyB1c2Ugb2YgDQotICBidXMtbWFzdGVyaW5nIERNQSBkYXRhIHRyYW5zZmVy
cy4gUmVhZCB0aGUgY29tbWVudHMgYXQgdGhlDQotICBiZWdpbm5pbmcgb2Yg
ZHJpdmVycy9ibG9jay90cml0b24uYyBhbmQgRG9jdW1lbnRhdGlvbi9pZGUu
dHh0Lg0KKyAgYW5kIGluY2x1ZGVzIGFuIFBDSSBjb250cm9sZXIsIHRoYXQg
c3VwcG9ydHMgYnVzLW1hc3RlcmluZyBETUEsIA0KKyAgeW91IHdpbGwgd2Fu
dCB0byBlbmFibGUgdGhpcyBvcHRpb24gdG8gYWxsb3cgdXNlIG9mIGJ1cy1t
YXN0ZXJpbmcNCisgIChDaGlwc2V0cyBrbm93biB0byB3b3JrIGFyZTogSW50
ZWwgVHJpdG9uIEkvSUksIFZJQSBWUC0xIGFuZCB2YXJpb3VzDQorICBTaVMg
aW50ZXJmYWNlIGNoaXBzZXRzKS4gUmVhZCB0aGUgY29tbWVudHMgYXQgdGhl
IGJlZ2lubmluZyBvZg0KKyAgZHJpdmVycy9ibG9jay90cml0b24uYyBhbmQg
RG9jdW1lbnRhdGlvbi9pZGUudHh0Lg0KICAgWW91IGNhbiBnZXQgdGhlIGxh
dGVzdCB2ZXJzaW9uIG9mIHRoZSBoZHBhcm0gdXRpbGl0eSB2aWEgDQogICBm
dHAgKHVzZXI6IGFub255bW91cykgZnJvbQ0KICAgc3Vuc2l0ZS51bmMuZWR1
L3B1Yi9MaW51eC9rZXJuZWwvcGF0Y2hlcy9kaXNrZHJpdmVzLzsgaXQgaXMN
Ci0tLSBsaW51eC9kcml2ZXJzL2Jsb2NrL2lkZS5jLjUxCUZyaSBBdWcgMjkg
MTI6MjA6MDggMTk5Nw0KKysrIGxpbnV4L2RyaXZlcnMvYmxvY2svaWRlLmMJ
V2VkIFNlcCAxMCAyMjowNTowMCAxOTk3DQpAQCAtMjU1MSwyOSArMjU1MSw2
MiBAQA0KIH0NCiANCiAjaWZkZWYgQ09ORklHX1BDSQ0KLSNpZiBkZWZpbmVk
KENPTkZJR19CTEtfREVWX1JaMTAwMCkgfHwgZGVmaW5lZChDT05GSUdfQkxL
X0RFVl9UUklUT04pIHx8IGRlZmluZWQoQ09ORklHX0JMS19ERVZfT1BUSTYy
MSkNCiANCiB0eXBlZGVmIHZvaWQgKGlkZV9wY2lfaW5pdF9wcm9jX3QpKGJ5
dGUsIGJ5dGUpOw0KIA0KIC8qDQotICogaWRlX3Byb2JlX3BjaSgpIHNjYW5z
IFBDSSBmb3IgYSBzcGVjaWZpYyB2ZW5kb3IvZGV2aWNlIGZ1bmN0aW9uLA0K
LSAqIGFuZCBpbnZva2VzIHRoZSBzdXBwbGllZCBpbml0IHJvdXRpbmUgZm9y
IGVhY2ggaW5zdGFuY2UgZGV0ZWN0ZWQuDQorICogaWRlX3Byb2JlX3BjaSgp
IHNjYW5zIFBDSSBJREUtRGV2aWNlcyBmb3Iga25vd24gQ2hpcHNldHMgb3Ig
Z2VuZXJpYw0KKyAqIGJ1c21hc3RlciBETUEgc3VwcG9ydC4NCiAgKi8NCi1f
X2luaXRmdW5jKHN0YXRpYyB2b2lkIGlkZV9wcm9iZV9wY2kgKHVuc2lnbmVk
IHNob3J0IHZlbmRvciwgdW5zaWduZWQgc2hvcnQgZGV2aWNlLCBpZGVfcGNp
X2luaXRfcHJvY190ICppbml0LCBpbnQgZnVuY19hZGopKQ0KKw0KK19faW5p
dGZ1bmMoc3RhdGljIHZvaWQgaWRlX3Byb2JlX3BjaSAoYnl0ZSBidXMsIGJ5
dGUgZm4pKQ0KIHsNCi0JdW5zaWduZWQgbG9uZyBmbGFnczsNCi0JdW5zaWdu
ZWQgaW5kZXg7DQotCWJ5dGUgZm4sIGJ1czsNCi0NCi0Jc2F2ZV9mbGFncyhm
bGFncyk7DQotCWNsaSgpOw0KLQlmb3IgKGluZGV4ID0gMDsgIXBjaWJpb3Nf
ZmluZF9kZXZpY2UgKHZlbmRvciwgZGV2aWNlLCBpbmRleCwgJmJ1cywgJmZu
KTsgKytpbmRleCkgew0KLQkJaW5pdCAoYnVzLCBmbiArIGZ1bmNfYWRqKTsN
CisgICAgICAgIHVuc2lnbmVkIHNob3J0IHZlbmRvciwgZGV2aWNlLCBjb21t
YW5kOw0KKyAgICAgICAgdW5zaWduZWQgY2hhciBsYXQ7DQorICAgICAgICB1
bnNpZ25lZCBsb25nIGZsYWdzOw0KKwlpbnQgZnVuY19hZGogPSAwOw0KKw0K
KyAgICAgICAgc2F2ZV9mbGFncyhmbGFncyk7DQorICAgICAgICBjbGkoKTsN
CisNCisgICAgICAgIHBjaWJpb3NfcmVhZF9jb25maWdfd29yZCAoYnVzLCBm
biwgUENJX1ZFTkRPUl9JRCwgJnZlbmRvcik7DQorCXBjaWJpb3NfcmVhZF9j
b25maWdfd29yZCAoYnVzLCBmbiwgUENJX0RFVklDRV9JRCwgJmRldmljZSk7
DQorDQorCWlmICgodmVuZG9yID09IFBDSV9WRU5ET1JfSURfUENURUNIKSAg
JiYgKGRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1BDVEVDSF9SWjEwMDApKSB7
DQorI2lmZGVmIENPTkZJR19CTEtfREVWX1JaMTAwMA0KKwkJaWRlX3BjaV9p
bml0X3Byb2NfdCBpbml0X3J6MTAwMDsNCisJCWluaXRfcnoxMDAwIChidXMs
IGZuK2Z1bmNfYWRqKTsNCisjZWxzZQ0KKwkJcHJpbnRrKCJXYXJuaW5nOiBS
WjEwMDAgY2hpcHNldCBkZXRlY3RlZC4gWW91IHNob3VsZCB0dXJuIG9uIENP
TkZJR19CTEtfREVWX1JaMTAwMC5cbiIpOw0KKyNlbmRpZg0KKwl9DQorCWVs
c2UgaWYgKCh2ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9QQ1RFQ0gpICAmJiAo
ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUENURUNIX1JaMTAwMSkpIHsNCisj
aWZkZWYgQ09ORklHX0JMS19ERVZfUloxMDAwDQorCQlpZGVfcGNpX2luaXRf
cHJvY190IGluaXRfcnoxMDAwOw0KKwkJaW5pdF9yejEwMDAgKGJ1cywgZm4r
ZnVuY19hZGopOw0KKyNlbHNlIA0KKwkJcHJpbnRrKCJXYXJuaW5nOiBSWjEw
MDAgY2hpcHNldCBkZXRlY3RlZC4gWW91IHNob3VsZCB0dXJuIG9uIENPTkZJ
R19CTEtfREVWX1JaMTAwMC5cbiIpOw0KKyNlbmRpZiANCisJfQ0KKwllbHNl
IGlmICgodmVuZG9yID09IFBDSV9WRU5ET1JfSURfT1BUSSkgICYmIChkZXZp
Y2UgPT0gUENJX0RFVklDRV9JRF9PUFRJXzgyQzYyMSkpDQorI2lmZGVmIENP
TkZJR19CTEtfREVWX09QVEk2MjENCisJCWlkZV9pbml0X29wdGk2MjEgKGJ1
cywgZm4rZnVuY19hZGopOw0KKyNlbHNlDQorCQlwcmludGsoIldhcm5pbmc6
IE9QVEk2MjEgY2hpcHNldCBkZXRlY3RlZC4gWW91IHNob3VsZCB0dXJuIG9u
IENPTkZJR19CTEtfREVWX09QVEk2MjEuXG4iKTsNCisjZW5kaWYNCisjaWZk
ZWYgQ09ORklHX0JMS19ERVZfVFJJVE9ODQorICAgICAgICBlbHNlIHsNCisJ
CXBjaWJpb3NfcmVhZF9jb25maWdfd29yZCAoYnVzLCBmbiwgUENJX0NPTU1B
TkQsICZjb21tYW5kKTsNCisJCXBjaWJpb3NfcmVhZF9jb25maWdfYnl0ZSAo
YnVzLCBmbiwgUENJX0xBVEVOQ1lfVElNRVIsICZsYXQpOw0KKwkJDQorCQlp
ZiAobGF0ICYmIChjb21tYW5kICYgUENJX0NPTU1BTkRfTUFTVEVSKSkNCisJ
CQlpZGVfaW5pdF90cml0b24gKGJ1cywgZm4gKyBmdW5jX2Fkaik7DQogCX0N
Ci0JcmVzdG9yZV9mbGFncyhmbGFncyk7DQorI2VuZGlmIC8qIENPTkZJR19C
TEtfREVWX1RSSVRPTiAqLw0KKw0KKyAgICAgICAgcmVzdG9yZV9mbGFncyhm
bGFncyk7DQogfQ0KIA0KLSNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19CTEtf
REVWX1JaMTAwMCkgfHwgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9UUklUT04p
IHx8IGRlZmluZWQoQ09ORklHX0JMS19ERVZfT1BUSTYyMSkgKi8NCiAjZW5k
aWYgLyogQ09ORklHX1BDSSAqLw0KIA0KIC8qDQpAQCAtMjU4NSwzMiArMjYx
OCwzMSBAQA0KIF9faW5pdGZ1bmMoc3RhdGljIHZvaWQgcHJvYmVfZm9yX2h3
aWZzICh2b2lkKSkNCiB7DQogI2lmZGVmIENPTkZJR19QQ0kNCisNCisgICAg
ICAgIHVuc2lnbmVkIGludCBpbmRleCA9IDA7DQorICAgICAgICB1bnNpZ25l
ZCBpbnQgY3VyciA9IDA7DQorICAgICAgICBzdHJ1Y3QgcGNpX2RldiAqZGV2
Ow0KKw0KIAkvKg0KIAkgKiBGaW5kL2luaXRpYWxpemUgUENJIElERSBpbnRl
cmZhY2VzDQogCSAqLw0KIAlpZiAocGNpYmlvc19wcmVzZW50KCkpIHsNCi0j
aWZkZWYgQ09ORklHX0JMS19ERVZfUloxMDAwDQotCQlpZGVfcGNpX2luaXRf
cHJvY190IGluaXRfcnoxMDAwOw0KLQkJaWRlX3Byb2JlX3BjaSAoUENJX1ZF
TkRPUl9JRF9QQ1RFQ0gsIFBDSV9ERVZJQ0VfSURfUENURUNIX1JaMTAwMCwg
JmluaXRfcnoxMDAwLCAwKTsNCi0JCWlkZV9wcm9iZV9wY2kgKFBDSV9WRU5E
T1JfSURfUENURUNILCBQQ0lfREVWSUNFX0lEX1BDVEVDSF9SWjEwMDEsICZp
bml0X3J6MTAwMCwgMCk7DQotI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX1Ja
MTAwMCAqLw0KLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9UUklUT04NCi0JCS8q
DQotCQkgKiBBcHBhcmVudGx5IHRoZSBCSU9TMzIgc2VydmljZXMgb24gSW50
ZWwgbW90aGVyYm9hcmRzIGFyZQ0KLQkJICogYnVnZ3kgYW5kIHdvbid0IGZp
bmQgdGhlIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFfMSBmb3IgdXMuDQot
CQkgKiBTbyBpbnN0ZWFkLCB3ZSBzZWFyY2ggZm9yIFBDSV9ERVZJQ0VfSURf
SU5URUxfODIzNzFfMCwNCi0JCSAqIGFuZCB0aGVuIGFkZCAxLg0KLQkJICov
DQotCQlpZGVfcHJvYmVfcGNpIChQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lf
REVWSUNFX0lEX0lOVEVMXzgyMzcxXzAsICZpZGVfaW5pdF90cml0b24sIDEp
Ow0KLQkJaWRlX3Byb2JlX3BjaSAoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJ
X0RFVklDRV9JRF9JTlRFTF84MjM3MVNCXzEsICZpZGVfaW5pdF90cml0b24s
IDApOw0KLQkJaWRlX3Byb2JlX3BjaSAoUENJX1ZFTkRPUl9JRF9JTlRFTCwg
UENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCLCAmaWRlX2luaXRfdHJpdG9u
LCAwKTsNCi0JCWlkZV9wcm9iZV9wY2kgKFBDSV9WRU5ET1JfSURfVklBLCBQ
Q0lfREVWSUNFX0lEX1ZJQV84MkM1ODZfMSwgJmlkZV9pbml0X3RyaXRvbiwg
MCk7DQotI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX1RSSVRPTiAqLw0KLSNp
ZmRlZiBDT05GSUdfQkxLX0RFVl9PUFRJNjIxDQotCQlpZGVfcHJvYmVfcGNp
IChQQ0lfVkVORE9SX0lEX09QVEksIFBDSV9ERVZJQ0VfSURfT1BUSV84MkM2
MjEsICZpZGVfaW5pdF9vcHRpNjIxLCAwKTsNCi0jZW5kaWYgLyogQ09ORklH
X0JMS19ERVZfT1BUSTYyMSAqLw0KKw0KKwkgICAgICAgICAvKg0KKyAgICAg
ICAgCSAgKiBXb3JrIGFycm91bmQgZm9yIHdlaXJkIHBjaWJpb3NfZmluZF9j
bGFzcygpIHByb2JsZW1zDQorCSAJICovDQorCQlmb3IgKGRldiA9IHBjaV9k
ZXZpY2VzOyBkZXY7IGRldiA9IGRldi0+bmV4dCkgew0KKwkJCWlmICggKGRl
di0+Y2xhc3MgPj4gOCkgPT0gUENJX0NMQVNTX1NUT1JBR0VfSURFKSB7DQor
CQkJCWlmIChjdXJyID09IGluZGV4KSB7DQorCQkJCSAgIGlkZV9wcm9iZV9w
Y2koZGV2LT5idXMtPm51bWJlciwgZGV2LT5kZXZmbik7DQorCQkJCSAgICsr
aW5kZXg7DQorCQkJCX0NCisJCQkJKytjdXJyOw0KKwkJCX0NCisJCX0NCiAJ
fQ0KICNlbmRpZiAvKiBDT05GSUdfUENJICovDQorDQogI2lmZGVmIENPTkZJ
R19CTEtfREVWX0NNRDY0MA0KIAl7DQogCQlleHRlcm4gdm9pZCBpZGVfcHJv
YmVfZm9yX2NtZDY0MHggKHZvaWQpOw0KLS0tIGxpbnV4L2RyaXZlcnMvYmxv
Y2svaWRlLmguNTEJRnJpIEF1ZyAyOSAxMDoxMDoyOSAxOTk3DQorKysgbGlu
dXgvZHJpdmVycy9ibG9jay9pZGUuaAlUaHUgU2VwIDExIDA4OjM3OjM4IDE5
OTcNCkBAIC0yOTUsMTAgKzI5NSwxMCBAQA0KICAqIGh3aWZfY2hpcHNldF90
IGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgc3BlY2lmaWMgaGFyZHdh
cmUNCiAgKiBjaGlwc2V0IHVzZWQgYnkgZWFjaCBJREUgaW50ZXJmYWNlLCBp
ZiBrbm93bi4NCiAgKi8NCi10eXBlZGVmIGVudW0gewlpZGVfdW5rbm93biwJ
aWRlX2dlbmVyaWMsCWlkZV90cml0b24sDQordHlwZWRlZiBlbnVtIHsJaWRl
X3Vua25vd24sCWlkZV9nZW5lcmljLAlpZGVfcGNpZG1hLA0KIAkJaWRlX2Nt
ZDY0MCwJaWRlX2R0YzIyNzgsCWlkZV9hbGkxNHh4LA0KIAkJaWRlX3FkNjU4
MCwJaWRlX3VtYzg2NzIsCWlkZV9odDY1NjBiLA0KLQkJaWRlX3Byb21pc2Us
CWlkZV92aWEgfQ0KKwkJaWRlX3Byb21pc2UgfQ0KIAlod2lmX2NoaXBzZXRf
dDsNCiANCiB0eXBlZGVmIHN0cnVjdCBod2lmX3Mgew0KLS0tIGxpbnV4L2Ry
aXZlcnMvYmxvY2svQ29uZmlnLmluLjUxCU1vbiBTZXAgMTUgMTI6MjY6MTEg
MTk5Nw0KKysrIGxpbnV4L2RyaXZlcnMvYmxvY2svQ29uZmlnLmluCU1vbiBT
ZXAgMTUgMTI6Mjg6MDggMTk5Nw0KQEAgLTIzLDcgKzIzLDcgQEANCiAgICAg
ZmkNCiAgICAgaWYgWyAiJENPTkZJR19QQ0kiID0gInkiIF07IHRoZW4NCiAg
ICAgICBib29sICcgICBSWjEwMDAgY2hpcHNldCBidWdmaXgvc3VwcG9ydCcg
Q09ORklHX0JMS19ERVZfUloxMDAwDQotICAgICAgYm9vbCAnICAgSW50ZWwg
UElJWC9QSUlYMy9QSUlYNCAoVHJpdG9uIDQzMEZYL0hYL1ZYL1RYLCA0NDBG
WCkgRE1BIHN1cHBvcnQnIENPTkZJR19CTEtfREVWX1RSSVRPTg0KKyAgICAg
IGJvb2wgJyAgIEdlbmVyaWMgUENJIGJ1cy1tYXN0ZXJpbmcgRE1BIHN1cHBv
cnQnIENPTkZJR19CTEtfREVWX1RSSVRPTg0KICAgICBmaQ0KICAgICBib29s
ICcgICBPdGhlciBJREUgY2hpcHNldCBzdXBwb3J0JyBDT05GSUdfSURFX0NI
SVBTRVRTDQogICAgIGlmIFsgIiRDT05GSUdfSURFX0NISVBTRVRTIiA9ICJ5
IiBdOyB0aGVuDQotLS0gbGludXgvRG9jdW1lbnRhdGlvbi9pZGUudHh0LjU1
CU1vbiBTZXAgMTUgMTM6MDI6MDcgMTk5Nw0KKysrIGxpbnV4L0RvY3VtZW50
YXRpb24vaWRlLnR4dAlNb24gU2VwIDE1IDEzOjA1OjQxIDE5OTcNCkBAIC01
OCw2ICs1OCw4IEBADQogCS0gaWRlLWNkLmMgbm93IGNvbXBpbGVzIHNlcGFy
YXRlIGZyb20gaWRlLmMNCiAJLSBCdXMtTWFzdGVyIERNQSBzdXBwb3J0IGZv
ciBJbnRlbCBQQ0kgVHJpdG9uIGNoaXBzZXQgSURFIGludGVyZmFjZXMNCiAJ
CS0gZm9yIGRldGFpbHMsIHNlZSBjb21tZW50cyBhdCB0b3Agb2YgdHJpdG9u
LmMNCitORVchCS0gQnVzLU1hc3RlciBETUEgc3VwcG9ydCBleHRlbmRlZCBm
b3IgZ2VuZXJpYyBjaGlwc2V0IElERSBpbnRlcmZhY2VzDQorICAgICAgICAg
IChjb3VydGVzeSBvZiBDaHJpc3RpYW4gQnJ1bm5lciA8Y2hiQG11Yy5kZT4p
Lg0KIAktIGlkZS1jZC5jIG5vdyBzdXBwb3J0cyBkb29yIGxvY2tpbmcgYW5k
IGF1dG8tbG9hZGluZy4NCiAJCS0gQWxzbyBwcmVsaW1pbmFyeSBzdXBwb3J0
IGZvciBtdWx0aXNlc3Npb24NCiAJCSAgYW5kIGRpcmVjdCByZWFkcyBvZiBh
dWRpbyBkYXRhLg0KLS0tIGxpbnV4L2RyaXZlcnMvYmxvY2svdHJpdG9uLmMu
NTEJVGh1IEp1biAyNiAyMTozMzozOCAxOTk3DQorKysgbGludXgvZHJpdmVy
cy9ibG9jay90cml0b24uYwlTYXQgU2VwIDIwIDExOjEwOjA4IDE5OTcNCkBA
IC02LDI0ICs2LDI0IEBADQogICovDQogDQogLyoNCi0gKiBUaGlzIG1vZHVs
ZSBwcm92aWRlcyBzdXBwb3J0IGZvciB0aGUgYnVzLW1hc3RlciBJREUgRE1B
IGZ1bmN0aW9uDQotICogb2YgdGhlIEludGVsIFBDSSBUcml0b24gY2hpcHNl
dCBmYW1pbGllcywgd2hpY2ggdXNlIHRoZSBQSUlYIChpODIzNzFGQiwNCi0g
KiBmb3IgdGhlIDQzMCBGWCBjaGlwc2V0KSwgdGhlIFBJSVgzIChpODIzNzFT
QiBmb3IgdGhlIDQzMCBIWC9WWCBhbmQgDQotICogNDQwIGNoaXBzZXRzKSwg
YW5kIHRoZSBQSUlYNCAoaTgyMzcxQUIgZm9yIHRoZSA0MzAgVFggY2hpcHNl
dCkuDQorICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgc3VwcG9ydCBmb3IgYnVz
LW1hc3RlciBJREUgRE1BIGZ1bmN0aW9ucy4NCiAgKg0KLSAqICJQSUlYIiBz
dGFuZHMgZm9yICJQQ0kgSVNBIElERSBYY2VsbGVyYXRvciIuDQotICoNCi0g
KiBQcmV0dHkgbXVjaCB0aGUgc2FtZSBjb2RlIGNvdWxkIHdvcmsgZm9yIG90
aGVyIElERSBQQ0kgYnVzLW1hc3RlcmluZyBjaGlwc2V0cy4NCi0gKiBMb29r
IGZvciBETUEgc3VwcG9ydCBmb3IgdGhpcyBzb21lZGF5IGluIHRoZSBub3Qg
dG9vIGRpc3RhbnQgZnV0dXJlLg0KKyAqIE9uY2UgdGhpcyBtb2R1bGUgc3Vw
cG9ydGVkIG9ubHkgSW50ZWwgVHJpdG9uIGNoaXBzZXQgZmFtaWxpZXMsIHdo
aWNoIHVzZQ0KKyAqIHRoZSBQSUlYIChpODIzNzFGQiwgZm9yIHRoZSA0MzAg
RlggY2hpcHNldCksIHRoZSBQSUlYMyAoaTgyMzcxU0IgZm9yIHRoZQ0KKyAq
IDQzMCBIWC9WWCBhbmQ0NDAgY2hpcHNldHMpLCBhbmQgdGhlIFBJSVg0IChp
ODIzNzFBQiBmb3IgdGhlIDQzMCBUWCBjaGlwc2V0KS4NCisgKiBCdXQgbm93
IGl0J3Mga25vd24gdG8gd29yayBhbHNvIHdpdGggdGhlIFNJUyA1NTEzLzU1
NzEgY2hpcHNldCBhbmQgbWlnaHQNCisgKiB3b3JrIGZvciBhIGxvdCBvZiBv
dGhlciBjaGlwc2V0IGZhbWlsaWVzLg0KICAqDQogICogRE1BIGlzIHN1cHBv
cnRlZCBmb3IgYWxsIElERSBkZXZpY2VzIChkaXNrIGRyaXZlcywgY2Ryb21z
LCB0YXBlcywgZmxvcHBpZXMpLg0KICAqDQotICogVXAgdG8gZm91ciBkcml2
ZXMgbWF5IGJlIGVuYWJsZWQgZm9yIERNQSwgYW5kIHRoZSBQSUlYKiBjaGlw
cw0KLSAqIHdpbGwgYXJiaXRyYXRlIHRoZSBQQ0kgYnVzIGFtb25nIHRoZW0u
ICBOb3RlIHRoYXQgdGhlIFBJSVgvUElJWDMNCi0gKiBwcm92aWRlcyBhIHNp
bmdsZSAibGluZSBidWZmZXIiIGZvciB0aGUgQk0gSURFIGZ1bmN0aW9uLCBz
byBwZXJmb3JtYW5jZSBvZg0KLSAqIG11bHRpcGxlICh0d28pIGRyaXZlcyBk
b2luZyBETUEgc2ltdWx0YW5lb3VzbHkgd2lsbCBzdWZmZXIgc29tZXdoYXQs
DQotICogYXMgdGhleSBjb250ZXN0IGZvciB0aGF0IHJlc291cmNlIGJvdHRs
ZW5lY2suICBUaGlzIGlzIGhhbmRsZWQgdHJhbnNwYXJlbnRseQ0KLSAqIGlu
c2lkZSB0aGUgUElJWC9QSUlYMy4gIFRoZSBQSUlYNCBkb2VzIG5vdCBoYXZl
IHRoaXMgcHJvYmxlbS4NCisgKiBVcCB0byBmb3VyIGRyaXZlcyBtYXkgYmUg
ZW5hYmxlZCBmb3IgRE1BLCBhbmQgdGhlIElERSBjaGlwcw0KKyAqIHdpbGwg
YXJiaXRyYXRlIHRoZSBQQ0kgYnVzIGFtb25nIHRoZW0uICANCisgKg0KKyAq
IE5vdGUgdGhhdCB0aGUgUElJWC9QSUlYMyBwcm92aWRlcyBhIHNpbmdsZSAi
bGluZSBidWZmZXIiIGZvciB0aGUgQk0gSURFDQorICogZnVuY3Rpb24sIHNv
IHBlcmZvcm1hbmNlIG9mIG11bHRpcGxlICh0d28pIGRyaXZlcyBkb2luZyBE
TUEgDQorICogc2ltdWx0YW5lb3VzbHkgd2lsbCBzdWZmZXIgc29tZXdoYXQs
ICBhcyB0aGV5IGNvbnRlc3QgZm9yIHRoYXQgcmVzb3VyY2UNCisgKiBib3R0
bGVuZWNrLiAgVGhpcyBpcyBoYW5kbGVkIHRyYW5zcGFyZW50bHkgaW5zaWRl
IHRoZSBQSUlYL1BJSVgzLg0KKyAqIFRoZSBQSUlYNCBkb2VzIG5vdCBoYXZl
IHRoaXMgcHJvYmxlbS4NCiAgKg0KICAqIEJ5IGRlZmF1bHQsIERNQSBzdXBw
b3J0IGlzIHByZXBhcmVkIGZvciB1c2UsIGJ1dCBpcyBjdXJyZW50bHkgZW5h
YmxlZCBvbmx5DQogICogZm9yIGRyaXZlcyB3aGljaCBzdXBwb3J0IERNQSBt
b2RlMiAobXVsdGkvc2luZ2xlIHdvcmQpLCBvciB3aGljaCBhcmUNCkBAIC02
NCw3ICs2NCw5IEBADQogICogIlRYIiBjaGlwc2V0IGNvbXBhdGliaWxpdHkg
YW5kIGZvciBwcm92aWRpbmcgcGF0Y2hlcyBmb3IgdGhlICJUWCIgY2hpcHNl
dC4NCiAgKg0KICAqIEFuZCwgeWVzLCBJbnRlbCBaYXBwYSBib2FyZHMgcmVh
bGx5ICpkbyogdXNlIGJvdGggUElJWCBJREUgcG9ydHMuDQorICoNCiAgKi8N
CisNCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4NCiAjaW5jbHVkZSA8bGlu
dXgva2VybmVsLmg+DQogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+DQpAQCAt
ODIsOCArODQsNiBAQA0KICNpbmNsdWRlICJpZGUuaCINCiAjaW5jbHVkZSAi
aWRlX21vZGVzLmgiDQogDQotI2RlZmluZSBESVNQTEFZX1BJSVhfVElNSU5H
UwkvKiBkZWZpbmUgdGhpcyB0byBkaXNwbGF5IHRpbWluZ3MgKi8NCi0NCiAv
Kg0KICAqIGdvb2RfZG1hX2RyaXZlcygpIGxpc3RzIHRoZSBtb2RlbCBuYW1l
cyAoZnJvbSAiaGRwYXJtIC1pIikNCiAgKiBvZiBkcml2ZXMgd2hpY2ggZG8g
bm90IHN1cHBvcnQgbW9kZTIgRE1BIGJ1dCB3aGljaCBhcmUNCkBAIC0xMTcs
MzkgKzExNyw2IEBADQogICovDQogc3RhdGljIHVuc2lnbmVkIGludCBwaWl4
X2tleTsNCiANCi0jZGVmaW5lIFBJSVhfRkxBR1NfRkFTVF9QSU8JMQ0KLSNk
ZWZpbmUgUElJWF9GTEFHU19VU0VfSU9SRFkJMg0KLSNkZWZpbmUgUElJWF9G
TEFHU19QUkVGRVRDSAk0DQotI2RlZmluZSBQSUlYX0ZMQUdTX0ZBU1RfRE1B
CTgNCi0NCi0NCi11bmlvbiBjaGlwX2VuX3JlZ191IHsNCi0Jc3RydWN0IHsN
Ci0JCXVuc2lnbmVkIGQwX2ZsYWdzCTo0Ow0KLQkJdW5zaWduZWQgZDFfZmxh
Z3MJOjQ7DQotCQl1bnNpZ25lZCByZWNvdmVyeQk6MjsNCi0JCXVuc2lnbmVk
IHJlc2VydmVkCToyOw0KLQkJdW5zaWduZWQgc2FtcGxlCQk6MjsNCi0JCXVu
c2lnbmVkIHNpZGV0aW1fZW5hYmxlZDoxOw0KLQkJdW5zaWduZWQgcG9ydHNf
ZW5hYmxlZAk6MTsNCi0JfSBwaWl4X3M7DQotCXN0cnVjdCB7DQotCQl1bnNp
Z25lZCBzZWNfZW4JCToxOw0KLQkJdW5zaWduZWQgcHJpX2VuCQk6MTsNCi0J
CXVuc2lnbmVkIHJlc2VydmVkCToxNDsNCi0JfSB2aWFfczsNCi19Ow0KLQ0K
LXR5cGVkZWYgdW5pb24gY2hpcF9lbl9yZWdfdSBwaWl4X3RpbWluZ190Ow0K
LQ0KLXR5cGVkZWYgc3RydWN0IHsNCi0JdW5zaWduZWQgcHJpX3JlY292ZXJ5
CToyOw0KLQl1bnNpZ25lZCBwcmlfc2FtcGxlCToyOw0KLQl1bnNpZ25lZCBz
ZWNfcmVjb3ZlcnkJOjI7DQotCXVuc2lnbmVkIHNlY19zYW1wbGUJOjI7DQot
fSBwaWl4X3NpZGV0aW1fdDsNCi0NCi0NCiAvKg0KICAqIFdlIGN1cnJlbnRs
eSBjYW4gaGFuZGxlIG9ubHkgb25lIFBJSVggY2hpcCBoZXJlDQogICovDQpA
QCAtMjY1LDM1ICsyMzIsMTIgQEANCiB7DQogCXVuc2lnbmVkIGxvbmcgZG1h
X2Jhc2UgPSBIV0lGKGRyaXZlKS0+ZG1hX2Jhc2U7DQogCXVuc2lnbmVkIGlu
dCByZWFkaW5nID0gKDEgPDwgMyk7DQotCXBpaXhfdGltaW5nX3QgdGltaW5n
Ow0KLQl1bnNpZ25lZCBzaG9ydCByZWc7DQotCWJ5dGUgZGZsYWdzOw0KIA0K
IAlzd2l0Y2ggKGZ1bmMpIHsNCiAJCWNhc2UgaWRlX2RtYV9vZmY6DQogCQkJ
cHJpbnRrKCIlczogRE1BIGRpc2FibGVkXG4iLCBkcml2ZS0+bmFtZSk7DQog
CQljYXNlIGlkZV9kbWFfb246DQogCQkJZHJpdmUtPnVzaW5nX2RtYSA9IChm
dW5jID09IGlkZV9kbWFfb24pOw0KLQkJCXJlZyA9IChIV0lGKGRyaXZlKS0+
aW9fcG9ydHNbSURFX0RBVEFfT0ZGU0VUXSA9PSAweDE3MCkgPyAweDQyIDog
MHg0MDsNCi0JCQlpZiAocGNpYmlvc19yZWFkX2NvbmZpZ193b3JkKHBpaXhf
cGNpX2J1cywgcGlpeF9wY2lfZm4sIHJlZywgKHNob3J0ICopJnRpbWluZykp
IHsNCi0JCQkJcHJpbnRrKCIlczogcGNpYmlvcyByZWFkIGZhaWxlZFxuIiwg
SFdJRihkcml2ZSktPm5hbWUpOw0KLQkJCQlyZXR1cm4gMTsNCi0JCQl9DQot
CQkJZGZsYWdzID0gZHJpdmUtPnNlbGVjdC5iLnVuaXQgPyB0aW1pbmcucGlp
eF9zLmQxX2ZsYWdzIDogdGltaW5nLnBpaXhfcy5kMF9mbGFnczsNCi0JCQlp
ZiAoZGZsYWdzICYgUElJWF9GTEFHU19GQVNUX1BJTykgew0KLQkJCQlpZiAo
ZnVuYyA9PSBpZGVfZG1hX29uICYmIGRyaXZlLT5tZWRpYSA9PSBpZGVfZGlz
aykNCi0JCQkJCWRmbGFncyB8PSBQSUlYX0ZMQUdTX0ZBU1RfRE1BOw0KLQkJ
CQllbHNlDQotCQkJCQlkZmxhZ3MgJj0gflBJSVhfRkxBR1NfRkFTVF9ETUE7
DQotCQkJCWlmIChkcml2ZS0+c2VsZWN0LmIudW5pdCA9PSAwKQ0KLQkJCQkJ
dGltaW5nLnBpaXhfcy5kMF9mbGFncyA9IGRmbGFnczsNCi0JCQkJZWxzZQ0K
LQkJCQkJdGltaW5nLnBpaXhfcy5kMV9mbGFncyA9IGRmbGFnczsNCi0JCQkJ
aWYgKHBjaWJpb3Nfd3JpdGVfY29uZmlnX3dvcmQocGlpeF9wY2lfYnVzLCBw
aWl4X3BjaV9mbiwgcmVnLCAqKHNob3J0ICopJnRpbWluZykpIHsNCi0JCQkJ
CXByaW50aygiJXM6IHBjaWJpb3Mgd3JpdGUgZmFpbGVkXG4iLCBIV0lGKGRy
aXZlKS0+bmFtZSk7DQotCQkJCQlyZXR1cm4gMTsNCi0JCQkJfQ0KLQkJCX0N
CiAJCQlyZXR1cm4gMDsNCiAJCWNhc2UgaWRlX2RtYV9hYm9ydDoNCiAJCQlv
dXRiKGluYihkbWFfYmFzZSkmfjEsIGRtYV9iYXNlKTsJLyogc3RvcCBETUEg
Ki8NCkBAIC0zNTIsMjEgKzI5Niw2IEBADQogCXJldHVybiBwaWl4X2RtYXBy
b2MoaWRlX2RtYV9vZmYsIGRyaXZlKTsNCiB9DQogDQotI2lmZGVmIERJU1BM
QVlfUElJWF9USU1JTkdTDQotLyoNCi0gKiBwcmludF9waWl4X2RyaXZlX2Zs
YWdzKCkgZGlzcGxheXMgdGhlIGN1cnJlbnRseSBwcm9ncmFtbWVkIG9wdGlv
bnMNCi0gKiBpbiB0aGUgUElJWC9QSUlYMy9QSUlYNCBmb3IgYSBnaXZlbiBk
cml2ZS4NCi0gKi8NCi1zdGF0aWMgdm9pZCBwcmludF9waWl4X2RyaXZlX2Zs
YWdzIChjb25zdCBjaGFyICp1bml0LCBieXRlIGRmbGFncykNCi17DQotCXBy
aW50aygiICAgICAgICAgJXMgIiwgdW5pdCk7DQotCXByaW50ayggImZhc3RE
TUE9JXMiLAkoZGZsYWdzICYgUElJWF9GTEFHU19GQVNUX1BJTykJPyAieWVz
IiA6ICJubyAiKTsNCi0JcHJpbnRrKCIgUHJlRmV0Y2g9JXMiLAkoZGZsYWdz
ICYgUElJWF9GTEFHU19QUkVGRVRDSCkJPyAib24gIiA6ICJvZmYiKTsNCi0J
cHJpbnRrKCIgSU9SRFk9JXMiLAkoZGZsYWdzICYgUElJWF9GTEFHU19VU0Vf
SU9SRFkpCT8gIm9uICIgOiAib2ZmIik7DQotCXByaW50aygiIGZhc3RQSU89
JXNcbiIsCSgoZGZsYWdzICYgKFBJSVhfRkxBR1NfRkFTVF9QSU98UElJWF9G
TEFHU19GQVNUX0RNQSkpID09IFBJSVhfRkxBR1NfRkFTVF9QSU8pID8gIm9u
ICIgOiAib2ZmIik7DQotfQ0KLSNlbmRpZiAvKiBESVNQTEFZX1BJSVhfVElN
SU5HUyAqLw0KLQ0KIHN0YXRpYyB2b2lkIGluaXRfcGlpeF9kbWEgKGlkZV9o
d2lmX3QgKmh3aWYsIHVuc2lnbmVkIHNob3J0IGJhc2UpDQogew0KIAlzdGF0
aWMgdW5zaWduZWQgbG9uZyBkbWF0YWJsZSA9IDA7DQpAQCAtNDQ1LDcgKzM3
NCw3IEBADQogLyoNCiAgKiBpZGVfaW5pdF90cml0b24oKSBwcmVwYXJlcyB0
aGUgSURFIGRyaXZlciBmb3IgRE1BIG9wZXJhdGlvbi4NCiAgKiBUaGlzIHJv
dXRpbmUgaXMgY2FsbGVkIG9uY2UsIGZyb20gaWRlLmMgZHVyaW5nIGRyaXZl
ciBpbml0aWFsaXphdGlvbiwNCi0gKiBmb3IgZWFjaCB0cml0b24gY2hpcHNl
dCB3aGljaCBpcyBmb3VuZCAodW5saWtlbHkgdG8gYmUgbW9yZSB0aGFuIG9u
ZSkuDQorICogZm9yIGVhY2ggY2hpcHNldCB3aGljaCBpcyBmb3VuZCAodW5s
aWtlbHkgdG8gYmUgbW9yZSB0aGFuIG9uZSkuDQogICovDQogdm9pZCBpZGVf
aW5pdF90cml0b24gKGJ5dGUgYnVzLCBieXRlIGZuKQ0KIHsNCkBAIC00NTQs
NyArMzgzLDYgQEANCiAJdW5zaWduZWQgc2hvcnQgcGNpY21kLCBkZXZpZDsN
CiAJdW5zaWduZWQgaW50IGJtaWJhOw0KIAljb25zdCBjaGFyICpjaGlwc2V0
ID0gImlkZSI7DQotCXBpaXhfdGltaW5nX3QgdGltaW5nc1syXTsNCiANCiAJ
cGlpeF9wY2lfYnVzID0gYnVzOw0KIAlwaWl4X3BjaV9mbiAgPSBmbjsNCkBA
IC00NzAsOSArMzk4LDExIEBADQogCQljaGlwc2V0ID0gIlBJSVgiOw0KIAll
bHNlIGlmIChkZXZpZCA9PSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1ODZfMSkN
CiAJCWNoaXBzZXQgPSAiVlAxIjsNCisJZWxzZSBpZiAoZGV2aWQgPT0gUENJ
X0RFVklDRV9JRF9TSV81NTEzKQ0KKwkJY2hpcHNldCA9ICJTSVMiOw0KIAll
bHNlIHsNCiAJCXByaW50aygiVW5rbm93biBQQ0kgSURFIGludGVyZmFjZSAw
eCV4XG4iLCBkZXZpZCk7DQotCQlnb3RvIHF1aXQ7DQorCQljaGlwc2V0ID0g
IlVua25vd24iOw0KIAl9DQogDQogCXByaW50aygiJXM6IGJ1cy1tYXN0ZXIg
SURFIGRldmljZSBvbiBQQ0kgYnVzICVkIGZ1bmN0aW9uICVkXG4iLCBjaGlw
c2V0LCBidXMsIGZuKTsNCkBAIC00ODYsMjUgKzQxNiw2IEBADQogCQlwcmlu
dGsoIiVzOiBJREUgcG9ydHMgYXJlIG5vdCBlbmFibGVkIChCSU9TKVxuIiwg
Y2hpcHNldCk7DQogCQlnb3RvIHF1aXQ7DQogCX0NCi0JaWYgKGRldmlkID09
IFBDSV9ERVZJQ0VfSURfVklBXzgyQzU4Nl8xKSB7DQotCQkvKiBwcmkgYW5k
IHNlYyBjaGFubmVsIGVuYWJsZXMgYXJlIGluIHBvcnQgMHg0MCAqLw0KLQkJ
aWYgKChyYyA9IHBjaWJpb3NfcmVhZF9jb25maWdfd29yZChidXMsIGZuLCAw
eDQwLCAoc2hvcnQgKikmdGltaW5nc1swXSkpKQ0KLQkJCWdvdG8gcXVpdDsN
Ci0JCWlmICgoIXRpbWluZ3NbMF0udmlhX3MucHJpX2VuICYmICghdGltaW5n
c1swXS52aWFfcy5zZWNfZW4pKSkgew0KLQkJCXByaW50aygiJXM6IG5laXRo
ZXIgSURFIHBvcnQgaXMgZW5hYmxlZFxuIiwgY2hpcHNldCk7DQotCQkJZ290
byBxdWl0Ow0KLQkJfQ0KLQl9DQotCWVsc2UgewkJLyogSU5URUwgcGlpeCAq
Lw0KLQkJaWYgKChyYyA9IHBjaWJpb3NfcmVhZF9jb25maWdfd29yZChidXMs
IGZuLCAweDQwLCAoc2hvcnQgKikmdGltaW5nc1swXSkpKQ0KLQkJCWdvdG8g
cXVpdDsNCi0JCWlmICgocmMgPSBwY2liaW9zX3JlYWRfY29uZmlnX3dvcmQo
YnVzLCBmbiwgMHg0MiwgKHNob3J0ICopJnRpbWluZ3NbMV0pKSkNCi0JCQln
b3RvIHF1aXQ7DQotCQlpZiAoKCF0aW1pbmdzWzBdLnBpaXhfcy5wb3J0c19l
bmFibGVkKSAmJiAoIXRpbWluZ3NbMV0ucGlpeF9zLnBvcnRzX2VuYWJsZWQp
KSB7DQotCQkJcHJpbnRrKCIlczogbmVpdGhlciBJREUgcG9ydCBpcyBlbmFi
bGVkXG4iLCBjaGlwc2V0KTsNCi0JCQlnb3RvIHF1aXQ7DQotCQl9DQotCX0N
CiANCiAJLyoNCiAJICogU2VlIGlmIEJ1cy1NYXN0ZXJlZCBETUEgaXMgZW5h
YmxlZA0KQEAgLTU0Niw3ICs0NTcsNiBAQA0KIAkgKi8NCiAJZm9yIChoID0g
MDsgaCA8IE1BWF9IV0lGUzsgKytoKSB7DQogCQl1bnNpZ25lZCBpbnQgcHJp
X3NlYzsNCi0JCXBpaXhfdGltaW5nX3QgdGltaW5nOw0KIAkJaWRlX2h3aWZf
dCAqaHdpZiA9ICZpZGVfaHdpZnNbaF07DQogCQlzd2l0Y2ggKGh3aWYtPmlv
X3BvcnRzW0lERV9EQVRBX09GRlNFVF0pIHsNCiAJCQljYXNlIDB4MWYwOglw
cmlfc2VjID0gMDsgYnJlYWs7DQpAQCAtNTU0LDc3ICs0NjQsMTAgQEANCiAJ
CQlkZWZhdWx0Ogljb250aW51ZTsNCiAJCX0NCiANCi0JCWlmIChkZXZpZCA9
PSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1ODZfMSkgew0KLQkJCXRpbWluZyA9
IHRpbWluZ3NbMF07DQotCQkJc3dpdGNoIChoKSB7DQotCQkJCWNhc2UgMDoN
Ci0JCQkJCWlmICghdGltaW5nLnBpaXhfcy5wb3J0c19lbmFibGVkKSB7DQot
CQkJcHJpbnRrKCJwb3J0IDAgRE1BIG5vdCBlbmFibGVkXG4iKTsNCi0JCQkJ
CQljb250aW51ZTsNCi0JCQkJCX0NCi0JCQkJY2FzZSAxOg0KLQkJCQkJaWYg
KCF0aW1pbmcucGlpeF9zLnNpZGV0aW1fZW5hYmxlZCkgew0KLQkJCXByaW50
aygicG9ydCAxIERNQSBub3QgZW5hYmxlZFxuIik7DQotCQkJCQkJY29udGlu
dWU7DQotCQkJCQl9DQotCQkJfQ0KLQkJCWh3aWYtPmNoaXBzZXQgPSBpZGVf
dmlhOw0KLQkJfQ0KLQkJZWxzZSB7CQkvKiBQSUlYICovDQorCQlod2lmLT5j
aGlwc2V0ID0gaWRlX3BjaWRtYTsNCiANCi0JCXRpbWluZyA9IHRpbWluZ3Nb
cHJpX3NlY107DQotCQlpZiAoIXRpbWluZy5waWl4X3MucG9ydHNfZW5hYmxl
ZCkJLyogaW50ZXJmYWNlIGRpc2FibGVkPyAqLw0KLQkJCWNvbnRpbnVlOw0K
LQkJaHdpZi0+Y2hpcHNldCA9IGlkZV90cml0b247DQotCQl9DQogCQlpZiAo
ZG1hX2VuYWJsZWQpDQogCQkJaW5pdF9waWl4X2RtYShod2lmLCBibWliYSAr
IChwcmlfc2VjID8gOCA6IDApKTsNCi0jaWZkZWYgRElTUExBWV9QSUlYX1RJ
TUlOR1MNCi0JCS8qDQotCQkgKiBEaXNwbGF5IGRyaXZlIHRpbWluZ3MvbW9k
ZXMNCi0JCSAqLw0KLQkJew0KLQkJCWNvbnN0IGNoYXIgKnNsYXZlOw0KLQkJ
CXBpaXhfc2lkZXRpbV90IHNpZGV0aW07DQotCQkJYnl0ZSBzYW1wbGUgICA9
IDUgLSB0aW1pbmcucGlpeF9zLnNhbXBsZTsNCi0JCQlieXRlIHJlY292ZXJ5
ID0gNCAtIHRpbWluZy5waWl4X3MucmVjb3Zlcnk7DQotCQkJdW5zaWduZWQg
aW50IGRydnRpbTsNCi0NCi0JCQlpZiAoZGV2aWQgPT0gUENJX0RFVklDRV9J
RF9WSUFfODJDNTg2XzEpIHsNCi0JCQkJcGNpYmlvc19yZWFkX2NvbmZpZ19k
d29yZChidXMsIGZuLCAweDQ4LCAmZHJ2dGltKTsNCi0JCQkJaWYgKHByaV9z
ZWMgPT0gMCkgeyANCi0JCQkJCXByaW50aygiICAgICVzIG1hc3RlcjogYWN0
aXZlX3B1bHNlX0NMS3M9JWQsIHJlY292ZXJ5X0NMS3M9JWRcbiIsIGh3aWYt
Pm5hbWUsIDErKGRydnRpbT4+MjgpLCAxKygoZHJ2dGltICYgMHgwZjAwMDAw
MCk+PjI0KSk7DQotCQkJCQlwcmludGsoIiAgICAlcyBzbGF2ZTogYWN0aXZl
X3B1bHNlX0NMS3M9JWQsIHJlY292ZXJ5X0NMS3M9JWRcbiIsIGh3aWYtPm5h
bWUsIDErKChkcnZ0aW0gJiAweGYwMDAwMCk+PjIwKSwgMSsoKGRydnRpbSAm
IDB4MGYwMDAwKT4+MTYpKTsNCi0JCQkJCWNvbnRpbnVlOw0KLQkJCQl9IGVs
c2Ugew0KLQkJCQkJcHJpbnRrKCIgICAgJXMgbWFzdGVyOiBhY3RpdmVfcHVs
c2VfQ0xLcz0lZCwgcmVjb3ZlcnlfQ0xLcz0lZFxuIiwgaHdpZi0+bmFtZSwg
MSsoKGRydnRpbSAmIDB4ZjAwMCk+PjEyKSwgMSsoKGRydnRpbSAmIDB4MGYw
MCk+PjgpKTsNCi0JCQkJCXByaW50aygiICAgICVzIHNsYXZlOiBhY3RpdmVf
cHVsc2VfQ0xLcz0lZCwgcmVjb3ZlcnlfQ0xLcz0lZFxuIiwgaHdpZi0+bmFt
ZSwgMSsoKGRydnRpbSAmIDB4ZjApPj40KSwgMSsoZHJ2dGltICYgMHgwZikp
Ow0KLQkJCQkJY29udGludWU7DQotCQkJCX0NCi0JCQl9DQotCQ0KLQkJCWlm
ICgoZGV2aWQgPT0gUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MVNCXzENCi0J
CQkgICAgIHx8IGRldmlkID09IFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFB
QikNCi0JCQkgJiYgdGltaW5nLnBpaXhfcy5zaWRldGltX2VuYWJsZWQNCi0J
CQkgJiYgIXBjaWJpb3NfcmVhZF9jb25maWdfYnl0ZShidXMsIGZuLCAweDQ0
LCAoYnl0ZSAqKSAmc2lkZXRpbSkpDQotCQkJCXNsYXZlID0gIiI7CQkvKiBQ
SUlYMyBhbmQgbGF0ZXIgKi8NCi0JCQllbHNlDQotCQkJCXNsYXZlID0gIi9z
bGF2ZSI7CS8qIFBJSVgsIG9yIFBJSVgzIGluIGNvbXBhdGliaWxpdHkgbW9k
ZSAqLw0KLQkJCXByaW50aygiICAgICVzIG1hc3RlciVzOiBzYW1wbGVfQ0xL
cz0lZCwgcmVjb3ZlcnlfQ0xLcz0lZFxuIiwgaHdpZi0+bmFtZSwgc2xhdmUs
IHNhbXBsZSwgcmVjb3ZlcnkpOw0KLQkJCXByaW50X3BpaXhfZHJpdmVfZmxh
Z3MgKCJtYXN0ZXI6IiwgdGltaW5nLnBpaXhfcy5kMF9mbGFncyk7DQotCQkJ
aWYgKCEqc2xhdmUpIHsNCi0JCQkJaWYgKHByaV9zZWMgPT0gMCkgew0KLQkJ
CQkJc2FtcGxlICAgPSA1IC0gc2lkZXRpbS5wcmlfc2FtcGxlOw0KLQkJCQkJ
cmVjb3ZlcnkgPSA0IC0gc2lkZXRpbS5wcmlfcmVjb3Zlcnk7DQotCQkJCX0g
ZWxzZSB7DQotCQkJCQlzYW1wbGUgICA9IDUgLSBzaWRldGltLnNlY19zYW1w
bGU7DQotCQkJCQlyZWNvdmVyeSA9IDQgLSBzaWRldGltLnNlY19yZWNvdmVy
eTsNCi0JCQkJfQ0KLQkJCQlwcmludGsoIiAgICAgICAgIHNsYXZlIDogc2Ft
cGxlX0NMS3M9JWQsIHJlY292ZXJ5X0NMS3M9JWRcbiIsIHNhbXBsZSwgcmVj
b3ZlcnkpOw0KLQkJCX0NCi0JCQlwcmludF9waWl4X2RyaXZlX2ZsYWdzICgi
c2xhdmUgOiIsIHRpbWluZy5waWl4X3MuZDFfZmxhZ3MpOw0KLQkJfQ0KLSNl
bmRpZiAvKiBESVNQTEFZX1BJSVhfVElNSU5HUyAqLw0KIAl9DQogDQogcXVp
dDogaWYgKHJjKSBwcmludGsoIiVzOiBwY2liaW9zIGFjY2VzcyBmYWlsZWQg
LSAlc1xuIiwgY2hpcHNldCwgcGNpYmlvc19zdHJlcnJvcihyYykpOw0K
---1363078244-590163263-874753420=:479--