All,
As a first attempt at kernel programming I've written a driver for
the Hardware Random number generator available on Intel 810 systems.
If anyone cares, I can provide a document in which Intel waves all
copyrights and grants me right to do whatever I please with this
code which was developed on my own time (I am an Intel employee).
In it's current state it compiles and runs against kernel 2.3.X
(AFAIK) but isn't really useful. Here's the theory of operation, and
some ideas for making it useful. Some of these ideas were already
discusses with Alan and Ted (without code) before I had the waver.
The RNG is basically just a couple registers one of which will give you
a random byte every 4ms or so, the public docs say it comes from thermal
entropy on the chip, and I have no other information about it's source
but I do know that it seems to always pass statistical randomness tests.
(more later)
This driver uses a device file (insmod rng.o rng_major=? rng_minor=?)
that will allow you to read a stream of random bytes, it blocks if
none is available but is pretty fast (more like 4bytes per 4ms in
testing). Also, once per jiffie (maybe should be less) the RNG reads
a byte on its own and adds it to it's internal stat tests. After 2500
byte have been read it check to see if the results pass the FIPS 140-1
RNG tests and if they don't it disables the RNG. Ted had mentioned his
concern that the RNG would freak out under some unknown circumstances
and start producing non-random data. This internal test prevents this.
There is also a /proc/sys/dev/rng that identifies the RNG and tells
you it's state. `echo -n 0 > /proc/sys/dev/rng` disables it
`echo -n 1 > /proc/sys/dev/rng` re-enables it. (Disable it before
doing rmmod)
Current Problems:
#1 It has a device file which is a bad idea. We don't want people using
the data directly, and we don't want them to NOT use /dev/random. The
better way is to get the data into the entropy pool for /dev/random.
Ted's opinion was to read from the RNG in user land and put the data
into /dev/random through ioctl's. My opinion is that if the data is
available to user land someone will use it directly. Plus the overhead
of all the ioctl's and context switches has to be more than if we had
an exported add_random_byte() function from random.c.
(Note that Ted has not seen the implementation described here so I don't
want to speak for him)
#2 This is my first shot in kernel land so pointers are appreciated,
I've not messed with 2.2.X although I included some compatibility macros
for once I get around to it.
#3 Holding the stat test information in the kernel might be a waste. It
isn't much space and doesn't grow so I think we're OK. I may be able to
trim it down some too. If this isn't done in the kernel then we run the
risk of giving either users or the entropy pool bad data.
Solutions:
#1 Make random.c export a function to the kernel that takes in raw
random data and adds it to the entropy pool without doing any work on
it. This is a trust issue, we have to assume that people in the kernel
have better ways to mess with the machine than adding non-random data
to the pool. If this existed the device file would go away and the
rng.o module would just call add_random_byte() once per jiffie, no-one
would even know it was running.
#2 Keep the /dev/<whatever> and have a user daemon that reads data out
and puts it back in the kernel through the ioctl on /dev/random. This
would make lots of ioctls and would require the user space daemon. Plus
it leaves a /dev/rng laying around for people to [mis]use.
I've attached the source, you can send me kernel help if you feel like
it, but mostly I'd like to get a consensus on the best way to make this
work.
-Matt Sottek
--------------61E819AA0D732AF326F71D03
Content-Type: application/octet-stream;
name="rng.c"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="rng.c"
LyogSW50ZWwgODI4MDIgRmlybXdhcmUgSFVCIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIERy
aXZlcgogICBDb3B5cmlnaHQgKGMpIDIwMDAgTWF0dCBTb3R0ZWsgbXNvdHRla0BxdWlrbmV0
LmNvbQoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl
IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5z
ZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhp
cyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg
aW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2
ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcg
d2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUK
ICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0
b24sIE1BICAwMjExMS0xMzA3ICBVU0EKCiovCgojZGVmaW5lIF9fS0VSTkVMX18KI2RlZmlu
ZSBNT0RVTEUKCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L21v
ZHVsZS5oPgojaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiNpbmNsdWRlIDxsaW51eC9lcnJu
by5oPgojaW5jbHVkZSA8bGludXgvZnMuaD4KI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgoj
aW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgojaW5jbHVkZSA8bGludXgvcGNpLmg+CiNpbmNs
dWRlIDxsaW51eC90aW1lci5oPgojaW5jbHVkZSA8bGludXgvdHF1ZXVlLmg+CiNpbmNsdWRl
IDxsaW51eC9zY2hlZC5oPgojaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KI2luY2x1ZGUgPGxp
bnV4L2RlbGF5Lmg+CgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KI2luY2x1ZGUgPGFzbS9z
ZWdtZW50Lmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KCi8qCiAqIExpbnV4IDIuMiBjb21wYXRp
YmlsaXR5CiAqLwojaWZuZGVmIERFQ0xBUkVfV0FJVFFVRVVFCiNkZWZpbmUgREVDTEFSRV9X
QUlUUVVFVUUoV0FJVCwgUFRSKSAgICBzdHJ1Y3Qgd2FpdF9xdWV1ZSBXQUlUID0geyBQVFIs
IE5VTEwgfQojZW5kaWYKI2lmbmRlZiBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRAojZGVmaW5l
IERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKFdBSVQpIHN0cnVjdCB3YWl0X3F1ZXVlICpXQUlU
CiNlbmRpZgoKCiNkZWZpbmUgaTgyODAyX0FERFJFU1MgMHhmZmJjMDE1ZgojZGVmaW5lIGk4
MjgwMl9QUkVTRU5UX01BU0sgMHg0MAojZGVmaW5lIGk4MjgwMl9FTkFCTEVEX01BU0sgMHgw
MQojZGVmaW5lIGk4MjgwMl9TVEFUVVNfTUFTSyAweDAxCgojZGVmaW5lIFJOR19NSU5PUiAw
CiNkZWZpbmUgUk5HX01BSk9SIDAKCnZvaWQgcm5nX2ZpcHNfdGVzdCgpOwoKdW5zaWduZWQg
Y2hhciAqcm5nX21lbTsKdW5zaWduZWQgaW50IHJuZ19taW5vcj0wOwp1bnNpZ25lZCBpbnQg
cm5nX21ham9yPTA7CmludCBwb2tlclsxNl0scnVuc1sxMl07CmxvbmcgaW50IHBva2VydGVz
dDsKaW50IGxvbmdydW4gPSAwOwppbnQgb25lcyA9IDA7CmludCBybmdfc3RhdHVzID0gMDsK
c3RydWN0IHRpbWVyX2xpc3Qgcm5nX3RpbWVyOwppbnQgY3VycmVudHIgPSAwOwppbnQgcmxl
bmd0aCA9IDA7CmludCBsYXBzID0gMDsKaW50IHN0YXRfbWVzc2FnZT0wOwpNT0RVTEVfUEFS
TShybmdfbWlub3IsImkiKTsKTU9EVUxFX1BBUk0ocm5nX21ham9yLCJpIik7Cgp2b2lkIGRp
c2FibGVfcm5nKCkgewogIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CgogIHNhdmVfZmxhZ3MoZmxh
Z3MpOwogIGNsaSgpOwogIGlmKHJuZ19zdGF0dXMpIHsKICAgIHdyaXRlYigweDQwLHJuZ19t
ZW0pOwogICAgcm5nX3N0YXR1cyA9IDA7CiAgICByZXN0b3JlX2ZsYWdzKGZsYWdzKTsKICAg
IE1PRF9ERUNfVVNFX0NPVU5UOwogICAgcHJpbnRrKCI8MT4gUk5HIERpc2FibGVkXG4iKTsK
ICB9CiAgZWxzZSB7CiAgICByZXN0b3JlX2ZsYWdzKGZsYWdzKTsKICB9Cn0KCnZvaWQgZW5h
YmxlX3JuZygpIHsKICB1bnNpZ25lZCBsb25nIGZsYWdzOwoKICBzYXZlX2ZsYWdzKGZsYWdz
KTsKICBjbGkoKTsKICBpZighcm5nX3N0YXR1cykgewogICAgIHdyaXRlYigweDQxLHJuZ19t
ZW0pOwogICAgIHJuZ19zdGF0dXMgPSAxOwogICAgIHJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwog
ICAgIE1PRF9JTkNfVVNFX0NPVU5UOwogICAgIHByaW50aygiPDE+IFJORyBFbmFibGVkXG4i
KTsKICAgICBybmdfZmlwc190ZXN0KCk7CiAgfQogIGVsc2UgewogICAgcmVzdG9yZV9mbGFn
cyhmbGFncyk7CiAgfQp9Cgp2b2lkIHJuZ193YWtldXAodV9sb25nIHJuZ193YWl0X3F1ZXVl
X2hlYWRQKSB7CiAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCh3YWl0X3F1ZXVlX2hlYWRfdCAq
KXJuZ193YWl0X3F1ZXVlX2hlYWRQKTsKfQoKLyogVGhlc2UgYXJlIHRoZSBzdGFydHVwIHRl
c3RzIHN1Z2dlc3RlZCBieSB0aGUgRklQUyAxNDAtMSBzcGVjIHNlY3Rpb24KKiAgNC4xMS4x
IChodHRwOi8vY3NyYy5uaXN0Lmdvdi9maXBzL2ZpcHMxNDAxLmh0bSkKKiAgVGhlIE1vbm9i
aXQsIFBva2VyLCBSdW5zLCBhbmQgTG9uZyBSdW5zIHRlc3RzIGFyZSBpbXBsZW1lbnRlZCBi
ZWxvdy4KKiAgVGhpcyB0ZXN0IGlzIHJ1biBhdCBzdGFydHVwIGFuZCBhdCBwZXJpb2RpYyBp
bnRlcnZhbHMgdG8gdmVyaWZ5CiogIGRhdGEgaXMgc3VmZmljZW50bHkgcmFuZG9tLiBJZiB0
aGUgdGVzdHMgYXJlIGZhaWxlZCB0aGUgUk5HIG1vZHVsZQoqICB3aWxsIG5vIGxvbmdlciBz
dWJtaXQgZGF0YSB0byB0aGUgZW50cm9weSBwb29sLCBidXQgdGhlIHRlc3RzIHdpbGwKKiAg
Y29udGludWUgdG8gcnVuIGF0IHRoZSBnaXZlbiBpbnRlcnZhbC4gSWYgYXQgYSBsYXRlciB0
aW1lIHRoZSBSTkcKKiAgcGFzc2VzIGFsbCB0ZXN0cyBpdCB3aWxsIGJlIHJlLWVuYWJsZWQg
Zm9yIHRoZSBuZXh0IHBlcmlvZC4KKiAgIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCBp
dCBpcyBub3QgdW5saWtlbHkgdGhhdCBhdCBzb21lIHRpbWUKKiAgZHVyaW5nIG5vcm1hbCBv
cGVyYXRpb24gb25lIG9mIHRoZSB0ZXN0cyB3aWxsIGZhaWwuIFRoaXMgZG9lcyBub3QKKiAg
bmVjZXNzYXJpbHkgbWVhbiB0aGUgUk5HIGlzIG5vdCBvcGVyYXRpbmcgcHJvcGVybHksIGl0
IGlzIGp1c3QgYQoqICBzdGF0aXN0aWNhbGx5IHJhcmUgZXZlbnQuIEluIHRoYXQgY2FzZSB3
ZSBkb24ndCB3YW50IHRvIGZvcmV2ZXIKKiAgZGlzYWJsZSB0aGUgUk5HLCB3ZSB3aWxsIGp1
c3QgbGVhdmUgaXQgZGlzYWJsZWQgZm9yIHRoZSBwZXJpb2Qgb2YKKiAgdGltZSB1bnRpbCB0
aGUgdGVzdHMgYXJlIHJlcnVuLgoqCiogIEZvciBhcmd1bWVudCBzYWtlIEkgdGVzdGVkIC9w
cm9jL3VyYW5kb20gd2l0aCB0aGVzZSB0ZXN0cyBhbmQgaXQKKiAgdG9vayAxNDIsMDk1IHRy
aWVzIGJlZm9yZSBJIGdvdCBhIGZhaWx1cmUsIGFuZCB1cmFuZG9tIGlzbid0IGFzCiogIHJh
bmRvbSBhcyByYW5kb20gOikKKi8Kdm9pZCBybmdfZmlwc190ZXN0KCkgewogIGludCBqOwog
IHVuc2lnbmVkIGNoYXIgcmJ5dGUgPSAwOwogIHVuc2lnbmVkIGxvbmcgZmxhZ3M9MDsKICBp
bnQgcGFzc2VkPTE7CgogIGlmKCFsYXBzKSB7CiAgICAvKiBJbml0aWFsaXplICovCiAgICBj
dXJyZW50ciA9IDA7CiAgICBybGVuZ3RoID0gMDsKICAgIGZvcihqPTA7IGo8MTY7IGorKykg
ewogICAgICBwb2tlcltqXSA9IDA7CiAgICB9CiAgICBmb3Ioaj0wOyBqPDEyOyBqKyspIHsK
ICAgICAgcnVuc1tqXSA9IDA7CiAgICB9CiAgICBybGVuZ3RoID0gOTk5OwogICAgb25lcyA9
IDA7CiAgfQoKICBpZihsYXBzIDwgMjUwMCApIHsKICAgIHdoaWxlKDEpIHsKICAgICAgc2F2
ZV9mbGFncyhmbGFncyk7CiAgICAgIGNsaSgpOwoKICAgICAgcmJ5dGUgPSByZWFkYihybmdf
bWVtKTsgICAKICAgICAgLy8gQ2hlY2sgaWYgd2UncmUgZW5hYmxlZCBhbmQgc3RhdHVzIGlz
IHJlYWR5CiAgICAgIGlmKCEocmJ5dGUgJiBpODI4MDJfRU5BQkxFRF9NQVNLKSkgewoJLyog
U29tZW9uZSB0dXJuZWQgdXMgb2ZmIG1pZCB0ZXN0IHdlJ2xsIGp1c3QgcmVzZXQgYW5kCgkg
ICBleGl0Li4uIG5vIG5lZWQgdG8gZmluaXNoIHRoaXMgcnVuICovCglsYXBzID0gMDsKCXJl
c3RvcmVfZmxhZ3MoZmxhZ3MpOwoJcmV0dXJuOwogICAgICB9CiAgICAgIHJieXRlID0gcmVh
ZGIocm5nX21lbSArIDEpOwogICAgICBpZihyYnl0ZSAmIGk4MjgwMl9TVEFUVVNfTUFTSykg
ewoJcmJ5dGUgPSByZWFkYihybmdfbWVtICsgMik7CglyZXN0b3JlX2ZsYWdzKGZsYWdzKTsK
CWJyZWFrOwogICAgICB9CiAgICAgIHJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwogICAgICBtZGVs
YXkoNCk7CiAgICB9CgogICAgcG9rZXJbcmJ5dGU+PjRdICs9IDE7CiAgICBwb2tlcltyYnl0
ZSAmIDE1XSArPSAxOwoKICAgIC8qIFRyaWNrIHRvIG1ha2Ugc3VyZSBjdXJyZW50ciAhPSB0
aGUgZmlyc3QgYml0IHNvIHdlIGRvbid0IHNjcmV3CiAgICAgICB1cCB0aGUgZmlyc3QgcnVu
bGVuZ3RoICovCiAgICBpZihybGVuZ3RoID09IDk5OSkgewogICAgICBjdXJyZW50ciA9ICEo
KHJieXRlICYgMTI4KT4+Nyk7CiAgICAgIHJ1bnNbY3VycmVudHIgKiA2XSA9IC0xOwogICAg
ICBybGVuZ3RoID0gMTsKICAgIH0KICAgIGZvcihqPTc7IGo+PTA7IGotLSkgewogICAgICBp
ZihyYnl0ZSAmIDE8PGope29uZXMrKzt9CiAgICAgIGlmKCgocmJ5dGUgJiAxPDxqKT4+aikg
PT0gY3VycmVudHIpIHsKCXJsZW5ndGgrKzsKICAgICAgfQogICAgICBlbHNlIHsKCS8qIElm
IHJ1bmxlbmd0aCBpcyAxLTYgY291bnQgaXQgaW4gY29ycmVjdCBidWNrZXQuIDAncyBnbyBp
bgoJICAgcnVuc1swLTVdIDEncyBnbyBpbiBydW5zWzYtMTFdIGhlbmNlIHRoZSA2KmN1cnJl
bnRyIGJlbG93ICovCglpZihybGVuZ3RoIDwgNikgewoJICBydW5zW3JsZW5ndGggLSAxICsg
KDYqY3VycmVudHIpXSsrOwoJfQoJaWYocmxlbmd0aCA+PSA2KSB7CgkgIHJ1bnNbNSArICg2
KmN1cnJlbnRyKV0rKzsKCX0KCS8qIENoZWNrIGlmIHdlIGp1c3QgZmFpbGVkIGxvbmdydW4g
dGVzdCAqLwoJaWYocmxlbmd0aCA+PSBsb25ncnVuKSB7CgkgIGxvbmdydW4gPSBybGVuZ3Ro
OwoJfQoJcmxlbmd0aD0xOwoJLyogZmxpcCB0aGUgY3VycmVudCBydW4gdHlwZSAqLwoJY3Vy
cmVudHIgPSAocmJ5dGUgJiAxPDxqKT4+ajsKICAgICAgfQogICAgfQogICAgbGFwcysrOwog
IH0KICBlbHNlIHsKICAgIC8qIGFkZCBpbiB0aGUgbGFzdCAocG9zc2libHkgaW5jb21wbGV0
ZSkgcnVuICovCiAgICBpZihybGVuZ3RoIDw9IDYpIHsKICAgICAgcnVuc1tybGVuZ3RoIC0g
MSArICg2KmN1cnJlbnRyKV0rKzsKICAgIH0KICAgIGlmKHJsZW5ndGggPT0gMzQpIHsKICAg
ICAgbG9uZ3J1biA9IDE7CiAgICB9CgogICAgLyogRG8gcG9rZXIgdGVzdCAqLwogICAgcG9r
ZXJ0ZXN0ID0gMDsKCiAgICBmb3Ioaj0wOyBqPDE2OyBqKyspIHsKICAgICAgcG9rZXJ0ZXN0
ICs9IHBva2VyW2pdICogcG9rZXJbal07CiAgICB9CiAgICBzdGF0X21lc3NhZ2UgPSAwOwog
ICAgaWYoISAoKG9uZXMgPCAxMDM0NikgJiYgKG9uZXMgPiA5NjU0KSkgKXsKICAgICAgcHJp
bnRrKCI8MT4gUk5HIGZhaWxlZCBNb25vYml0IHRlc3QuLi5kaXNhYmxpbmdcbiIpOwogICAg
ICBzdGF0X21lc3NhZ2UgPSBzdGF0X21lc3NhZ2UgJiAxOyAKICAgICAgcGFzc2VkID0gMDsK
ICAgIH0KICAgIGlmKCEgKChwb2tlcnRlc3QgPCAxNTgwNDU3KSAmJiAocG9rZXJ0ZXN0ID4g
MTU2MjgyMSkpICl7CiAgICAgIHByaW50aygiPDE+IFJORyBmYWlsZWQgUG9rZXIgdGVzdC4u
LmRpc2FibGluZ1xuIik7CiAgICAgIHN0YXRfbWVzc2FnZSA9IHN0YXRfbWVzc2FnZSAmIDI7
CiAgICAgIHBhc3NlZCA9IDA7CiAgICB9CiAgICBpZighICgocnVuc1swXSA+PSAyMjY3KSAm
JiAocnVuc1swXSA8PSAyNzMzKSAmJgoJICAocnVuc1sxXSA+PSAxMDc5KSAmJiAocnVuc1sx
XSA8PSAxNDIxKSAmJgoJICAocnVuc1syXSA+PSA1MDIpICAmJiAocnVuc1syXSA8PSA3NDgp
ICYmCgkgIChydW5zWzNdID49IDIyMykgICYmIChydW5zWzNdIDw9IDQwMikgJiYKCSAgKHJ1
bnNbNF0gPj0gOTApICAgJiYgKHJ1bnNbNF0gPD0gMjIzKSAmJgoJICAocnVuc1s1XSA+PSA5
MCkgICAmJiAocnVuc1s1XSA8PSAyMjMpICYmCgkgIChydW5zWzZdID49IDIyNjcpICYmIChy
dW5zWzZdIDw9IDI3MzMpICYmCgkgIChydW5zWzddID49IDEwNzkpICYmIChydW5zWzddIDw9
IDE0MjEpICYmCgkgIChydW5zWzhdID49IDUwMikgICYmIChydW5zWzhdIDw9IDc0OCkgJiYK
CSAgKHJ1bnNbOV0gPj0gMjIzKSAgJiYgKHJ1bnNbOV0gPD0gNDAyKSAmJgoJICAocnVuc1sx
MF0gPj0gOTApICAgJiYgKHJ1bnNbMTBdIDw9IDIyMykgJiYKCSAgKHJ1bnNbMTFdID49IDkw
KSAgICYmIChydW5zWzExXSA8PSAyMjMpKSApIHsKICAgICAgcHJpbnRrKCI8MT4gUk5HIGZh
aWxlZCBSdW5zIHRlc3QuLi5kaXNhYmxpbmdcbiIpOwogICAgICBzdGF0X21lc3NhZ2UgPSBz
dGF0X21lc3NhZ2UgJiA0OwogICAgICBwYXNzZWQgPSAwOwogICAgfQogICAgaWYobG9uZ3J1
biA+PSAzNCkgewogICAgICBwcmludGsoIjwxPiBSTkcgZmFpbGVkIExvbmdSdW4gdGVzdC4u
LmRpc2FibGluZ1xuIik7CiAgICAgIHN0YXRfbWVzc2FnZSA9IHN0YXRfbWVzc2FnZSAmIDg7
CiAgICAgIHBhc3NlZCA9IDA7CiAgICB9CiAgICBpZihwYXNzZWQpeyBlbmFibGVfcm5nKCk7
IH0KICAgIGVsc2UgeyBkaXNhYmxlX3JuZygpOyB9CiAKICAgIGxhcHMgPSAwOwogIH0KICBp
bml0X3RpbWVyKCZybmdfdGltZXIpOwogIHJuZ190aW1lci5leHBpcmVzID0gamlmZmllcyAr
IDE7CiAgcm5nX3RpbWVyLmZ1bmN0aW9uID0gKHZvaWQgKilybmdfZmlwc190ZXN0OwogIHJu
Z190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpTlVMTDsKICBhZGRfdGltZXIoJnJuZ190
aW1lcik7CiAgcmV0dXJuOwoKICAvKgogICAqIFB1dCByYnl0ZSBpbiB0aGUgZW50cm9weSBw
b29sIGhlcmUhCiAgICovCn0KCgoKLyoKICogQ2FsbGVkIHdoZW4gcmVhZGluZyBmcm9tIHRo
ZSBkZXZpY2UuIFRoaXMgc2hvdWxkIGdvIGF3YXkKICogaWYgd2UgY2FuIHB1dCBkYXRhIGlu
IHRoZSBwb29sIGRpcmVjdGx5CiovCnNzaXplX3Qgcm5nX3JlYWQoc3RydWN0IGZpbGUgKnJu
Z19maWxlLGNoYXIgKmJ1ZmZlcixzaXplX3QgbGVuZ3RoLAoJCSBsb2ZmX3QgKm9mZikgewog
IHVuc2lnbmVkIGNoYXIgcmJ5dGU7CiAgaW50IHNsZWVwX3RpbWU9MTsKCiAgc3RydWN0IHRp
bWVyX2xpc3Qgcm5nX3N0YWxsX3RpbWVyOwogIERFQ0xBUkVfV0FJVFFVRVVFKHJuZ193YWl0
X3F1ZXVlLCBjdXJyZW50KTsKICBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChybmdfd2FpdF9x
dWV1ZV9oZWFkKTsKCiAgd2hpbGUoMSkgewogICAgcmJ5dGUgPSByZWFkYihybmdfbWVtKTsK
ICAgIC8vIENoZWNrIGlmIHdlJ3JlIGVuYWJsZWQgYW5kIHN0YXR1cyBpcyByZWFkeQogICAg
aWYoIShyYnl0ZSAmIGk4MjgwMl9FTkFCTEVEX01BU0spKSB7CiAgICAgIC8qIFRoZSBSTkcg
aXNuJ3Qgb24uIFdlJ3JlIGdvaW5nIHRvIHNsZWVwIGEgbG9uZyB0aW1lICovCiAgICAgIHNs
ZWVwX3RpbWUgPSAxMDA7CiAgICB9CiAgICBlbHNlIHsKICAgICAgcmJ5dGUgPSByZWFkYihy
bmdfbWVtICsgMSk7CiAgICAgIGlmKHJieXRlICYgaTgyODAyX1NUQVRVU19NQVNLKSB7Cgly
Ynl0ZSA9IHJlYWRiKHJuZ19tZW0gKyAyKTsKCWJyZWFrOwogICAgICB9CiAgICAgIHNsZWVw
X3RpbWUgPSAxOwogICAgfQogICAgaW5pdF90aW1lcigmcm5nX3N0YWxsX3RpbWVyKTsKICAg
IHJuZ19zdGFsbF90aW1lci5leHBpcmVzID0gamlmZmllcyArIHNsZWVwX3RpbWU7CiAgICBy
bmdfc3RhbGxfdGltZXIuZnVuY3Rpb24gPSAodm9pZCAqKXJuZ193YWtldXA7CiAgICBybmdf
c3RhbGxfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSZybmdfd2FpdF9xdWV1ZV9oZWFk
OwogICAgYWRkX3RpbWVyKCZybmdfc3RhbGxfdGltZXIpOwogICAgaW50ZXJydXB0aWJsZV9z
bGVlcF9vbigmcm5nX3dhaXRfcXVldWVfaGVhZCk7CiAgICBpZihzaWduYWxfcGVuZGluZyhj
dXJyZW50KSkgcmV0dXJuIC1FUkVTVEFSVFNZUzsKICB9CiAgY29weV90b191c2VyKGJ1ZmZl
ciwmcmJ5dGUsMSk7CiAgcm5nX2ZpbGUtPmZfcG9zKys7CiAgcmV0dXJuIDE7Cn0KCi8qIE9w
ZW4gRGV2aWNlIGZpbGUKICovCmludCBybmdfb3BlbihzdHJ1Y3QgaW5vZGUgKnJuZ19pbm9k
ZSxzdHJ1Y3QgZmlsZSAqcm5nX2ZpbGUpIHsKICBwcmludGsoIjwxPiBSTkcgRGV2aWNlIG9w
ZW5lZFxuIik7CiAgTU9EX0lOQ19VU0VfQ09VTlQ7CiAgcmV0dXJuIDA7Cn0KCi8qIENsb3Nl
IERldmljZSBGaWxlCiAqLwppbnQgcm5nX3JlbGVhc2Uoc3RydWN0IGlub2RlICpybmdfaW5v
ZGUsIHN0cnVjdCBmaWxlICpybmdfZmlsZSkgewogIHByaW50aygiPDE+IFJORyBEZXZpY2Ug
Y2xvc2VkXG4iKTsKICBNT0RfREVDX1VTRV9DT1VOVDsKICByZXR1cm4gMDsKfQoKc3RydWN0
IGZpbGVfb3BlcmF0aW9ucyBybmdfZm9wcyA9IHsKICBvcGVuOnJuZ19vcGVuLAogIHJlbGVh
c2U6cm5nX3JlbGVhc2UsCiAgcmVhZDpybmdfcmVhZAp9OwoKaW50IHJuZ19wcm9jX3dyaXRl
KHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWYsCgkJICAgdW5zaWduZWQgbG9u
ZyBjb3VudCwgdm9pZCAqZGF0YSkgewoKICBpZihjb3VudCA+PSAxKSB7CiAgICBpZihidWZb
MF0gPT0gNDgpe2Rpc2FibGVfcm5nKCk7fQogICAgaWYoYnVmWzBdID09IDQ5KSB7CiAgICAg
ICBlbmFibGVfcm5nKCk7CiAgICB9CiAgfQogIHJldHVybiAxOwp9CgppbnQgcm5nX3Byb2Nf
cmVhZChjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAoJCSAgIGludCBs
ZW4sIGludCB1bnVzZWQpIHsKICBsZW4gPSBzcHJpbnRmKGJ1ZiwgIkludGVsIDgyODAyIFJh
bmRvbSBOdW1iZXIgZ2VuZXJhdG9yIHByZXNlbnQuXG4iKTsKICBpZihybmdfc3RhdHVzID09
IDEpIHsKICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiBTdGF0dXM6IEVuYWJsZWRc
blxuIik7CiAgfQogIGVsc2UgewogICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiIFN0
YXR1czogRGlzYWJsZWRcblxuIik7CiAgfQogIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwg
Ikxhc3Qgc3RhdGlzdGljYWwgYW5hbHlzaXMgcmVzdWx0czpcbiIpOwogIGlmKHN0YXRfbWVz
c2FnZSAmIDEpIHtsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJGYWlsZWQgT25lcyBUZXN0
XG4iKTt9CiAgZWxzZSB7bGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiUGFzc2VkIE9uZXMg
VGVzdFxuIik7fQoKICBpZihzdGF0X21lc3NhZ2UgJiAyKSB7bGVuICs9IHNwcmludGYoYnVm
ICsgbGVuLCAiRmFpbGVkIFBva2VyIFRlc3RcbiIpO30KICBlbHNlIHsgbGVuICs9IHNwcmlu
dGYoYnVmICsgbGVuLCAiUGFzc2VkIFBva2VyIFRlc3RcbiIpOyB9CgogIGlmKHN0YXRfbWVz
c2FnZSAmIDQpIHsgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiRmFpbGVkIFJ1bnMgVGVz
dFxuIik7fQogIGVsc2UgeyBsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJQYXNzZWQgUnVu
cyBUZXN0XG4iKTsgfQoKICBpZihzdGF0X21lc3NhZ2UgJiA4KSB7bGVuICs9IHNwcmludGYo
YnVmICsgbGVuLCAiRmFpbGVkIExvbmdydW4gVGVzdFxuIik7fQogIGVsc2UgeyBsZW4gKz0g
c3ByaW50ZihidWYgKyBsZW4sICJQYXNzZWQgTG9uZ3J1biBUZXN0XG4iKTsgfQoKICByZXR1
cm4gbGVuOwp9CgovKgpzdHJ1Y3QgcHJvY19kaXJfZW50cnkgcm5nX3Byb2NfZW50cnkgPSB7
CiAgMCwKICAxMSwic3lzL2Rldi9ybmciLAogIFNfSUZSRUcgfCBTX0lSVUdPLAogIDEsMCww
LAogIDAsCiAgTlVMTCwKICAodm9pZCAqKSZybmdfcHJvY19yZWFkLAp9OwoqLwpzdHJ1Y3Qg
cHJvY19kaXJfZW50cnkgKnJuZ19wcm9jX2VudHJ5OwoKc3RydWN0IHByb2NfZGlyX2VudHJ5
IHByb2Nfcm9vdDsKCgoKLyogSW5pdGlhbGl6ZSBNb2R1bGU6CiAqIFJORyBpcyBkZXRlY3Rl
ZCBhbmQgZW5hYmxlZCBpZiBwcmVzZW50LiBUaGUgZmlwcyAxNDAtMSB0ZXN0IGlzCiAqIHRo
ZW4gcnVuIHRvIG1ha2Ugc3VyZSBkZXZpY2UgaXMgb3BlcmF0aW5nIHByb3Blcmx5LiBTaW5j
ZSB0aGlzCiAqIHRlc3QgdGFrZXMgYSBjb3VwbGUgc2Vjb25kcyBpdCBpcyBzY2hlZHVsZWQg
Zm9yIGxhdGVyIGFuZCBpbml0X21vZHVsZQogKiByZXR1cm5zLgogKi8KaW50IGluaXRfbW9k
dWxlKHZvaWQpIHsKICBpbnQgZXJyOwogIHVuc2lnbmVkIGNoYXIgaW5wdXQ7CiAgdW5zaWdu
ZWQgY2hhciBidXMsZnVuY3Rpb247CgogIC8qIENoZWNrIGZvciB0aGUgODEwIElDSCBmaXJz
dCAqLwogIGlmKHBjaWJpb3NfZmluZF9kZXZpY2UoMHg4MDg2LDB4MjQxOCwwLCZidXMsJmZ1
bmN0aW9uKSAmJgogICAgIHBjaWJpb3NfZmluZF9kZXZpY2UoMHg4MDg2LDB4MjQyOCwwLCZi
dXMsJmZ1bmN0aW9uKSkgewogICAgIHByaW50aygiPDE+Uk5HIG5vdCBmb3VuZFxuIik7CiAg
ICAgcmV0dXJuIC1FQlVTWTsKICB9CiAgZWxzZSB7CiAgICBwcmludGsoIjwzPlJORyBmb3Vu
ZCBhbiA4MTAgc3lzdGVtXG4iKTsKICB9CiAgLyogQ2hlY2sgZm9yIEludGVsIDgyODAyICov
CiAgcm5nX21lbSA9IGlvcmVtYXAoaTgyODAyX0FERFJFU1MsMyk7CiAgaWYoIXJuZ19tZW0p
IHsKICAgIHByaW50aygiPDE+Uk5HIE1lbW9yeSBub3QgbWFwcGVkIVxuIik7CiAgICByZXR1
cm4gLUVCVVNZOwogIH0KICBpbnB1dCA9IHJlYWRiKHJuZ19tZW0pOwogIGlmKGlucHV0ICYg
aTgyODAyX1BSRVNFTlRfTUFTSykgewogICAgcHJpbnRrKCI8MT5pODI4MDIgUk5HIERldGVj
dGVkXG4iKTsKICAgIGVuYWJsZV9ybmcoKTsKICB9CiAgZWxzZSB7CiAgIHByaW50aygiPDE+
Uk5HIG5vdCBmb3VuZFxuIik7CiAgIHJldHVybiAtRUJVU1k7CiAgfQoKICAvKiBBbGxvY2F0
ZSAvcHJvYyBlbnRyeSAqLwogIHJuZ19wcm9jX2VudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnko
InN5cy9kZXYvcm5nIiwgU19JRlJFR3xTX0lSVUdPLAoJCQkJICAgICBOVUxMKTsKICBybmdf
cHJvY19lbnRyeS0+Z2V0X2luZm8gPSAodm9pZCAqKXJuZ19wcm9jX3JlYWQ7CiAgcm5nX3By
b2NfZW50cnktPndyaXRlX3Byb2MgPSAodm9pZCAqKSBybmdfcHJvY193cml0ZTsKCiAgLyog
Q29kZSBmb3IgYWxsb2NhdGluZyBtYWpvci9taW5vciBudW1iZXIgKi8KICBpZighcm5nX21p
bm9yKXtybmdfbWlub3IgPSBSTkdfTUlOT1I7fQogIGlmKCFybmdfbWFqb3Ipe3JuZ19tYWpv
ciA9IFJOR19NQUpPUjt9CiAgZXJyID0gcmVnaXN0ZXJfY2hyZGV2KHJuZ19tYWpvciwicm5n
Iiwmcm5nX2ZvcHMpOwogIGlmKGVyciA+IDApe3JuZ19tYWpvciA9IGVycjt9CiAgZWxzZSB7
cmV0dXJuIGVycjt9CgogIHByaW50aygiPDE+SW50ZWwgODI4MDIgUk5HIE1vZHVsZSBsb2Fk
ZWQuXG4iKTsKICByZXR1cm4gMDsKfQoKdm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKXsKCiAg
LyogUmVsZWFzZSBtYWpvci9taW5vciAqLwogIHVucmVnaXN0ZXJfY2hyZGV2KHJuZ19tYWpv
ciwicm5nIik7CgogIC8qIFJlbGVhc2UgcHJvYyBlbnRyeSAqLwogIHJlbW92ZV9wcm9jX2Vu
dHJ5KCJzeXMvZGV2L3JuZyIsTlVMTCk7CgogIC8qIHVubWFwIGlvIG1lbW9yeSAqLwogIGlv
dW5tYXAocm5nX21lbSk7CgogIHByaW50aygiPDE+IFJORyBNb2R1bGUgaGFzIGV4aXRlZFxu
Iik7Cn0KCgo=
--------------61E819AA0D732AF326F71D03--
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/