Subject: Driver for hardware sensors in G4 iBooks and probably other Macs
To: netbsd-macppc <port-macppc@NetBSD.ORG>
From: Michael <macallan18@earthlink.net>
List: port-macppc
Date: 12/13/2004 16:38:40
This is a multi-part message in MIME format.

--Multipart=_Mon__13_Dec_2004_16_38_40_-0500_5GirXTY65BazO16v
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit

Hello,

after a challenge by Nathan ( well, sort of ) I had a look at the hardware sensors in my iBook G4/800. Sure enough there's /uni-n/i2c/fan with properties that suggest three thermal sensors, one fan and a voltage sensor. Since there's no driver for uni-n I made one ( which doesn't do much besides attaching to mainbus and attach children according to OF ), got ki2c to attach there. Then I looked for a datasheet of the monitor chip ( an Analog Devices ADT7467 ) and wrote a driver which reads data from the chip and feeds them into envsys, labels for and information about the sensors comes from OF ( the chip supports four fans but the iBook has only one for instance ). This was a bit more work than I thought because the ki2c driver lacked any kind of abstraction ( now iic attaches and most iic drivers should just work ).
The driver attaches if it finds /uni-n/i2c/fan with a 'compatibile' property set to 'adt7467', it should support any possible configuration of the chip but so far I could only test it on my iBook.

The result looks like this:
cpu0 at mainbus0: 7455 (Revision 3.3), ID 0 (primary)
cpu0: HID0 8450c0bc<EMCP,TBEN,NAP,DPM,ICE,DCE,SGE,BTIC,LRSTK,FOLD,BHT>
cpu0: 614.39 MHz, 256KB L2 cache
uni_n0 at mainbus0 offset f8000000
uni_n0: node ff95b408
hw-clock at uni_n0 not configured
ki2c0 at uni_n0 offset 0xf8001000
iic0 at ki2c0: I2C bus
adt7467c0 at ki2c0 offset 0x15c
adt7467c0: node ff95d178
adt7467c0: found 5 sensors
 1: temperature PWR/MEMORY BOTTOMSIDE
 2: temperature CPU BOTTOMSIDE
 3: temperature GPU ON DIE
 4: voltage CPU CORE
 5: fanspeed REAR MAIN ENCLOSURE
i2c-hwclock at ki2c0 offset 0x1d2 not configured
cereal at ki2c0 offset 0x1c0 not configured
...
ki2c1 at obio0
iic1 at ki2c1: I2C bus
cereal at ki2c1 offset 0x1c0 not configured
deq at ki2c1 offset 0x6a not configured
i2c-modem at ki2c1 not configured

~# envstat -r
PWR/MEMORY BOTTOMSIDE:     52.000 degC
       CPU BOTTOMSIDE:     68.000 degC
           GPU ON DIE:     57.000 degC
             CPU CORE:      1.576 V
  REAR MAIN ENCLOSURE:       6775 RPM

To make it work you need to put adt7467.c and uni-n.c into macppc/dev and apply the attached patch which does the necessary changes to macppc/dev/ki2c.c and macppc/conf/files.macppc.
Then you need to add something like this to your kernel config:

uni_n*	at mainbus?
ki2c*	at uni_n?			# Keywest I2C
iic*	at ki2c?			
adt7467c*	at ki2c? 		# Analog Devices ADT7467 thermal monitor, fan controller and so on

iic* isn't really necessary, I only added it to see if it attaches, adt7467c needs to attach to ki2c so it can use OF for information about the sensors.

I've tested the whole thing with envstat (see above) and gkrellm, both work just fine.

have fun
Michael

PS: the drivers are for -current, no idea if they work for any earlier version so YMMV.

--Multipart=_Mon__13_Dec_2004_16_38_40_-0500_5GirXTY65BazO16v
Content-Type: application/octet-stream;
 name="adt7467.c"
Content-Disposition: attachment;
 filename="adt7467.c"
Content-Transfer-Encoding: base64

LyoJJE5ldEJTRDogZmFuLmMsdiAxLjIwIDIwMDQvMTIvMDkgMDM6MTk6NTYgYnJpZ2dzIEV4cCAk
CSovCgovKi0KICogQ29weXJpZ2h0IChDKSAxOTk4CUludGVybmV0IFJlc2VhcmNoIEluc3RpdHV0
ZSwgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCiAqIGFyZSBtZXQ6CiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQogKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0
ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKICogICAg
bXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgogKglUaGlzIHByb2R1
Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5CiAqCUludGVybmV0IFJlc2VhcmNoIElu
c3RpdHV0ZSwgSW5jLgogKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNl
ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKICogICAgZGVyaXZlZCBmcm9tIHRoaXMg
c29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFO
WSBFWFBSRVNTIE9SCiAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKICogT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KICogSU4g
Tk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULAogKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQKICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAogKiBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkKICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAogKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICovCgovKiBh
IGRyaXZlciBmb3QgdGhlIEFEVDc0NjcgZW52aXJvbm1lbnRhbCBjb250cm9sbGVyIGZvdW5kIGlu
IHRoZSBpQm9vayBHNCAKICAgYW5kIHByb2JhYmx5IG90aGVyIEFwcGxlIG1hY2hpbmVzICovCgov
KiB0b2RvOiBnZXQgdGhlIHBhcmVudGFsIGludGVyZmFjZSByaWdodCwgdGhpcyBpcyBhbiB1Z2x5
IGhhY2suIFRoZSBkcml2ZXIKICAgc2hvdWxkIHdvcmsgd2l0aCBBTlkgaTJjIGJ1cyBhcyBwYXJl
bnQgKi8KI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgpfX0tFUk5FTF9SQ1NJRCgwLCAiJE5ldEJTRDog
ZmFuLmMsdiAxLjIwIDIwMDQvMTIvMDkgMDM6MTk6NTYgYnJpZ2dzIEV4cCAkIik7CgojaW5jbHVk
ZSA8c3lzL3BhcmFtLmg+CiNpbmNsdWRlIDxzeXMvc3lzdG0uaD4KI2luY2x1ZGUgPHN5cy9rZXJu
ZWwuaD4KI2luY2x1ZGUgPHN5cy9kZXZpY2UuaD4KI2luY2x1ZGUgPHN5cy9tYWxsb2MuaD4KCiNp
bmNsdWRlIDx1dm0vdXZtX2V4dGVybi5oPgoKI2luY2x1ZGUgPGRldi9vZncvb3BlbmZpcm0uaD4K
I2luY2x1ZGUgPGRldi9pMmMvaTJjdmFyLmg+CgojaW5jbHVkZSA8bWFjaGluZS9hdXRvY29uZi5o
PgojaW5jbHVkZSA8ZGV2L3N5c21vbi9zeXNtb252YXIuaD4KI2luY2x1ZGUgInN5c21vbl9lbnZz
eXMuaCIKCgpzdGF0aWMgdm9pZCBhZHQ3NDY3Y19hdHRhY2ggX19QKChzdHJ1Y3QgZGV2aWNlICos
IHN0cnVjdCBkZXZpY2UgKiwgdm9pZCAqKSk7CnN0YXRpYyBpbnQgYWR0NzQ2N2NfbWF0Y2ggX19Q
KChzdHJ1Y3QgZGV2aWNlICosIHN0cnVjdCBjZmRhdGEgKiwgdm9pZCAqKSk7CgpzdHJ1Y3QgYWR0
NzQ2N2Nfc29mdGMgewoJc3RydWN0IGRldmljZSBzY19kZXY7CglzdHJ1Y3QgZGV2aWNlICpwYXJl
bnQ7CglpbnQgc2Nfbm9kZSwgYWRkcmVzczsKCWludCBudW1fc2Vuc29yczsKCXN0cnVjdCBzeXNt
b25fZW52c3lzICpzY19zeXNtb25fY29va2llOwoJc3RydWN0IGkyY19jb250cm9sbGVyICpzY19p
MmM7Cgl1aW50OF90IHJlZ3NbMzJdOwp9OwoKc3RydWN0IGFkdDc0NjdjX3N5c21vbiB7CgkJc3Ry
dWN0IHN5c21vbl9lbnZzeXMgc21lOwoJCXN0cnVjdCBhZHQ3NDY3Y19zb2Z0YyAqc2M7CgkJc3Ry
dWN0IGVudnN5c190cmVfZGF0YSBhZHQ3NDY3Y19pbmZvW107Cgl9OwoKc3RhdGljIHVpbnQ4X3Qg
YWR0NzQ2N2NfcmVhZHJlZyhzdHJ1Y3QgYWR0NzQ2N2Nfc29mdGMgKiwgdWludDhfdCk7CnN0YXRp
YyB2b2lkIGFkdDc0NjdjX3dyaXRlcmVnKHN0cnVjdCBhZHQ3NDY3Y19zb2Z0YyAqLCB1aW50OF90
LCB1aW50OF90KTsKc3RhdGljIHZvaWQgYWR0NzQ2N2Nfc2V0dXAoc3RydWN0IGFkdDc0NjdjX3Nv
ZnRjICopOwppbnQgc2Vuc29yX3R5cGUoY2hhciAqKTsKaW50IHRlbXAybXVrKHVpbnQ4X3QpOwpp
bnQgcmVnMnJwbSh1aW50MTZfdCk7CmludCBhZHQ3NDY3Y19ndHJlZGF0YShzdHJ1Y3Qgc3lzbW9u
X2VudnN5cyAqLCBzdHJ1Y3QgZW52c3lzX3RyZV9kYXRhICopOwppbnQgYWR0NzQ2N2Nfc3RyZWlu
Zm8oc3RydWN0IHN5c21vbl9lbnZzeXMgKiwgc3RydWN0IGVudnN5c19iYXNpY19pbmZvICopOwoK
Q0ZBVFRBQ0hfREVDTChhZHQ3NDY3Yywgc2l6ZW9mKHN0cnVjdCBhZHQ3NDY3Y19zb2Z0YyksCiAg
ICBhZHQ3NDY3Y19tYXRjaCwgYWR0NzQ2N2NfYXR0YWNoLCBOVUxMLCBOVUxMKTsKCmludAphZHQ3
NDY3Y19tYXRjaChwYXJlbnQsIGNmLCBhdXgpCglzdHJ1Y3QgZGV2aWNlICpwYXJlbnQ7CglzdHJ1
Y3QgY2ZkYXRhICpjZjsKCXZvaWQgKmF1eDsKewoJc3RydWN0IGNvbmZhcmdzICpjYSA9IGF1eDsK
CWNoYXIgY29tcGF0WzMyXTsKCWlmIChzdHJjbXAoY2EtPmNhX25hbWUsICJmYW4iKSAhPSAwKQoJ
CXJldHVybiAwOwoKCW1lbXNldChjb21wYXQsIDAsIHNpemVvZihjb21wYXQpKTsKCU9GX2dldHBy
b3AoY2EtPmNhX25vZGUsICJjb21wYXRpYmxlIiwgY29tcGF0LCBzaXplb2YoY29tcGF0KSk7Cglp
ZiAoc3RyY21wKGNvbXBhdCwgImFkdDc0NjciKSAhPSAwKQoJCXJldHVybiAwOwoJCglyZXR1cm4g
MTsKfQoKdm9pZAphZHQ3NDY3Y19hdHRhY2gocGFyZW50LCBzZWxmLCBhdXgpCglzdHJ1Y3QgZGV2
aWNlICpwYXJlbnQsICpzZWxmOwoJdm9pZCAqYXV4Owp7CglzdHJ1Y3QgYWR0NzQ2N2Nfc29mdGMg
KnNjID0gKHN0cnVjdCBhZHQ3NDY3Y19zb2Z0YyAqKXNlbGY7CglzdHJ1Y3QgY29uZmFyZ3MgKmNh
ID0gYXV4OwoJaW50IG5vZGU7CgoJbm9kZSA9IGNhLT5jYV9ub2RlOwoJc2MtPnNjX25vZGUgPSBu
b2RlOwoJc2MtPnBhcmVudD1wYXJlbnQ7CglzYy0+YWRkcmVzcz1jYS0+Y2FfcmVnWzBdJjB4ZmU7
CglzYy0+c2NfaTJjPShzdHJ1Y3QgaTJjX2NvbnRyb2xsZXIgKiljYS0+Y2FfYmFzZWFkZHI7Cglw
cmludGYoIlxuJXM6IG5vZGUgJTA4eFxuIixzYy0+c2NfZGV2LmR2X3huYW1lLG5vZGUpOwoJYWR0
NzQ2N2Nfc2V0dXAoc2MpOwoJLy9wcmludGYoIiUwMnhcbiIsYWR0NzQ2N2NfcmVhZHJlZyhzYyww
eDIxKSk7Cn0KCnVpbnQ4X3QgYWR0NzQ2N2NfcmVhZHJlZyhzdHJ1Y3QgYWR0NzQ2N2Nfc29mdGMg
KnNjLCB1aW50OF90IHJlZykKewoJdWludDhfdCBkYXRhPTA7OwoJaWljX2FjcXVpcmVfYnVzKHNj
LT5zY19pMmMsMCk7CglpaWNfZXhlYyhzYy0+c2NfaTJjLCBJMkNfT1BfUkVBRCxzYy0+YWRkcmVz
cywmcmVnLDEsJmRhdGEsMSwwKTsKCWlpY19yZWxlYXNlX2J1cyhzYy0+c2NfaTJjLDApOwoJcmV0
dXJuIGRhdGE7Cn0KCnZvaWQgYWR0NzQ2N2Nfd3JpdGVyZWcoc3RydWN0IGFkdDc0NjdjX3NvZnRj
ICpzYywgdWludDhfdCByZWcsIHVpbnQ4X3QgZGF0YSkKewoJdWludDhfdCBtZGF0YVsyXT17cmVn
LGRhdGF9OwoJaWljX2FjcXVpcmVfYnVzKHNjLT5zY19pMmMsMCk7CglpaWNfZXhlYyhzYy0+c2Nf
aTJjLCBJMkNfT1BfV1JJVEUsc2MtPmFkZHJlc3MsJm1kYXRhLDIsTlVMTCwwLDApOwoJaWljX3Jl
bGVhc2VfYnVzKHNjLT5zY19pMmMsMCk7Cn0KCiNpZiBOU1lTTU9OX0VOVlNZUyA+IDAKCnN0cnVj
dCBlbnZzeXNfcmFuZ2UgKmFkdDc0NjdjX3JhbmdlczsKc3RydWN0IGVudnN5c19iYXNpY19pbmZv
ICphZHQ3NDY3Y19pbmZvOwoKaW50IHNlbnNvcl90eXBlKGNoYXIgKnQpCnsKCWlmKHN0cmNtcCh0
LCJ0ZW1wZXJhdHVyZSIpPT0wKQoJCXJldHVybiBFTlZTWVNfU1RFTVA7CglpZihzdHJjbXAodCwi
dm9sdGFnZSIpPT0wKQoJCXJldHVybiBFTlZTWVNfU1ZPTFRTX0RDOwoJaWYoc3RyY21wKHQsImZh
bnNwZWVkIik9PTApCgkJcmV0dXJuIEVOVlNZU19TRkFOUlBNOwoJcmV0dXJuIC0xOwp9CgppbnQg
dGVtcDJtdWsodWludDhfdCB0KQp7CglpbnQgdGVtcD0oaW50OF90KXQ7CglyZXR1cm4gdGVtcCox
MDAwMDAwKzI3MzE1MDAwMFU7Cn0KCmludCByZWcycnBtKHVpbnQxNl90IHIpCnsKCWlmKHI9PTB4
ZmZmZikKCQlyZXR1cm4gMDsKCXJldHVybiAoOTAwMDAqNjApLyhpbnQpcjsKfQoKdm9pZAphZHQ3
NDY3Y19zZXR1cChzdHJ1Y3QgYWR0NzQ2N2Nfc29mdGMgKnNjKQp7CglzdHJ1Y3QgYWR0NzQ2N2Nf
c3lzbW9uICpkYXRhcDsKCWludCBlcnJvciwgbnVtLCBjbnQsIHRjbnQsd2NudCwgY190bXAsIGNf
cnBtOwoJY2hhciB0eXBlc1sxMDI0XSwgd2hlcmVbMTAyNF07Cgl1aW50OF90IHRlbXBbXT17MHgy
NiwweDI3LDB4MjV9LCBzdHVmZjsKCXN0cnVjdCBlbnZzeXNfcmFuZ2UgKmN1cl9yOwoJc3RydWN0
IGVudnN5c19iYXNpY19pbmZvICpjdXJfaTsKCXN0cnVjdCBlbnZzeXNfdHJlX2RhdGEgKmN1cl90
OwoJaW50IHNlbnNvcl9pZFszMl0sIGk7CgljaGFyIHR5cGVbMzJdOwoJCgkvKiBsb29rIGZvciBz
ZW5zb3JzICovCgljbnQ9T0ZfZ2V0cHJvcChzYy0+c2Nfbm9kZSwiaHdzZW5zb3ItaWQiLHNlbnNv
cl9pZCxzaXplb2Yoc2Vuc29yX2lkKSk7CgludW09Y250Pj4yOwoJc2MtPm51bV9zZW5zb3JzPW51
bTsKCWRhdGFwID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3lzbW9uX2VudnN5cykrbnVtKnNpemVv
ZihzdHJ1Y3QgZW52c3lzX3RyZV9kYXRhKStzaXplb2Yodm9pZCAqKSwgTV9ERVZCVUYsIE1fV0FJ
VE9LIHwgTV9aRVJPKTsKCWFkdDc0NjdjX3JhbmdlcyA9IG1hbGxvYyAoc2l6ZW9mKHN0cnVjdCBl
bnZzeXNfcmFuZ2UpKm51bSwgTV9ERVZCVUYsIE1fV0FJVE9LIHwgTV9aRVJPKTsKCWFkdDc0Njdj
X2luZm8gPSBtYWxsb2MgKHNpemVvZihzdHJ1Y3QgZW52c3lzX2Jhc2ljX2luZm8pKm51bSwgTV9E
RVZCVUYsIE1fV0FJVE9LIHwgTV9aRVJPKTsKCQoJcHJpbnRmKCIlczogZm91bmQgJWQgc2Vuc29y
c1xuIixzYy0+c2NfZGV2LmR2X3huYW1lLG51bSk7CgljbnQ9T0ZfZ2V0cHJvcChzYy0+c2Nfbm9k
ZSwiaHdzZW5zb3ItdHlwZSIsdHlwZXMsMTAyNCk7CgljbnQ9T0ZfZ2V0cHJvcChzYy0+c2Nfbm9k
ZSwiaHdzZW5zb3ItbG9jYXRpb24iLHdoZXJlLDEwMjQpOwoJdGNudD13Y250PTA7CgljX3RtcD0w
OwoJY19ycG09MHgyODsKCWZvciAoaT0wO2k8bnVtO2krKykKCXsKCQljdXJfcj0mYWR0NzQ2N2Nf
cmFuZ2VzW2ldOwoJCWN1cl9pPSZhZHQ3NDY3Y19pbmZvW2ldOwoJCWN1cl90PSZkYXRhcC0+YWR0
NzQ2N2NfaW5mb1tpXTsKCQlzdHJuY3B5KGN1cl9pLT5kZXNjLCZ3aGVyZVt3Y250XSwzMik7CgkJ
d2NudCs9c3RybGVuKGN1cl9pLT5kZXNjKSsxOwoJCXN0cm5jcHkodHlwZSwmdHlwZXNbdGNudF0s
MzIpOwoJCXRjbnQrPXN0cmxlbih0eXBlKSsxOwoJCWN1cl9pLT51bml0cz1zZW5zb3JfdHlwZSh0
eXBlKTsKCQljdXJfaS0+c2Vuc29yPWk7CgkJcHJpbnRmKCIlMmQ6ICVzICVzXG4iLGkrMSwgdHlw
ZSwgY3VyX2ktPmRlc2MpOwoJCXN3aXRjaChjdXJfaS0+dW5pdHMpCgkJewoJCQljYXNlIEVOVlNZ
U19TVEVNUDoKCQkJCXsKCQkJCQlzYy0+cmVnc1tpXT10ZW1wW2NfdG1wXTsKCQkJCQljdXJfci0+
bG93PXRlbXAybXVrKC0xMjcpOwoJCQkJCWN1cl9yLT5oaWdoPXRlbXAybXVrKDEyNyk7CgkJCQkJ
Y3VyX3ItPnVuaXRzPUVOVlNZU19TVEVNUDsKCQkJCQljX3RtcCsrOwoJCQkJfQoJCQkJYnJlYWs7
CgkJCWNhc2UgRU5WU1lTX1NWT0xUU19EQzoKCQkJCXsKCQkJCQlzYy0+cmVnc1tpXT0weDIxOwkv
KiB0aGVyZSdzIG9ubHkgb25lIHZvbHRhZ2Ugc2Vuc29yICovCgkJCQkJY3VyX3ItPmxvdz0wOwoJ
CQkJCWN1cl9yLT5oaWdoPTIyNTA7CS8qIDIuMjV2ICovCgkJCQkJY3VyX3ItPnVuaXRzPUVOVlNZ
U19TVk9MVFNfREM7CgkJCQkJY3VyX2ktPnJmYWN0PTE7CgkJCQl9CgkJCQlicmVhazsKCQkJY2Fz
ZSBFTlZTWVNfU0ZBTlJQTToKCQkJCXsKCQkJCQlzYy0+cmVnc1tpXT1jX3JwbTsKCQkJCQljdXJf
ci0+bG93PTA7CgkJCQkJY3VyX3ItPmhpZ2g9cmVnMnJwbSgweGZmZmUpOwoJCQkJCWN1cl9yLT51
bml0cz1FTlZTWVNfU0ZBTlJQTTsKCQkJCQljX3JwbSs9MjsJLyogZmFuIG91dHB1dCBpcyAxNmJp
dCAqLwoJCQkJfQoJCQkJYnJlYWs7CgkJfQoJCWN1cl9pLT52YWxpZGZsYWdzPUVOVlNZU19GVkFM
SUR8RU5WU1lTX0ZDVVJWQUxJRDsKCQljdXJfdC0+c2Vuc29yID0gaTsKCQljdXJfdC0+d2FybmZs
YWdzID0gRU5WU1lTX1dBUk5fT0s7CgkJY3VyX3QtPnZhbGlkZmxhZ3MgPSBFTlZTWVNfRlZBTElE
fEVOVlNZU19GQ1VSVkFMSUQ7CgkJY3VyX3QtPnVuaXRzPWN1cl9pLT51bml0czsKCX0KCXN0dWZm
PWFkdDc0NjdjX3JlYWRyZWcoc2MsMHg0MCk7CglhZHQ3NDY3Y193cml0ZXJlZyhzYywweDQwLHN0
dWZmKTsKCglzYy0+c2Nfc3lzbW9uX2Nvb2tpZSA9ICZkYXRhcC0+c21lOwoJZGF0YXAtPnNtZS5z
bWVfbnNlbnNvcnMgPSBudW07CglkYXRhcC0+c21lLnNtZV9lbnZzeXNfdmVyc2lvbiA9IDEwMDA7
CglkYXRhcC0+c21lLnNtZV9yYW5nZXMgPSBhZHQ3NDY3Y19yYW5nZXM7CglkYXRhcC0+c21lLnNt
ZV9zZW5zb3JfaW5mbyA9IGFkdDc0NjdjX2luZm87CglkYXRhcC0+c21lLnNtZV9zZW5zb3JfZGF0
YSA9IGRhdGFwLT5hZHQ3NDY3Y19pbmZvOwoJCglkYXRhcC0+c21lLnNtZV9jb29raWUgPSBzYzsK
CWRhdGFwLT5zbWUuc21lX2d0cmVkYXRhID0gYWR0NzQ2N2NfZ3RyZWRhdGE7CglkYXRhcC0+c21l
LnNtZV9zdHJlaW5mbyA9IGFkdDc0NjdjX3N0cmVpbmZvOwoJZGF0YXAtPnNtZS5zbWVfZmxhZ3Mg
PSAwOwoKCWlmICgoZXJyb3IgPSBzeXNtb25fZW52c3lzX3JlZ2lzdGVyKCZkYXRhcC0+c21lKSkg
IT0gMCkKCQlhcHJpbnRfZXJyb3IoIiVzOiB1bmFibGUgdG8gcmVnaXN0ZXIgd2l0aCBzeXNtb24g
KCVkKVxuIiwKCQkgICAgc2MtPnNjX2Rldi5kdl94bmFtZSwgZXJyb3IpOwp9CgoKaW50CmFkdDc0
NjdjX2d0cmVkYXRhKHN0cnVjdCBzeXNtb25fZW52c3lzICpzbWUsIHN0cnVjdCBlbnZzeXNfdHJl
X2RhdGEgKnRyZWQpCnsKLy8Jc3RydWN0IGFkdDc0NjdjX3N5c21vbiAqc209KHN0cnVjdCBhZHQ3
NDY3Y19zeXNtb24gKilzbWU7CglzdHJ1Y3QgYWR0NzQ2N2Nfc29mdGMgKnNjPXNtZS0+c21lX2Nv
b2tpZTsKCXN0cnVjdCBlbnZzeXNfdHJlX2RhdGEgKmN1cl90cmU7CglzdHJ1Y3QgZW52c3lzX2Jh
c2ljX2luZm8gKmN1cl9pOwoJdWludDhfdCByZWc7CglpbnQgaTsKCQovKglmb3IoaT0wO2k8c21l
LT5zbWVfbnNlbnNvcnM7aSsrKSB7Ki8KCWk9dHJlZC0+c2Vuc29yOwoJCWN1cl90cmU9JnNtZS0+
c21lX3NlbnNvcl9kYXRhW2ldOwoJCS8vY3VyX3RyZT10cmVkOwoJCWN1cl9pPSZzbWUtPnNtZV9z
ZW5zb3JfaW5mb1tpXTsKCQlyZWc9c2MtPnJlZ3NbaV07CgkJc3dpdGNoKGN1cl90cmUtPnVuaXRz
KQoJCXsKCQkJY2FzZSBFTlZTWVNfU1RFTVA6CgkJCQljdXJfdHJlLT5jdXIuZGF0YV9zPXRlbXAy
bXVrKGFkdDc0NjdjX3JlYWRyZWcoc2MscmVnKSk7CgkJCQlicmVhazsKCQkJY2FzZSBFTlZTWVNf
U1ZPTFRTX0RDOgoJCQkJewoJCQkJCXVpbnQzMl90IHZyPWFkdDc0NjdjX3JlYWRyZWcoc2MscmVn
KTsKCQkJCQljdXJfdHJlLT5jdXIuZGF0YV91cz0oaW50KSgodnIqMjUwMDAwMCkvMHhjMCk7CgkJ
CQkJLy9wcmludGYoIiVkICVkXG4iLHZyLGN1cl90cmUtPmN1ci5kYXRhX3VzKTsKCQkJCX0KCQkJ
CWJyZWFrOwoJCQljYXNlIEVOVlNZU19TRkFOUlBNOgoJCQkJewoJCQkJCXVpbnQxNl90IGJsYWg9
KCgodWludDE2X3QpYWR0NzQ2N2NfcmVhZHJlZyhzYyxyZWcpKXwoKHVpbnQxNl90KWFkdDc0Njdj
X3JlYWRyZWcoc2MscmVnKzEpPDw4KSk7CgkJCQkJY3VyX3RyZS0+Y3VyLmRhdGFfdXM9cmVnMnJw
bShibGFoKTsKCQkJCX0KCQkJCWJyZWFrOwoJCX0KCQljdXJfdHJlLT52YWxpZGZsYWdzfD1FTlZT
WVNfRkNVUlZBTElEfEVOVlNZU19GVkFMSUQ7CgkvL30KCS8vc21lLT5zbWVfc2Vuc29yX2RhdGEt
PmN1ci5kYXRhX3VzID0gKHRocmVzaG9sZCAqIDEwMDAwMDApICsgMjczMTUwMDAwOwoJKnRyZWQg
PSBzbWUtPnNtZV9zZW5zb3JfZGF0YVtpXTsKCXJldHVybiAwOwp9CgppbnQKYWR0NzQ2N2Nfc3Ry
ZWluZm8oc3RydWN0IHN5c21vbl9lbnZzeXMgKnNtZSwgc3RydWN0IGVudnN5c19iYXNpY19pbmZv
ICpiaW5mbykKewoKCS8qIFRoZXJlIGlzIG5vdGhpbmcgdG8gc2V0IGhlcmUuICovCglyZXR1cm4g
KEVJTlZBTCk7Cn0KI2VuZGlmIC8qIE5TWVNNT05fRU5WU1lTID4gMCAqLwo=

--Multipart=_Mon__13_Dec_2004_16_38_40_-0500_5GirXTY65BazO16v
Content-Type: application/octet-stream;
 name="uni-n.c"
Content-Disposition: attachment;
 filename="uni-n.c"
Content-Transfer-Encoding: base64

LyoJJE5ldEJTRDogdW5pXy0uYyx2IDEuMjAgMjAwNC8xMi8wOSAwMzoxOTo1NiBicmlnZ3MgRXhw
ICQJKi8KCi8qLQogKiBDb3B5cmlnaHQgKEMpIDE5OTgJSW50ZXJuZXQgUmVzZWFyY2ggSW5zdGl0
dXRlLCBJbmMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKICogYXJlIG1ldDoKICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAog
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqIDMuIEFsbCBhZHZlcnRpc2luZyBt
YXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQogKiAg
ICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CiAqCVRoaXMgcHJv
ZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKICoJSW50ZXJuZXQgUmVzZWFyY2gg
SW5zdGl0dXRlLCBJbmMuCiAqIDQuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1
c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwogKiAgICBkZXJpdmVkIGZyb20gdGhp
cyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICoK
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQg
QU5ZIEVYUFJFU1MgT1IKICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwogKiBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgogKiBJ
TiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsCiAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAogKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCiAqIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWQogKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQogKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKi8KCiNp
bmNsdWRlIDxzeXMvY2RlZnMuaD4KX19LRVJORUxfUkNTSUQoMCwgIiROZXRCU0Q6IHVuaS1uLmMs
diAxLjIwIDIwMDQvMTIvMDkgMDM6MTk6NTYgYnJpZ2dzIEV4cCAkIik7CgojaW5jbHVkZSA8c3lz
L3BhcmFtLmg+CiNpbmNsdWRlIDxzeXMvc3lzdG0uaD4KI2luY2x1ZGUgPHN5cy9rZXJuZWwuaD4K
I2luY2x1ZGUgPHN5cy9kZXZpY2UuaD4KCiNpbmNsdWRlIDxkZXYvb2Z3L29wZW5maXJtLmg+Cgoj
aW5jbHVkZSA8bWFjaGluZS9hdXRvY29uZi5oPgoKc3RhdGljIHZvaWQgdW5pX25fYXR0YWNoIF9f
UCgoc3RydWN0IGRldmljZSAqLCBzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKikpOwpzdGF0aWMgaW50
IHVuaV9uX21hdGNoIF9fUCgoc3RydWN0IGRldmljZSAqLCBzdHJ1Y3QgY2ZkYXRhICosIHZvaWQg
KikpOwpzdGF0aWMgaW50IHVuaV9uX3ByaW50IF9fUCgodm9pZCAqLCBjb25zdCBjaGFyICopKTsK
CnN0cnVjdCB1bmlfbl9zb2Z0YyB7CglzdHJ1Y3QgZGV2aWNlIHNjX2RldjsKCWludCBzY19ub2Rl
Owp9OwoKCkNGQVRUQUNIX0RFQ0wodW5pX24sIHNpemVvZihzdHJ1Y3QgdW5pX25fc29mdGMpLAog
ICAgdW5pX25fbWF0Y2gsIHVuaV9uX2F0dGFjaCwgTlVMTCwgTlVMTCk7CgppbnQKdW5pX25fbWF0
Y2gocGFyZW50LCBjZiwgYXV4KQoJc3RydWN0IGRldmljZSAqcGFyZW50OwoJc3RydWN0IGNmZGF0
YSAqY2Y7Cgl2b2lkICphdXg7CnsKCXN0cnVjdCBjb25mYXJncyAqY2EgPSBhdXg7CgljaGFyIGNv
bXBhdFszMl07CglpZiAoc3RyY21wKGNhLT5jYV9uYW1lLCAidW5pLW4iKSAhPSAwKQoJCXJldHVy
biAwOwoKCW1lbXNldChjb21wYXQsIDAsIHNpemVvZihjb21wYXQpKTsKCU9GX2dldHByb3AoY2Et
PmNhX25vZGUsICJjb21wYXRpYmxlIiwgY29tcGF0LCBzaXplb2YoY29tcGF0KSk7CglpZiAoc3Ry
Y21wKGNvbXBhdCwgInVuaS1ub3J0aCIpICE9IDApCgkJcmV0dXJuIDA7CgoJcmV0dXJuIDE7Cn0K
Ci8qCiAqIEF0dGFjaCBhbGwgdGhlIHN1Yi1kZXZpY2VzIHdlIGNhbiBmaW5kCiAqLwp2b2lkCnVu
aV9uX2F0dGFjaChwYXJlbnQsIHNlbGYsIGF1eCkKCXN0cnVjdCBkZXZpY2UgKnBhcmVudCwgKnNl
bGY7Cgl2b2lkICphdXg7CnsKCXN0cnVjdCB1bmlfbl9zb2Z0YyAqc2MgPSAoc3RydWN0IHVuaV9u
X3NvZnRjICopc2VsZjsKCXN0cnVjdCBjb25mYXJncyAqb3VyX2NhID0gYXV4OwoJc3RydWN0IGNv
bmZhcmdzIGNhOwoJaW50IG5vZGUsIGNoaWxkLCBuYW1lbGVuOwoJdV9pbnQgcmVnWzIwXTsKCWlu
dCBpbnRyWzZdOwoJY2hhciBuYW1lWzMyXTsKCglub2RlID0gT0ZfZmluZGRldmljZSgiL3VuaS1u
Iik7CglzYy0+c2Nfbm9kZSA9IG5vZGU7CglwcmludGYoIiBvZmZzZXQgJTA4eFxuIixvdXJfY2Et
PmNhX3JlZ1swXSk7CglwcmludGYoIiVzOiBub2RlICUwOHhcbiIsc2MtPnNjX2Rldi5kdl94bmFt
ZSxub2RlKTsKCQoJZm9yIChjaGlsZCA9IE9GX2NoaWxkKG5vZGUpOyBjaGlsZDsgY2hpbGQgPSBP
Rl9wZWVyKGNoaWxkKSkgewoJCW5hbWVsZW4gPSBPRl9nZXRwcm9wKGNoaWxkLCAibmFtZSIsIG5h
bWUsIHNpemVvZihuYW1lKSk7CgkJaWYgKG5hbWVsZW4gPCAwKQoJCQljb250aW51ZTsKCQlpZiAo
bmFtZWxlbiA+PSBzaXplb2YobmFtZSkpCgkJCWNvbnRpbnVlOwoKCQluYW1lW25hbWVsZW5dID0g
MDsKCQljYS5jYV9uYW1lID0gbmFtZTsKCQljYS5jYV9ub2RlID0gY2hpbGQ7CgoJCWNhLmNhX25y
ZWcgID0gT0ZfZ2V0cHJvcChjaGlsZCwgInJlZyIsIHJlZywgc2l6ZW9mKHJlZykpOwoJCWNhLmNh
X25pbnRyID0gT0ZfZ2V0cHJvcChjaGlsZCwgIkFBUEwsaW50ZXJydXB0cyIsIGludHIsCgkJCQlz
aXplb2YoaW50cikpOwoJCWlmIChjYS5jYV9uaW50ciA9PSAtMSkKCQkJY2EuY2FfbmludHIgPSBP
Rl9nZXRwcm9wKGNoaWxkLCAiaW50ZXJydXB0cyIsIGludHIsCgkJCQkJc2l6ZW9mKGludHIpKTsK
CgkJY2EuY2FfcmVnID0gcmVnOwoJCWNhLmNhX2ludHIgPSBpbnRyOwoKCQljb25maWdfZm91bmQo
c2VsZiwgJmNhLCB1bmlfbl9wcmludCk7Cgl9Cn0KCiNkZWZpbmUgTl9MSVNUIChzaXplb2Yoc2tp
cGxpc3QpIC8gc2l6ZW9mKHNraXBsaXN0WzBdKSkKCmludAp1bmlfbl9wcmludChhdXgsIHVuaV9u
KQoJdm9pZCAqYXV4OwoJY29uc3QgY2hhciAqdW5pX247CnsKCXN0cnVjdCBjb25mYXJncyAqY2Eg
PSBhdXg7CglpZiAodW5pX24pCgkJYXByaW50X25vcm1hbCgiJXMgYXQgJXMiLCBjYS0+Y2FfbmFt
ZSwgdW5pX24pOwoKCWlmIChjYS0+Y2FfbnJlZyA+IDApCgkJYXByaW50X25vcm1hbCgiIG9mZnNl
dCAweCV4IiwgY2EtPmNhX3JlZ1swXSk7CgoJcmV0dXJuIFVOQ09ORjsKfQo=

--Multipart=_Mon__13_Dec_2004_16_38_40_-0500_5GirXTY65BazO16v
Content-Type: application/octet-stream;
 name="ki2c.patch"
Content-Disposition: attachment;
 filename="ki2c.patch"
Content-Transfer-Encoding: base64

SW5kZXg6IGNvbmYvZmlsZXMubWFjcHBjCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9jdnNyb290L3Ny
Yy9zeXMvYXJjaC9tYWNwcGMvY29uZi9maWxlcy5tYWNwcGMsdgpyZXRyaWV2aW5nIHJldmlzaW9u
IDEuNjMKZGlmZiAtdSAtdyAtcjEuNjMgZmlsZXMubWFjcHBjCi0tLSBjb25mL2ZpbGVzLm1hY3Bw
YwkyNSBNYXIgMjAwNCAxODo1MjoyNSAtMDAwMAkxLjYzCisrKyBjb25mL2ZpbGVzLm1hY3BwYwkx
MyBEZWMgMjAwNCAxODo0MTozNiAtMDAwMApAQCAtNzIsNiArNzIsMTIgQEAKIGF0dGFjaCB1bmlu
b3J0aCBhdCBtYWluYnVzCiBmaWxlIGFyY2gvbWFjcHBjL3BjaS91bmlub3J0aC5jCQkJdW5pbm9y
dGgKIAorIyBwc2V1ZG9kZXYgZm9yIHRoZSBVbmlOb3J0aCBob3N0IGNvbnRyb2xsZXIKK2RlZmlu
ZSB1bmlfbiB7fQorZGV2aWNlIHVuaV9uOiB1bmlfbgorYXR0YWNoIHVuaV9uIGF0IG1haW5idXMK
K2ZpbGUgYXJjaC9tYWNwcGMvZGV2L3VuaS1uLmMJCQl1bmlfbgorCiAjIFBDSSBidXMgc3VwcG9y
dAogaW5jbHVkZSAiZGV2L3BjaS9maWxlcy5wY2kiCiAKQEAgLTE5NSw4ICsyMDEsOSBAQAogZmls
ZSBhcmNoL21hY3BwYy9tYWNwcGMvcmJ1c19tYWNoZGVwLmMJCWNhcmRidXMKIAogIyBLZXl3ZXN0
IEkyQwotZGV2aWNlIGtpMmMge30KLWF0dGFjaCBraTJjIGF0IG9iaW8KK2RlZmluZSBraTJjIHt9
CitkZXZpY2Uga2kyYzogaTJjYnVzLCBraTJjCithdHRhY2gga2kyYyBhdCBvYmlvLCB1bmlfbgog
ZmlsZSBhcmNoL21hY3BwYy9kZXYva2kyYy5jCQkJa2kyYwogCiAjIHNuYXBwZXIgYXVkaW8KQEAg
LTIwNSwzICsyMTIsOCBAQAogZmlsZSBhcmNoL21hY3BwYy9kZXYvc25hcHBlci5jCQkJc25hcHBl
cgogCiBpbmNsdWRlICJhcmNoL21hY3BwYy9jb25mL21ham9ycy5tYWNwcGMiCisKK2RlZmluZSBh
ZHQ3NDY3YyB7fQorZGV2aWNlIGFkdDc0NjdjOiBzeXNtb25fZW52c3lzCithdHRhY2ggYWR0NzQ2
N2MgYXQga2kyYworZmlsZSBhcmNoL21hY3BwYy9kZXYvYWR0NzQ2Ny5jCQkJYWR0NzQ2N2MKSW5k
ZXg6IGRldi9raTJjLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL2N2c3Jvb3Qvc3JjL3N5cy9hcmNo
L21hY3BwYy9kZXYva2kyYy5jLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjEKZGlmZiAtdSAtdyAt
cjEuMSBraTJjLmMKLS0tIGRldi9raTJjLmMJMjcgRGVjIDIwMDMgMDI6MTk6MzQgLTAwMDAJMS4x
CisrKyBkZXYva2kyYy5jCTEzIERlYyAyMDA0IDE4OjQxOjM3IC0wMDAwCkBAIC0zNSw2ICszNSw4
IEBACiAjaW5jbHVkZSA8dXZtL3V2bV9leHRlcm4uaD4KICNpbmNsdWRlIDxtYWNoaW5lL2F1dG9j
b25mLmg+CiAKKyNpbmNsdWRlIDxkZXYvaTJjL2kyY3Zhci5oPgorCiAvKiBLZXl3ZXN0IEkyQyBS
ZWdpc3RlciBvZmZzZXRzICovCiAjZGVmaW5lIE1PREUJMAogI2RlZmluZSBDT05UUk9MCTEKQEAg
LTg2LDYgKzg4LDkgQEAKIAl1X2NoYXIgKnNjX3JlZzsKIAlpbnQgc2NfcmVnc3RlcDsKIAorCXN0
cnVjdCBpMmNfY29udHJvbGxlciBzY19pMmM7CisJc3RydWN0IGxvY2sgc2NfYnVzbG9jazsKKwog
CWludCBzY19mbGFnczsKIAl1X2NoYXIgKnNjX2RhdGE7CiAJaW50IHNjX3Jlc2lkOwpAQCAtMTA0
LDYgKzEwOSwxNCBAQAogaW50IGtpMmNfc3RhcnQoc3RydWN0IGtpMmNfc29mdGMgKiwgaW50LCBp
bnQsIHZvaWQgKiwgaW50KTsKIGludCBraTJjX3JlYWQoc3RydWN0IGtpMmNfc29mdGMgKiwgaW50
LCBpbnQsIHZvaWQgKiwgaW50KTsKIGludCBraTJjX3dyaXRlKHN0cnVjdCBraTJjX3NvZnRjICos
IGludCwgaW50LCBjb25zdCB2b2lkICosIGludCk7CitpbnQga2kyY19wcmludCBfX1AoKHZvaWQg
KiwgY29uc3QgY2hhciAqKSk7CisKKy8qIEkyQyBnbHVlICovCitzdGF0aWMgaW50IGtpMmNfaTJj
X2FjcXVpcmVfYnVzKHZvaWQgKiwgaW50KTsKK3N0YXRpYyB2b2lkIGtpMmNfaTJjX3JlbGVhc2Vf
YnVzKHZvaWQgKiwgaW50KTsKK3N0YXRpYyBpbnQJa2kyY19pMmNfZXhlYyh2b2lkICosIGkyY19v
cF90LCBpMmNfYWRkcl90LCBjb25zdCB2b2lkICosIHNpemVfdCwKKwkJICAgIHZvaWQgKiwgc2l6
ZV90LCBpbnQpOworCiAKIHN0cnVjdCBjZmF0dGFjaCBraTJjX2NhID0gewogCSJraTJjIiwge30s
IHNpemVvZihzdHJ1Y3Qga2kyY19zb2Z0YyksIGtpMmNfbWF0Y2gsIGtpMmNfYXR0YWNoCkBAIC0x
MzIsNyArMTQ1LDEyIEBACiAJc3RydWN0IGtpMmNfc29mdGMgKnNjID0gKHN0cnVjdCBraTJjX3Nv
ZnRjICopc2VsZjsKIAlzdHJ1Y3QgY29uZmFyZ3MgKmNhID0gYXV4OwogCWludCBub2RlID0gY2Et
PmNhX25vZGU7Ci0JaW50IHJhdGU7CisJaW50IHJhdGUsIGNoaWxkLCBuYW1lbGVuOworCXN0cnVj
dCBjb25mYXJncyBjX2NhOworCXN0cnVjdCBpMmNidXNfYXR0YWNoX2FyZ3MgaWJhOworCisJY2hh
ciBuYW1lWzMyXTsKKwl1X2ludCByZWdbMjBdOwogCiAJY2EtPmNhX3JlZ1swXSArPSBjYS0+Y2Ff
YmFzZWFkZHI7CiAKQEAgLTE1NCw5ICsxNzIsNjEgQEAKIAlraTJjX3dyaXRlcmVnKHNjLCBTVEFU
VVMsIDApOwogCWtpMmNfd3JpdGVyZWcoc2MsIElTUiwgMCk7CiAJa2kyY193cml0ZXJlZyhzYywg
SUVSLCAwKTsKKwkvL3ByaW50ZigibW9kZTogJTAyeFxuIixraTJjX3JlYWRyZWcoc2MsTU9ERSkp
OworCWtpMmNfd3JpdGVyZWcoc2MsIE1PREUsIDB4MTApOwogCiAJa2kyY19zZXRtb2RlKHNjLCBJ
MkNfU1REU1VCTU9ERSk7CiAJa2kyY19zZXRzcGVlZChzYywgSTJDXzEwMGtIeik7CQkvKiBYWFgg
cmF0ZSAqLworCQorCWxvY2tpbml0KCZzYy0+c2NfYnVzbG9jaywgUFJJQklPfFBDQVRDSCwgc2Mt
PnNjX2Rldi5kdl94bmFtZSwgMCwgMCk7CisKKwkvKiBmaWxsIGluIHRoZSBpMmMgdGFnICovCisJ
c2MtPnNjX2kyYy5pY19jb29raWUgPSBzYzsKKwlzYy0+c2NfaTJjLmljX2FjcXVpcmVfYnVzID0g
a2kyY19pMmNfYWNxdWlyZV9idXM7CisJc2MtPnNjX2kyYy5pY19yZWxlYXNlX2J1cyA9IGtpMmNf
aTJjX3JlbGVhc2VfYnVzOworCXNjLT5zY19pMmMuaWNfc2VuZF9zdGFydCA9IE5VTEw7CisJc2Mt
PnNjX2kyYy5pY19zZW5kX3N0b3AgPSBOVUxMOworCXNjLT5zY19pMmMuaWNfaW5pdGlhdGVfeGZl
ciA9IE5VTEw7CisJc2MtPnNjX2kyYy5pY19yZWFkX2J5dGUgPSBOVUxMOworCXNjLT5zY19pMmMu
aWNfd3JpdGVfYnl0ZSA9IE5VTEw7CisJc2MtPnNjX2kyYy5pY19leGVjPWtpMmNfaTJjX2V4ZWM7
CisKKwlpYmEuaWJhX25hbWUgPSAiaWljIjsKKwlpYmEuaWJhX3RhZyA9ICZzYy0+c2NfaTJjOwor
CSh2b2lkKSBjb25maWdfZm91bmQoJnNjLT5zY19kZXYsICZpYmEsIGlpY2J1c19wcmludCk7CisK
KworCWZvciAoY2hpbGQgPSBPRl9jaGlsZChub2RlKTsgY2hpbGQ7IGNoaWxkID0gT0ZfcGVlcihj
aGlsZCkpIHsKKwkJbmFtZWxlbiA9IE9GX2dldHByb3AoY2hpbGQsICJuYW1lIiwgbmFtZSwgc2l6
ZW9mKG5hbWUpKTsKKwkJaWYgKG5hbWVsZW4gPCAwKQorCQkJY29udGludWU7CisJCWlmIChuYW1l
bGVuID49IHNpemVvZihuYW1lKSkKKwkJCWNvbnRpbnVlOworCisJCW5hbWVbbmFtZWxlbl0gPSAw
OworCQljX2NhLmNhX25hbWUgPSBuYW1lOworCQljX2NhLmNhX25vZGUgPSBjaGlsZDsKKwkJY19j
YS5jYV9ucmVnICA9IE9GX2dldHByb3AoY2hpbGQsICJyZWciLCByZWcsIHNpemVvZihyZWcpKTsK
KwkJY19jYS5jYV9yZWcgPSByZWc7CisJCWNfY2EuY2FfYmFzZWFkZHI9KHVfaW50KSZzYy0+c2Nf
aTJjOwkvKiB1Z2x5LCBidXQgd2UgbXVzdCBwYXNzIHRoZSBpMmMgc29tZWhvdyAqLworCQljb25m
aWdfZm91bmQoc2VsZiwgJmNfY2EsIGtpMmNfcHJpbnQpOworCX0KK30KKworaW50CitraTJjX3By
aW50KGF1eCwga2kyYykKKwl2b2lkICphdXg7CisJY29uc3QgY2hhciAqa2kyYzsKK3sKKwlzdHJ1
Y3QgY29uZmFyZ3MgKmNhID0gYXV4OworCisJaWYgKGtpMmMpCisJCWFwcmludF9ub3JtYWwoIiVz
IGF0ICVzIiwgY2EtPmNhX25hbWUsIGtpMmMpOworCisJaWYgKGNhLT5jYV9ucmVnID4gMCkKKwkJ
YXByaW50X25vcm1hbCgiIG9mZnNldCAweCV4IiwgY2EtPmNhX3JlZ1swXSk7CisKKwlyZXR1cm4g
VU5DT05GOwogfQogCiB1X2ludApAQCAtMjMxLDcgKzMwMSw2IEBACiAJdV9pbnQgaXNyLCB4Owog
CiAJaXNyID0ga2kyY19yZWFkcmVnKHNjLCBJU1IpOwotCiAJaWYgKGlzciAmIEkyQ19JTlRfQURE
UikgewogI2lmIDAKIAkJaWYgKChraTJjX3JlYWRyZWcoc2MsIFNUQVRVUykgJiBJMkNfU1RfTEFT
VEFBSykgPT0gMCkgewpAQCAtMzUzLDYgKzQyMiw5IEBACiAJdm9pZCAqZGF0YTsKIHsKIAlzYy0+
c2NfZmxhZ3MgPSBJMkNfUkVBRElORzsKKwkjaWZkZWYgS0kyQ19ERUJVRworCQlwcmludGYoImtp
MmNfcmVhZDogJTAyeCAlZFxuIixhZGRyLGxlbik7CisJI2VuZGlmCiAJcmV0dXJuIGtpMmNfc3Rh
cnQoc2MsIGFkZHIsIHN1YmFkZHIsIGRhdGEsIGxlbik7CiB9CiAKQEAgLTM2Myw1ICs0MzUsNDEg
QEAKIAljb25zdCB2b2lkICpkYXRhOwogewogCXNjLT5zY19mbGFncyA9IDA7CisJI2lmZGVmIEtJ
MkNfREVCVUcKKwkJcHJpbnRmKCJraTJjX3dyaXRlOiAlMDJ4ICVkXG4iLGFkZHIsbGVuKTsKKwkj
ZW5kaWYKIAlyZXR1cm4ga2kyY19zdGFydChzYywgYWRkciwgc3ViYWRkciwgKHZvaWQgKilkYXRh
LCBsZW4pOwogfQorCitzdGF0aWMgaW50CitraTJjX2kyY19hY3F1aXJlX2J1cyh2b2lkICpjb29r
aWUsIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qga2kyY19zb2Z0YyAqc2MgPSBjb29raWU7CisKKwly
ZXR1cm4gKGxvY2ttZ3IoJnNjLT5zY19idXNsb2NrLCBMS19FWENMVVNJVkUsIE5VTEwpKTsKK30K
Kworc3RhdGljIHZvaWQKK2tpMmNfaTJjX3JlbGVhc2VfYnVzKHZvaWQgKmNvb2tpZSwgaW50IGZs
YWdzKQoreworCXN0cnVjdCBraTJjX3NvZnRjICpzYyA9IGNvb2tpZTsKKworCSh2b2lkKSBsb2Nr
bWdyKCZzYy0+c2NfYnVzbG9jaywgTEtfUkVMRUFTRSwgTlVMTCk7Cit9CisKK2ludAora2kyY19p
MmNfZXhlYyh2b2lkICpjb29raWUsIGkyY19vcF90IG9wLCBpMmNfYWRkcl90IGFkZHIsIGNvbnN0
IHZvaWQgKnZjbWQsCisgICAgc2l6ZV90IGNtZGxlbiwgdm9pZCAqdmJ1Ziwgc2l6ZV90IGJ1Zmxl
biwgaW50IGZsYWdzKQoreworCXN0cnVjdCBraTJjX3NvZnRjICpzYyA9IGNvb2tpZTsKKwkKKwlr
aTJjX3NldG1vZGUoc2MsIEkyQ19TVERNT0RFKTsJLyogd2UgaGFuZGxlIHRoZSBzdWJhZGRyZXNz
IHN0dWZmIG91cnNlbHZlcyAqLworCWlmKGtpMmNfd3JpdGUoc2MsYWRkciwwLHZjbWQsY21kbGVu
KSE9MCkKKwkJcmV0dXJuIC0xOworCWlmIChJMkNfT1BfUkVBRF9QKG9wKSkKKwl7CisJCWlmKGtp
MmNfcmVhZChzYyxhZGRyLDAsdmJ1ZixidWZsZW4pIT0wKQorCQkJcmV0dXJuIC0xOworCX0KKwly
ZXR1cm4gMDsKK30K

--Multipart=_Mon__13_Dec_2004_16_38_40_-0500_5GirXTY65BazO16v--