Subject: Driver for AMD K7 POWERNOW
To: None <port-i386@netbsd.org>
From: =?ISO-8859-1?Q?Martin_V=E9giard?= <deadbug@gmail.com>
List: port-i386
Date: 07/10/2004 20:37:57
------=_Part_57_28260080.1089506277228
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Hi,

I have written a driver for AMD's POWERNOW function on K7 CPUs. It
enables CPU frequency scaling which allows laptops with AMD K7 CPUs to
have longer battery life and stay cool.

http://www.amd.com/us-en/Processors/ProductInformation/0,,30_118_10220_1022=
1%5E964,00.html

I have made it compatible to i386/est.c (Intel SpeedStep) sysctl's interfac=
e.

example :

# sysctl machdep.powernow.
machdep.powernow.frequency.target =3D 1795
machdep.powernow.frequency.current =3D 1795
machdep.powernow.frequency.available =3D 532 665 798 931 1330 1795

# sysctl -w machdep.powernow.frequency.target=3D532
machdep.powernow.frequency.target: 1795 -> 532

I have included patches to make this driver work with NetBSD 2.0G,
make sure you add "options POWERNOW_K7" in your kernel configuration
file.

Todo:
- Multiprocessor support?
- line 181 of pnow_k7.c (cpuid =3D=3D 0x?60 .. ignored for now)
...

Enjoy=20

Martin V=E9giard

------=_Part_57_28260080.1089506277228
Content-Type: application/octet-stream; name="powernow_k7.patch"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="powernow_k7.patch"

SW5kZXg6IGNvbmYvZmlsZXMuaTM4Ngo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvY3Zzcm9vdC9zcmMv
c3lzL2FyY2gvaTM4Ni9jb25mL2ZpbGVzLmkzODYsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMjU3
CmRpZmYgLXUgLXIxLjI1NyBmaWxlcy5pMzg2Ci0tLSBjb25mL2ZpbGVzLmkzODYJNCBKdWwgMjAw
NCAxNToyMjowMyAtMDAwMAkxLjI1NworKysgY29uZi9maWxlcy5pMzg2CTEwIEp1bCAyMDA0IDIz
OjM3OjUxIC0wMDAwCkBAIC02NCw2ICs2NCw5IEBACiAjIEVuaGFuY2VkIFNwZWVkU3RlcAogZGVm
ZmxhZwkJCUVOSEFOQ0VEX1NQRUVEU1RFUAogCisjIFBvd2Vybm93IEs3CisjZGVmZmxhZwkJCVBP
V0VSTk9XX0s3CisKIGZpbGUJYXJjaC9pMzg2L2kzODYvYXV0b2NvbmYuYwogZmlsZQlhcmNoL2kz
ODYvaTM4Ni9kYl9kYmdyZWcuUwlkZGIgfCBrc3RhY2tfY2hlY2tfZHIwCiBmaWxlCWFyY2gvaTM4
Ni9pMzg2L2RiX2Rpc2FzbS5jCWRkYgpAQCAtNDc2LDUgKzQ3OSw2IEBACiAKICMgRW5oYW5jZWQg
U3BlZWRTdGVwCiBmaWxlCWFyY2gvaTM4Ni9pMzg2L2VzdC5jCQllbmhhbmNlZF9zcGVlZHN0ZXAK
K2ZpbGUJYXJjaC9pMzg2L2kzODYvcG5vd19rNy5jCXBvd2Vybm93X2s3CiAKIGluY2x1ZGUgImFy
Y2gvaTM4Ni9jb25mL21ham9ycy5pMzg2IgpJbmRleDogaTM4Ni9pZGVudGNwdS5jCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KUkNTIGZpbGU6IC9jdnNyb290L3NyYy9zeXMvYXJjaC9pMzg2L2kzODYvaWRlbnRjcHUuYyx2
CnJldHJpZXZpbmcgcmV2aXNpb24gMS4xMwpkaWZmIC11IC1yMS4xMyBpZGVudGNwdS5jCi0tLSBp
Mzg2L2lkZW50Y3B1LmMJMzAgQXByIDIwMDQgMDI6MDU6NDMgLTAwMDAJMS4xMworKysgaTM4Ni9p
ZGVudGNwdS5jCTEwIEp1bCAyMDA0IDIzOjM3OjUzIC0wMDAwCkBAIC0xMzcyLDQgKzEzNzIsMTkg
QEAKIAl9CiAjZW5kaWYgLyogRU5IQU5DRURfU1BFRURTVEVQICovCiAKKyNpZmRlZiBQT1dFUk5P
V19LNworCS8qIFhYWCB2ZXJpZnkgbWUgKi8KKwkKKwkvKiBMZXQncyBtYWtlIHN1cmUgaXQncyBh
IE1vYmlsZSBBTUQgSzcgY3B1ICovCisJaWYgKGNpLT5jaV9jcHVfY2xhc3MgPT0gQ1BVQ0xBU1Nf
Njg2ICYmICpjcHVfYnJhbmRfc3RyaW5nICE9ICdcMCcpIHsKKwkJaWYgKCFtZW1jbXAoIk1vYmls
ZSBBTUQgQXRobG9uKHRtKSIsIGNwdV9icmFuZF9zdHJpbmcsIDIxKSkgeworCQkJCisJCQlwbm93
azdfaW5pdChjaSk7CisJCX0gCisJfQorCisjZW5kaWYgLyogUE9XRVJOT1dfSzcgKi8KKwogfQor
CkluZGV4OiBpbmNsdWRlL2NwdS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9jdnNyb290L3NyYy9z
eXMvYXJjaC9pMzg2L2luY2x1ZGUvY3B1LmgsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMTE1CmRp
ZmYgLXUgLXIxLjExNSBjcHUuaAotLS0gaW5jbHVkZS9jcHUuaAkxNiBNYXkgMjAwNCAxMjozMjo1
MyAtMDAwMAkxLjExNQorKysgaW5jbHVkZS9jcHUuaAkxMCBKdWwgMjAwNCAyMzozNzo1NCAtMDAw
MApAQCAtNDM2LDYgKzQzNiw5IEBACiAvKiBlc3QuYyAqLwogdm9pZAllc3RfaW5pdChzdHJ1Y3Qg
Y3B1X2luZm8gKik7CiAKKy8qIHBub3dfazcuYyAqLwordm9pZAlwbm93azdfaW5pdChzdHJ1Y3Qg
Y3B1X2luZm8gKik7CisKICNlbmRpZiAvKiBfS0VSTkVMICovCiAKIC8qCi0tLSAvZGV2L251bGwJ
MjAwNC0wNy0xMCAxOToyMTo0OS4wMDAwMDAwMDAgLTA0MDAKKysrIC4vaTM4Ni9wbm93X2s3LmMJ
MjAwNC0wNy0xMCAxOTo0MDo1Ni4wMDAwMDAwMDAgLTA0MDAKQEAgLTAsMCArMSwzMjEgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgTWFydGluIFbpZ2lhcmQuCisgKiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJl
IHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20g
dGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycn
IEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAor
ICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworLyogQU1EIFBPV0VSTk9XIEs3IGRyaXZlciAqLworCisvKiBTeXNjdGwg
cmVsYXRlZCBjb2RlIHdhcyBhZGFwdGVkIGZyb20gTmV0QlNEJ3MgaTM4Ni9lc3QuYyBmb3IgY29t
cGF0aWJpbGl0eSAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3Bh
cmFtLmg+CisjaW5jbHVkZSA8c3lzL3N5c3RtLmg+CisjaW5jbHVkZSA8c3lzL21hbGxvYy5oPgor
I2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4KKworI2luY2x1ZGUgPGRldi9pc2EvaXNhcmVnLmg+CisK
KyNpbmNsdWRlIDxtYWNoaW5lL2NwdS5oPgorI2luY2x1ZGUgPG1hY2hpbmUvaXNhX21hY2hkZXAu
aD4KKworI2RlZmluZSBCSU9TX1NUQVJUIAkJMHhlMDAwMAorI2RlZmluZSBCSU9TX0VORAkJMHgy
MDAwMAorI2RlZmluZSBCSU9TX0xFTgkJQklPU19FTkQgLSBCSU9TX1NUQVJUCisKKyNkZWZpbmUg
TVNSX0s3X0NUTAkJMHhDMDAxMDA0MQorI2RlZmluZSBDVExfU0VUX0ZJRAkJMHgwMDAwMDAwMDAw
MDEwMDAwVUxMCisjZGVmaW5lIENUTF9TRVRfVklECQkweDAwMDAwMDAwMDAwMjAwMDBVTEwKKwor
I2RlZmluZSBjcHVmcmVxKHgpCWZzYiAqIGZpZF9jb2Rlc1t4XSAvIDEwCisKK3N0cnVjdCBwc2Jf
cyB7CisJY2hhciBzaWduYXR1cmVbMTBdOyAgCS8qIEFNREs3UE5PVyEgKi8KKwl1aW50OF90IHZl
cnNpb247CisJdWludDhfdCBmbGFnczsKKwl1aW50MTZfdCB0dGltZTsJCS8qIE1pbiBTZXR0bGlu
ZyB0aW1lICovCisJdWludDhfdCByZXNlcnZlZDsKKwl1aW50OF90IG5fcHN0OworfTsKKworc3Ry
dWN0IHBzdF9zIHsKKwljcHVpZF90IGNwdWlkOworCXVpbnQ4X3QgZnNiOwkJLyogRnJvbnQgU2lk
ZSBCdXMgZnJlcXVlbmN5IChNaHopICovCisJdWludDhfdCBmaWQ7CQkvKiBNYXggRnJlcXVlbmN5
IGNvZGUgKi8KKwl1aW50OF90IHZpZDsJCS8qIE1heCBWb2x0YWdlIGNvZGUgKi8KKwl1aW50OF90
IG5fc3RhdGVzOwkvKiBOdW1iZXIgb2Ygc3RhdGVzICovCit9OwkKKworc3RydWN0IHN0YXRlX3Mg
eworCXVpbnQ4X3QgZmlkOyAgCQkvKiBGcmVxdWVuY3kgY29kZSAqLworCXVpbnQ4X3QgdmlkOwkJ
LyogVm9sdGFnZSBjb2RlICovCit9OworCitzdHJ1Y3QgZnJlcV90YWJsZV9zIHsKKwl1bnNpZ25l
ZCBpbnQgZnJlcXVlbmN5OworCXN0cnVjdCBzdGF0ZV9zICpzdGF0ZTsKK307CisKKy8qIFRha2Vu
IGZyb20gcG93ZXJub3ctazcuYy9MaW51eCBieSBEYXZlIEpvbmVzICovCitzdGF0aWMgaW50IGZp
ZF9jb2Rlc1szMl0gPSB7CisJMTEwLCAxMTUsIDEyMCwgMTI1LCA1MCwgNTUsIDYwLCA2NSwKKwk3
MCwgNzUsIDgwLCA4NSwgOTAsIDk1LCAxMDAsIDEwNSwKKwkzMCwgMTkwLCA0MCwgMjAwLCAxMzAs
IDEzNSwgMTQwLCAyMTAsCisJMTUwLCAyMjUsIDE2MCwgMTY1LCAxNzAsIDE4MCwgLTEsIC0xCit9
OworCisvKiBTdGF0aWMgdmFyaWFibGVzICovCitzdGF0aWMgdW5zaWduZWQgaW50IGZzYjsKK3N0
YXRpYyB1bnNpZ25lZCBpbnQgY3VyX2ZyZXE7CitzdGF0aWMgdW5zaWduZWQgaW50IHR0aW1lOwor
c3RhdGljIHVuc2lnbmVkIGludCBuX3N0YXRlczsKK3N0YXRpYyBzdHJ1Y3QgZnJlcV90YWJsZV9z
ICpmcmVxX3RhYmxlOworc3RhdGljIGludCBwb3dlcm5vd19ub2RlX3RhcmdldCwgcG93ZXJub3df
bm9kZV9jdXJyZW50OworCisKKy8qIFByb3RvdHlwZXMgKi8KK3N0cnVjdCBzdGF0ZV9zICpwbm93
azdfZ2V0c3RhdGVzKGNwdWlkX3QgY3B1aWQpOworaW50IHBub3drN19zZXRzdGF0ZSh1bnNpZ25l
ZCBpbnQgZnJlcSk7CitzdGF0aWMgaW50IHBvd2Vybm93X3N5c2N0bF9oZWxwZXIoU1lTQ1RMRk5f
QVJHUyk7CisKK3N0YXRpYyBpbnQKK3Bvd2Vybm93X3N5c2N0bF9oZWxwZXIoU1lTQ1RMRk5fQVJH
UykKK3sKKyAgICAgICAgc3RydWN0IHN5c2N0bG5vZGUgbm9kZTsKKyAgICAgICAgaW50IGZxLCBv
bGRmcSwgZXJyb3I7CisKKyAgICAgICAgaWYgKGZyZXFfdGFibGUgPT0gTlVMTCkKKyAgICAgICAg
ICAgICAgICByZXR1cm4gKEVPUE5PVFNVUFApOworCisgICAgICAgIG5vZGUgPSAqcm5vZGU7Cisg
ICAgICAgIG5vZGUuc3lzY3RsX2RhdGEgPSAmZnE7CisKKwlvbGRmcSA9IDA7CisgICAgICAgIGlm
IChybm9kZS0+c3lzY3RsX251bSA9PSBwb3dlcm5vd19ub2RlX3RhcmdldCkKKyAgICAgICAgICAg
ICAgICBmcSA9IG9sZGZxID0gY3VyX2ZyZXE7CisgICAgICAgIGVsc2UgaWYgKHJub2RlLT5zeXNj
dGxfbnVtID09IHBvd2Vybm93X25vZGVfY3VycmVudCkKKyAgICAgICAgICAgICAgICBmcSA9IGN1
cl9mcmVxOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIChFT1BOT1RTVVBQ
KTsKKworICAgICAgICBlcnJvciA9IHN5c2N0bF9sb29rdXAoU1lTQ1RMRk5fQ0FMTCgmbm9kZSkp
OworICAgICAgICBpZiAoZXJyb3IgfHwgbmV3cCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJl
dHVybiAoZXJyb3IpOworCisJLyogc3VwcG9ydCB3cml0aW5nIHRvIC4uLmZyZXF1ZW5jeS50YXJn
ZXQgKi8KKyAgICAgICAgaWYgKHJub2RlLT5zeXNjdGxfbnVtID09IHBvd2Vybm93X25vZGVfdGFy
Z2V0ICYmIGZxICE9IG9sZGZxKSB7CisJCisJCWlmIChwbm93azdfc2V0c3RhdGUoZnEpID09IDAp
CisJCXsKKwkJCWN1cl9mcmVxID0gZnE7CisJCX0gZWxzZQorCQkJYXByaW50X25vcm1hbCgiXG5J
bnZhbGlkIGZyZXF1ZW5jeVxuIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKDApOwor
fQorCitzdHJ1Y3Qgc3RhdGVfcyAqCitwbm93azdfZ2V0c3RhdGVzKGNwdWlkX3QgY3B1aWQpCit7
CisJdW5zaWduZWQgaW50IGksIGo7CisJY2hhciAqcHRyOworCQorCXN0cnVjdCBwc2JfcyAqcHNi
OworCXN0cnVjdCBwc3RfcyAqcHN0OworCisJLyoKKwkgKiBMb29rIGluIHRoZSAweGUwMDAwIC0g
MHgyMDAwMCBwaHlzaWNhbCBhZGRyZXNzCisJICogcmFuZ2UgZm9yIHRoZSBwc3QgdGFibGVzOyAx
NiBieXRlIGJsb2NrcworCSAqLwkKKworCXB0ciA9IChjaGFyICopSVNBX0hPTEVfVkFERFIoQklP
U19TVEFSVCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQklPU19MRU47IGkgKz0gMTYsIHB0ciArPSAx
NikgeworCQlpZiAobWVtY21wKHB0ciwgIkFNREs3UE5PVyEiLCAxMCkgPT0gMCkJCisJCXsKKwkJ
CXBzYiA9IChzdHJ1Y3QgcHNiX3MgKikgcHRyOworCQkJcHRyICs9IHNpemVvZihzdHJ1Y3QgcHNi
X3MpOwkJCQorCisJCQl0dGltZSA9IHBzYi0+dHRpbWU7CisJCQkKKwkJCS8qIE9ubHkgdGhpcyB2
ZXJzaW9uIGlzIHN1cHBvcnRlZCAqLworCQkJaWYgKHBzYi0+dmVyc2lvbiAhPSAweDEyKQorCQkJ
CXJldHVybiAwOworCisJCQkvKiBGaW5kIHRoZSByaWdodCBQU1QgKi8KKwkJCWZvciAoaiA9IDA7
IGogPCBwc2ItPm5fcHN0OyBqKyspIHsKKwkJCQlwc3QgPSAoc3RydWN0IHBzdF9zICopIHB0cjsK
KwkJCQlwdHIgKz0gc2l6ZW9mKHN0cnVjdCBwc3Rfcyk7CisJCQkJCisJCQkJLyogVXNlIHRoZSBm
aXJzdCBQU1Qgd2l0aCBtYXRjaGluZyBDUFVJRCAqLworCQkJCWlmIChjcHVpZCA9PSBwc3QtPmNw
dWlkKQorCQkJCXsKKwkJCQkJLyoKKwkJCQkJICogWFhYIEkgbmVlZCBtb3JlIGluZm8gb24gdGhp
cy4KKwkJCQkJICogRm9yIG5vdywgbGV0J3MganVzdCBpZ25vcmUgaXQKKwkJCQkJICovCisJCQkJ
CWlmICgoY3B1aWQgJiAweEZGKSA9PSAweDYwKQorCQkJCQkJcmV0dXJuIDA7CisKKwkJCQkJZnNi
ID0gcHN0LT5mc2I7CisJCQkJCW5fc3RhdGVzID0gcHN0LT5uX3N0YXRlczsKKwkJCQkJcmV0dXJu
IChzdHJ1Y3Qgc3RhdGVfcyAqKSBwdHI7CisJCQkJfSBlbHNlCisJCQkJCXB0ciArPSBzaXplb2Yo
c3RydWN0IHN0YXRlX3MpIFwKKyAJCQkJCQkqIHBzdC0+bl9zdGF0ZXM7CisJCQl9CisJCQkKKwkJ
CWFwcmludF9ub3JtYWwoIk5vIG1hdGNoIHdhcyBmb3VuZCBmb3IgeW91ciBDUFVJRFxuIik7CisJ
CQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWFwcmludF9ub3JtYWwoIlBvd2VyIHN0YXRlIHRhYmxl
IG5vdCBmb3VuZFxuIik7CisJcmV0dXJuIDA7Cit9CisKK2ludAorcG5vd2s3X3NldHN0YXRlKHVu
c2lnbmVkIGludCBmcmVxKQoreworCXVuc2lnbmVkIGludCBpOworCXVfaW50MzJfdCBzZ3RjLCB2
aWQsIGZpZDsKKwl1X2ludDY0X3QgY3RsOworCisJdmlkID0gZmlkID0gMDsJCisKKwlmb3IgKGkg
PSAwOyBpIDwgbl9zdGF0ZXM7IGkrKykgeworCQkvKiBEbyB3ZSBrbm93IGhvdyB0byBzZXQgdGhh
dCBmcmVxdWVuY3k/ICovCisJCWlmIChmcmVxX3RhYmxlW2ldLmZyZXF1ZW5jeSA9PSBmcmVxKQor
CQl7CisJCQlmaWQgPSBmcmVxX3RhYmxlW2ldLnN0YXRlLT5maWQ7CisJCQl2aWQgPSBmcmVxX3Rh
YmxlW2ldLnN0YXRlLT52aWQ7CisJCX0KKyAJfQorCQorCWlmIChmaWQgPT0gMCB8fCB2aWQgPT0g
MCkKKwkJcmV0dXJuIC0xOworCisJLyogR2V0IENUTCBhbmQgb25seSBtb2RpZnkgZmlkL3ZpZC9z
Z3RjICovCisJY3RsID0gcmRtc3IoTVNSX0s3X0NUTCk7CisJCisJLyogRklEICovCQorCWN0bCAm
PSAweEZGRkZGRkZGRkZGRkZGMDBVTEw7CisJY3RsIHw9IGZpZDsKKworCS8qIFZJRCAqLworCWN0
bCAmPSAweEZGRkZGRkZGRkZGRjAwRkZVTEw7CisJY3RsIHw9IHZpZCA8PCA4OworCisJLyogU0dU
QyAqLworCWlmICgoc2d0YyA9IHR0aW1lICogMTAwKSA8IDEwMDAwKSBzZ3RjID0gMTAwMDA7CisJ
Y3RsICY9IDB4RkZGMDAwMDBGRkZGRkZGRlVMTDsKKwljdGwgfD0gKHVfaW50NjRfdClzZ3RjIDw8
IDMyOyAKKworCWlmIChjdXJfZnJlcSA+IGZyZXEpIHsKKwkJd3Jtc3IoTVNSX0s3X0NUTCwgY3Rs
IHwgQ1RMX1NFVF9GSUQpOworCQl3cm1zcihNU1JfSzdfQ1RMLCBjdGwgfCBDVExfU0VUX1ZJRCk7
CisJfSBlbHNlIHsKKwkJd3Jtc3IoTVNSX0s3X0NUTCwgY3RsIHwgQ1RMX1NFVF9WSUQpOworCQl3
cm1zcihNU1JfSzdfQ1RMLCBjdGwgfCBDVExfU0VUX0ZJRCk7CisJfQorCQorCWN0bCA9IHJkbXNy
KE1TUl9LN19DVEwpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK3Bub3drN19pbml0KHN0cnVj
dCBjcHVfaW5mbyAqY2kpCit7CisJaW50IHJjOworCXVuc2lnbmVkIGludCBpLCBmcmVxX25hbWVz
X2xlbiwgbGVuID0gMDsKKwljaGFyICpmcmVxX25hbWVzOworCXN0cnVjdCBzeXNjdGxub2RlICpu
b2RlLCAqcG5vd25vZGUsICpmcmVxbm9kZTsKKwlzdHJ1Y3Qgc3RhdGVfcyAqcyA9IHBub3drN19n
ZXRzdGF0ZXMoY2ktPmNpX3NpZ25hdHVyZSk7CisKKwlpZiAocyA9PSAwKSB7CisJCWFwcmludF9u
b3JtYWwoIkFNRCBQT1dFUk5PVyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKwor
CWZyZXFfbmFtZXNfbGVuID0gIG5fc3RhdGVzICogKHNpemVvZigiOTk5OSAiKS0xKSArIDE7CisJ
ZnJlcV9uYW1lcyA9IG1hbGxvYyhmcmVxX25hbWVzX2xlbiwgTV9TWVNDVExEQVRBLCBNX1dBSVRP
Syk7CisJCisJZnJlcV90YWJsZSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGZyZXFfdGFibGVfcykg
KiBuX3N0YXRlcywgXAorCQlNX1RFTVAsIE1fV0FJVE9LKTsJCQorCisKKwlmb3IgKGkgPSAwOyBp
IDwgbl9zdGF0ZXM7IGkrKywgcysrKSB7CQkKKwkJZnJlcV90YWJsZVtpXS5mcmVxdWVuY3kgPSBj
cHVmcmVxKHMtPmZpZCk7CisJCWZyZXFfdGFibGVbaV0uc3RhdGUgPSBzOworCisgICAgICAgICAg
ICAgICAgbGVuICs9IHNucHJpbnRmKGZyZXFfbmFtZXMgKyBsZW4sIGZyZXFfbmFtZXNfbGVuIC0g
bGVuLCAiJWQlcyIsCisgICAgICAgICAgICAgICAgICAgIGZyZXFfdGFibGVbaV0uZnJlcXVlbmN5
LCBpIDwgbl9zdGF0ZXMgLSAxID8gIiAiIDogIiIpOworCX0KKworCS8qIE9uIGJvb3R1cCB0aGUg
ZnJlcXVlbmN5IHNob3VsZCBiZSBhdCBpdCdzIG1heCAqLworCWN1cl9mcmVxID0gZnJlcV90YWJs
ZVtpLTFdLmZyZXF1ZW5jeTsJCisKKwkvKiBDcmVhdGUgc3lzY3RsIG1hY2hkZXAucG93ZXJub3cu
ZnJlcXVlbmN5LiAqLworICAgICAgICBpZiAoKHJjID0gc3lzY3RsX2NyZWF0ZXYoTlVMTCwgMCwg
TlVMTCwgJm5vZGUsCisgICAgICAgICAgICBDVExGTEFHX1BFUk1BTkVOVCwgQ1RMVFlQRV9OT0RF
LCAibWFjaGRlcCIsIE5VTEwsCisgICAgICAgICAgICBOVUxMLCAwLCBOVUxMLCAwLCBDVExfTUFD
SERFUCwgQ1RMX0VPTCkpICE9IDApCisgICAgICAgICAgICAgICAgZ290byBlcnI7CisKKyAgICAg
ICAgaWYgKChyYyA9IHN5c2N0bF9jcmVhdGV2KE5VTEwsIDAsICZub2RlLCAmcG5vd25vZGUsCisg
ICAgICAgICAgICAwLCBDVExUWVBFX05PREUsICJwb3dlcm5vdyIsIE5VTEwsCisgICAgICAgICAg
ICBOVUxMLCAwLCBOVUxMLCAwLCBDVExfQ1JFQVRFLCBDVExfRU9MKSkgIT0gMCkKKyAgICAgICAg
ICAgICAgICBnb3RvIGVycjsKKworICAgICAgICAgaWYgKChyYyA9IHN5c2N0bF9jcmVhdGV2KE5V
TEwsIDAsICZwbm93bm9kZSwgJmZyZXFub2RlLAorICAgICAgICAgICAgMCwgQ1RMVFlQRV9OT0RF
LCAiZnJlcXVlbmN5IiwgTlVMTCwKKyAgICAgICAgICAgIE5VTEwsIDAsIE5VTEwsIDAsIENUTF9D
UkVBVEUsIENUTF9FT0wpKSAhPSAwKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyOworCisgICAg
ICAgIGlmICgocmMgPSBzeXNjdGxfY3JlYXRldihOVUxMLCAwLCAmZnJlcW5vZGUsICZub2RlLAor
ICAgICAgICAgICAgQ1RMRkxBR19SRUFEV1JJVEUsIENUTFRZUEVfSU5ULCAidGFyZ2V0IiwgTlVM
TCwKKyAgICAgICAgICAgIHBvd2Vybm93X3N5c2N0bF9oZWxwZXIsIDAsIE5VTEwsIDAsIENUTF9D
UkVBVEUsIENUTF9FT0wpKSAhPSAwKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAg
ICBwb3dlcm5vd19ub2RlX3RhcmdldCA9IG5vZGUtPnN5c2N0bF9udW07CisKKyAgICAgICAgaWYg
KChyYyA9IHN5c2N0bF9jcmVhdGV2KE5VTEwsIDAsICZmcmVxbm9kZSwgJm5vZGUsCisgICAgICAg
ICAgICAwLCBDVExUWVBFX0lOVCwgImN1cnJlbnQiLCBOVUxMLAorICAgICAgICAgICAgcG93ZXJu
b3dfc3lzY3RsX2hlbHBlciwgMCwgTlVMTCwgMCwgQ1RMX0NSRUFURSwgQ1RMX0VPTCkpICE9IDAp
CisgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIHBvd2Vybm93X25vZGVfY3VycmVu
dCA9IG5vZGUtPnN5c2N0bF9udW07CisKKyAgICAgICAgaWYgKChyYyA9IHN5c2N0bF9jcmVhdGV2
KE5VTEwsIDAsICZmcmVxbm9kZSwgJm5vZGUsCisgICAgICAgICAgICAwLCBDVExUWVBFX1NUUklO
RywgImF2YWlsYWJsZSIsIE5VTEwsCisgICAgICAgICAgICBOVUxMLCAwLCBmcmVxX25hbWVzLCBm
cmVxX25hbWVzX2xlbiwgQ1RMX0NSRUFURSwgQ1RMX0VPTCkpICE9IDApCisgICAgICAgICAgICAg
ICAgZ290byBlcnI7CisKKwlhcHJpbnRfbm9ybWFsKCJBTUQgUE9XRVJOT1cgc3VwcG9ydGVkIGN1
cnJlbnQgZnJlcXVlbmN5IDogJWQgTWh6XG4iLCBcCisJCWN1cl9mcmVxKTsKKwlhcHJpbnRfbm9y
bWFsKCJBdmFpbGFibGUgZnJlcXVlbmNpZXMgKE1oeikgOiAlc1xuIiwgZnJlcV9uYW1lcyk7IAor
CXJldHVybjsJCisgIGVycjoKKwlhcHJpbnRfbm9ybWFsKCIlczogc3lzY3RsX2NyZWF0ZXYgZmFp
bGVkIChyYyA9ICVkKVxuIiwgX19mdW5jX18sIHJjKTsKK30KKwo=
------=_Part_57_28260080.1089506277228--