From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Lolou-0001eO-7u for qemu-devel@nongnu.org; Tue, 31 Mar 2009 17:48:32 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Lolop-0001cX-CI for qemu-devel@nongnu.org; Tue, 31 Mar 2009 17:48:31 -0400 Received: from [199.232.76.173] (port=34400 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Lolop-0001cN-2V for qemu-devel@nongnu.org; Tue, 31 Mar 2009 17:48:27 -0400 Received: from smtp-out.google.com ([216.239.33.17]:42117) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1Loloo-000207-2i for qemu-devel@nongnu.org; Tue, 31 Mar 2009 17:48:26 -0400 Received: from spaceape14.eur.corp.google.com (spaceape14.eur.corp.google.com [172.28.16.148]) by smtp-out.google.com with ESMTP id n2VLmO6W019119 for ; Tue, 31 Mar 2009 22:48:24 +0100 Received: from yx-out-1718.google.com (yxf34.prod.google.com [10.190.2.98]) by spaceape14.eur.corp.google.com with ESMTP id n2VLmLWG013907 for ; Tue, 31 Mar 2009 14:48:22 -0700 Received: by yx-out-1718.google.com with SMTP id 34so1755750yxf.38 for ; Tue, 31 Mar 2009 14:48:21 -0700 (PDT) MIME-Version: 1.0 In-Reply-To: References: <49D12392.6040107@redhat.com> <20090330214321.GP3795@csclub.uwaterloo.ca> <20090330.161514.117919654.imp@bsdimp.com> <20090330233853.GT3795@csclub.uwaterloo.ca> <761ea48b0903302259p31b13c76s4c44396b8e33166b@mail.gmail.com> <60cad3f0903310558j554d6906q6f1244fd8a7449aa@mail.gmail.com> Date: Tue, 31 Mar 2009 23:48:21 +0200 Message-ID: <60cad3f0903311448y7e826b6blecb015140fa09901@mail.gmail.com> Subject: Re: [Qemu-devel] [PATCH] Document Qemu coding style From: David Turner Content-Type: multipart/mixed; boundary=000e0cd47cd261fe9704667128ab Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org --000e0cd47cd261fe9704667128ab Content-Type: multipart/alternative; boundary=000e0cd47cd261fe8f04667128a9 --000e0cd47cd261fe8f04667128a9 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit On Tue, Mar 31, 2009 at 6:18 PM, Blue Swirl wrote: > > True enough for the comments part. There are still some areas that I > don't understand well, for example TB handling and its inherent > limitations. > > Which part of the source you find subtle and magical but not commented > enough? > ok, here are a few things that ring a bell, there are probably a lot others: the software mmu implementation in system mode is *really* hard to understand at first. It took me a long time to grasp the various aspects of it, including these: - loads/stores in kernel or userspace map to different translated code fragments - loads/stores in different emulated CPUs also map to different translated code. - the way i/o memory access is controlled in fine details and relates to the rest of the MMU. most of what happens in exe.c is black-magic :-) how the audio-subsystem works and its relationship with hardware emulation is subtle. For my work on the Android emulator, I have modified three audio-backends and wrote one from scratch. It took me several tries to get things to an acceptable state. What I didn't understand first is that there is no common time-based used by all components involved. dyngen used to be pretty radical too. Thanks god it is gone for any target and host platform combination I care about :-) slirp is an hideous pile of goo which mixes network-ordered fields and host-ordered ones, including pointers, into the same structures, liberally and at different times, depending on context. Which is probably why it took so long to fix 64-bit issues in it. I would like to add support for IPv6 to this code, but sadly, I have the feeling that rewriting most of it from scratch would be slightly easier. the CharDriverState interface takes some time to fully understand. In the Android emulator, I sometimes need to connect two CharDriverState users together, and had to write a special purpose object just to do that, but was surprised how hard writing a bug-less one was. I also think that the event loop implementation is confusing compared to more common interfaces provides by things like libevent. It is also extremely tied to select(), which prevents using better mechanisms on various platforms, and even performs rather poorly on Windows, but I digress. qemu_get_clock(vm_clock) will return time in nano-seconds, but qemu_get_clock(rt_clock) will return time in milli-seconds. This is totally undocumented, and the code that uses the result tend to use magic numbers like 1000000 or 1000 to perform conversions which are never clear on first sight. Maybe this is fixed in upstream QEMU but, my, how this hurted me in the past. For the record, here are attached a few documents I wrote to detail what I've "discovered" until now. Hope some one can find them useful (Sorry if some of them are focused on ARM system emulation only). Regards --000e0cd47cd261fe8f04667128a9 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable

On Tue, Mar 31, 2009 at 6:18 PM, Blue Sw= irl <blauwirbe= l@gmail.com> wrote:

True enough for the comments part. There are still some areas that I<= br> don't understand well, for example TB handling and its inherent
limitations.

Which part of the source you find subtle and magical but not commented enou= gh?

ok, here are a few things that ring a bell, there are= probably a lot others:

the software mmu implementation in system mo= de is *really* hard to understand at
first. It took me a long time to gr= asp the various aspects of it, including these:
  • loads/stores in kernel or userspace map to different translated cod= e fragments
  • loads/stores in different emulated CPUs also map to dif= ferent translated code.
  • the way i/o memory access is controlled in = fine details and relates to the rest of the MMU.
most of what happens in exe.c is black-magic :-)

how the audio-= subsystem works and its relationship with hardware emulation is subtle.
= For my work on the Android emulator, I have modified three audio-backends a= nd wrote
one from scratch. It took me several tries to get things to an acceptable s= tate. What I
didn't understand first is that there is no common time= -based used by all components
involved.

dyngen used to be pretty = radical too. Thanks god it is gone for any target and host platform
combination I care about :-)

slirp is an hideous pile of goo which m= ixes network-ordered fields and host-ordered ones,
including pointers, i= nto the same structures, liberally and at different times, depending on
context. Which is probably why it took so long to fix 64-bit issues in it. = I would like to add
support for IPv6 to this code, but sadly, I have the= feeling that rewriting most of it from
scratch would be slightly easier= .

the CharDriverState interface takes some time to fully understand. In t= he Android emulator,
I sometimes need to connect two CharDriverState use= rs together, and had to write a special
purpose object just to do that, = but was surprised how hard writing a bug-less one was.

I also think that the event loop implementation is confusing compared t= o more common interfaces
provides by things like libevent. It is also ex= tremely tied to select(), which prevents using better
mechanisms on vari= ous platforms, and even performs rather poorly on Windows, but I digress.
qemu_get_clock(vm_clock) will return time in nano-seconds, but qemu_get= _clock(rt_clock)
will return time in milli-seconds. This is totally undo= cumented, and the code that uses the result
tend to use magic numbers li= ke 1000000 or 1000 to perform conversions which are never clear
on first sight. Maybe this is fixed in upstream QEMU but, my, how this hurt= ed me in the past.

For the record, here are attached a fe= w documents I wrote to detail what I've "discovered"
until= now. Hope some one can find them useful (Sorry if some of them are focused= on ARM
system emulation only).

Regards


--000e0cd47cd261fe8f04667128a9-- --000e0cd47cd261fe9704667128ab Content-Type: text/plain; charset=US-ASCII; name="AUDIO.TXT" Content-Disposition: attachment; filename="AUDIO.TXT" Content-Transfer-Encoding: base64 X-Attachment-Id: f_fsz4e3ou0 SE9XIEFVRElPIEVNVUxBVElPTiBXT1JLUyBJTiBRRU1VOgo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09CgpUaGluZ3MgYXJlIGEgYml0IHRyaWNreSwgYnV0IGhlcmUncyBhIHJvdWdo IGRlc2NyaXB0aW9uOgoKICBRRU1VU291bmRDYXJkOiBtb2RlbHMgYSBnaXZlbiBlbXVsYXRlZCBz b3VuZCBjYXJkCiAgU1dWb2ljZU91dDogICAgbW9kZWxzIGFuIGF1ZGlvIG91dHB1dCBmcm9tIGEg UUVNVVNvdW5kQ2FyZAogIFNXVm9pY2VJbjogICAgIG1vZGVscyBhbiBhdWRpbyBpbnB1dCBmcm9t IGEgUUVNVVNvdW5kQ2FyZAoKICBIV1ZvaWNlT3V0OiAgICBtb2RlbHMgYW4gYXVkaW8gb3V0cHV0 IChiYWNrZW5kKSBvbiB0aGUgaG9zdC4KICBIV1ZvaWNlSW46ICAgICBtb2RlbHMgYW4gYXVkaW8g aW5wdXQgKGJhY2tlbmQpIG9uIHRoZSBob3N0LgoKRWFjaCB2b2ljZSBjYW4gaGF2ZSBpdHMgb3du IHNldHRpbmdzIGluIHRlcm1zIG9mIHNhbXBsZSBzaXplLCBlbmRpYW5lc3MsIHJhdGUsIGV0Yy4u LgoKCkVtdWxhdGlvbiBmb3IgYSBnaXZlbiBzb3VuZGNhcmQgdHlwaWNhbGx5IGRvZXM6CgogIDEv IENyZWF0ZSBhIFFFTVVTb3VuZENhcmQgb2JqZWN0IGFuZCByZWdpc3RlciBpdCB3aXRoIEFVRF9y ZWdpc3Rlcl9jYXJkKCkKICAyLyBGb3IgZWFjaCBlbXVsYXRlZCBvdXRwdXQsIGNhbGwgQVVEX29w ZW5fb3V0KCkgdG8gY3JlYXRlIGEgU1dWb2ljZU91dCBvYmplY3QuCiAgMy8gRm9yIGVhY2ggZW11 bGF0ZWQgaW5wdXQsIGNhbGwgQVVEX29wZW5faW4oKSB0byBjcmVhdGUgYSBTV1ZvaWNlSW4gb2Jq ZWN0LgoKICBOb3RlIHRoYXQgeW91IG11c3QgcGFzcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIEFV RF9vcGVuX291dCgpIGFuZCBBVURfb3Blbl9pbigpOwogIG1vcmUgb24gdGhpcyBsYXRlci4KCiAg RWFjaCBTV1ZvaWNlT3V0IGlzIGFzc29jaWF0ZWQgdG8gYSBzaW5nbGUgSFdWb2ljZU91dCwgZWFj aCBTV1ZvaWNlSW4gaXMKICBhc3NvY2lhdGVkIHRvIGEgc2luZ2xlIEhXVm9pY2VJbi4KCiAgSG93 ZXZlciB5b3UgY2FuIGhhdmUgc2V2ZXJhbCBTV1ZvaWNlT3V0IGFzc29jaWF0ZWQgdG8gdGhlIHNh bWUgSFdWb2ljZU91dAogIChzYW1lIHRoaW5nIGZvciBTV1ZvaWNlSW4vSFdWb2ljZUluKS4KClNP VU5EIFBMQVlCQUNLIERFVEFJTFM6Cj09PT09PT09PT09PT09PT09PT09PT09CgpFYWNoIEhXVm9p Y2VPdXQgaGFzIHRoZSBmb2xsb3dpbmcgdG9vOgoKICAtIEEgZml4ZWQtc2l6ZSBjaXJjdWxhciBi dWZmZXIgb2Ygc3RlcmVvIHNhbXBsZXMgKGZvciBzdGVyZW8pLgogICAgd2hvc2UgZm9ybWF0IGlz IGVpdGhlciBmbG9hdHMgb3IgaW50NjRfdCBwZXIgc2FtcGxlIChkZXBlbmRpbmcgb24gYnVpbGQK ICAgIGNvbmZpZ3VyYXRpb24pLgoKICAtIEEgJ3NhbXBsZXMnIGZpZWxkIGdpdmluZyB0aGUgKGNv bnN0YW50KSBudW1iZXIgb2Ygc2FtcGxlIHBhaXJzIGluIHRoZSBzdGVyZW8gYnVmZmVyLgoKICAt IEEgdGFyZ2V0IGNvbnZlcnNpb24gZnVuY3Rpb24sIGNhbGxlZCAnY2xpcCgpJyB0aGF0IGlzIHVz ZWQgdG8gcmVhZCBmcm9tIHRoZSBzdGVyZW8KICAgIGJ1ZmZlciBhbmQgd3JpdGUgaW50byBhIHBs YXRmb3JtLXNwZWNpZmljIHNvdW5kIGJ1ZmZlcnMgKGUuZy4gV2luV2F2ZS1tYW5hZ2VkIGJ1ZmZl cnMKICAgIG9uIFdpbmRvd3MpLgoKICAtIEEgJ3Jwb3MnIG9mZnNldCBpbnRvIHRoZSBjaXJjdWxh ciBidWZmZXIgd2hpY2ggdGVsbHMgd2hlcmUgdG8gcmVhZCB0aGUgbmV4dCBzYW1wbGVzCiAgICBm cm9tIHRoZSBzdGVyZW8gYnVmZmVyIGZvciB0aGUgbmV4dCBjb252ZXJzaW9uIHRocm91Z2ggJ2Ns aXAnLgoKCiAgICAgICAgICAgIHw8LS0tLS0tLS0tLS0tLS0tLS0gc2FtcGxlcyAtLS0tLS0tLS0t LS0tLS0tLS0tLS0tLT58CgogICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfAoKICAgICAgICAgICAgfCAgICAgICBycG9zICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICB8 CiAgICAgICAgICAgIHxfX19fX19fdl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX198CiAgICAgICAgICAgIHwgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8CiAgICAgICAgICAgIHwgICAgICAgfCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgICAgICAgIHxfX19fX19ffF9fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CgoKICAtIEEgJ3J1bl9vdXQnIG1l dGhvZCB0aGF0IGlzIGNhbGxlZCBlYWNoIHRpbWUgdG8gdGVsbCB0aGUgb3V0cHV0IGJhY2tlbmQg dG8KICAgIHNlbmQgc2FtcGxlcyBmcm9tIHRoZSBzdGVyZW8gYnVmZmVyIHRvIHRoZSBob3N0IHNv dW5kIGNhcmQvc2VydmVyLiBUaGlzIG1ldGhvZAogICAgc2hhbGwgYWxzbyBtb2RpZnkgJ3Jwb3Mn IGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyAncGxheWVkJy4gQSBtb3JlIGRldGFp bGVkCiAgICBkZXNjcmlwdGlvbiBvZiB0aGlzIHByb2Nlc3MgYXBwZWFycyBiZWxvdy4KCiAgLSBB ICd3cml0ZScgbWV0aG9kIGNhbGxiYWNrIHVzZWQgdG8gd3JpdGUgYSBidWZmZXIgb2YgZW11bGF0 ZWQgc291bmQgc2FtcGxlcyBmcm9tCiAgICBhIFNXVm9pY2VPdXQgaW50byB0aGUgc3RlcmVvIGJ1 ZmZlci4gKkFsbCogYmFja2VuZHMgc2ltcGx5IGNhbGwgdGhlIGdlbmVyaWMKICAgIGZ1bmN0aW9u IGF1ZGlvX3BjbV9zd193cml0ZSgpIHRvIGltcGxlbWVudCB0aGlzLiBJdCdzIGRpZmZpY3VsdCB0 byBzZWUgd2h5CiAgICBpdCdzIG5lZWRlZCBhdCBhbGwgPwoKICAgIChTaW1pbGFybHksIGFsbCBi YWNrZW5kcyBoYXZlIGEgJ3JlYWQnIG1ldGhvZHMgd2hpY2ggc2ltcGx5IGNhbGxzICdhdWRpb19w Y21fc3dfcmVhZCcpCgpFYWNoIFNXVm9pY2VPdXQgaGFzIHRoZSBmb2xsb3dpbmc6CgogIC0gYSAn Y29udigpJyBmdW5jdGlvbiB1c2VkIHRvIHJlYWQgc291bmQgc2FtcGxlcyBmcm9tIHRoZSBlbXVs YXRlZCBzb3VuZCBjYXJkIGFuZAogICAgY29weS9taXggdGhlbSB0byB0aGUgY29ycmVzcG9uZGlu ZyBIV1ZvaWNlT3V0J3Mgc3RlcmVvIGJ1ZmZlci4KCiAgLSBhICd0b3RhbF9od19zYW1wbGVzX21p eGVkJyB3aGljaCBjb3JyZXNwb25kIHRvIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0aGF0IGhhdmUK ICAgIGFscmVhZHkgYmVlbiBtaXhlZCBpbnRvIHRoZSB0YXJnZXQgSFdWb2ljZU91dCBzdGVyZW8g YnVmZmVyIChzdGFydGluZyBmcm9tIHRoZQogICAgSFdWb2ljZU91dCdzICdycG9zJyBvZmZzZXQp LiBOT1RFOiB0aGlzIGlzIGEgY291bnQgb2Ygc2FtcGxlcyBpbiB0aGUgSFdWb2ljZU91dAogICAg c3RlcmVvIGJ1ZmZlciwgbm90IGVtdWxhdGVkIGhhcmR3YXJlIHNvdW5kIHNhbXBsZXMsIHdoaWNo IGNhbiBoYXZlIGRpZmZlcmVudAogICAgcHJvcGVydGllcyAoZnJlcXVlbmN5LCBzaXplLCBlbmRp YW5lc3MpLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX19fX19f X19fX19fCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAg ICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBTV1ZvaWNl T3V0MiB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8X19fX19fX19f X19fX198CiAgICAgICAgICAgICAgICAgIF9fX19fX19fX19fX19fICAgICAgICAgICB8CiAgICAg ICAgICAgICAgICAgfCAgICAgICAgICAgICAgfCAgICAgICAgICB8CiAgICAgICAgICAgICAgICAg fCAgU1dWb2ljZU91dDEgfCAgICAgICAgICB8ICAgICB0aHNtPE4+IDo9IHRvdGFsX2h3X3NhbXBs ZXNfbWl4ZWQKICAgICAgICAgICAgICAgICB8X19fX19fX19fX19fX198ICAgICAgICAgIHwgICAg ICAgICAgICAgICAgZm9yIFNXVm9pY2VPdXQ8Tj4KICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAg ICAgIHwKICAgICAgICAgICAgICAgICAgICB8PC0tLS0tfC0tLS0tLS0tLS0tLXRoc20yLS0+fAog ICAgICAgICAgICAgICAgICAgIHwgICAgICB8ICAgICAgICAgICAgICAgICAgICB8CiAgICAgICAg ICAgICAgICAgICAgfDwtLS10aHNtMS0tLS0tLS0tPnwgICAgICAgIHwKICAgICAgICAgICAgIF9f X19fX198X19fX19fX19fX19fX19fX19fdl9fX19fX19ffF9fX19fX19fX19fX19fXyAKICAgICAg ICAgICAgfCAgICAgICB8MTExMTExMTExMTExMTExMTExfCAgICAgICAgdiAgICAgICAgICAgICAg IHwKICAgICAgICAgICAgfCAgICAgICB8MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyfCAgICAg ICAgICAgICAgIHwKICAgICAgICAgICAgfF9fX19fX198X19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX3wKICAgICAgICAgICAgICAgICAgICBeCiAgICAgICAgICAgICAg ICAgICAgfCAgICAgICAgIEhXVm9pY2VPdXQgc3RlcmVvIGJ1ZmZlcgogICAgICAgICAgICAgICAg ICAgIHJwb3MKCgogIC0gYSAncmF0aW8nIHZhbHVlLCB3aGljaCBpcyB0aGUgcmF0aW8gb2YgdGhl IHRhcmdldCBIV1ZvaWNlT3V0J3MgZnJlcXVlbmN5IGJ5CiAgICB0aGUgU1dWb2ljZU91dCdzIGZy ZXF1ZW5jeSwgbXVsdGlwbGllZCBieSAoMSA8PCAzMiksIGFzIGEgNjQtYml0IGludGVnZXIuCgog ICAgU28sIGlmIHRoZSBIV1ZvaWNlT3V0IGhhcyBhIGZyZXF1ZW5jeSBvZiA0NGtIeiwgYW5kIHRo ZSBTV1ZvaWNlT3V0IGhhcyBhIGZyZXF1ZW5jeQogICAgb2YgMTFrSHosIHRoZW4gcmF0aW8gd2ls bCBiZSAoNDQvMTEqKDEgPDwgMzIpKSA9IDB4NF8wMDAwXzAwMDAKCiAgLSBhIGNhbGxiYWNrIHBy b3ZpZGVkIGJ5IHRoZSBlbXVsYXRlZCBoYXJkd2FyZSB3aGVuIHRoZSBTV1ZvaWNlT3V0IGlzIGNy ZWF0ZWQuCiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbWl4IHRoZSBTV1ZvaWNlT3V0J3Mg c2FtcGxlcyBpbnRvIHRoZSB0YXJnZXQKICAgIEhXVm9pY2VPdXQgc3RlcmVvIGJ1ZmZlciAoaXQg bXVzdCBhbHNvIHBlcmZvcm0gZnJlcXVlbmN5IGludGVycG9sYXRpb24sCiAgICB2b2x1bWUgYWRq dXN0bWVudCwgZXRjLi4pLgoKICAgIFRoaXMgY2FsbGJhY2sgbm9ybWFsbHkgY2FsbHMgYW5vdGhl ciBoZWxwZXIgZnVuY3Rpb25zIGluIHRoZSBhdWRpbyBzdWJzeXN0ZW0KICAgIChBVURfd3JpdGUo KSkgdG8gdG8gdGhlIG1peGluZy92b2x1bWUtYWRqdXN0bWVudCBmcm9tIGVtdWxhdGVkIGhhcmR3 YXJlIHNhbXBsZQogICAgYnVmZmVycy4KCkhlcmUncyBhIHNtYWxsIGdyYXBoaWNzIHRoYXQgZXhw bGFpbnMgaXQgYmV0dGVyOgoKICAgU1dWb2ljZU91dDogIGVtdWxhdGVkIGhhcmR3YXJlIHNvdW5k IGJ1ZmZlcnM6CgogICAgICAgICAgfAogICAgICAgICAgfCAgIChtaXhlZCB0aHJvdWdoIEFVRF93 cml0ZSgpIGZyb20gdXNlci1wcm92aWRlZCBjYWxsYmFjawogICAgICAgICAgfCAgICB3aGljaCBp cyBjYWxsZWQgb24gZWFjaCBhdWRpbyB0aW1lciB0aWNrKS4KICAgICAgICAgIHYKCiAgIEhXVm9p Y2VPdXQ6IHN0ZXJlbyBzYW1wbGUgY2lyY3VsYXIgYnVmZmVyCgogICAgICAgICAgfAogICAgICAg ICAgfCAgICh0aHJvdWdoIEhXVm9pY2VPdXQncyAnY2xpcCcgZnVuY3Rpb24sIGludm9rZWQgZnJv bSB0aGUKICAgICAgICAgIHwgICAgJ3J1bl9vdXQnIG1ldGhvZCkKICAgICAgICAgIHYKCiAgIGJh Y2tlbmQtc3BlY2lmaWMgc291bmQgYnVmZmVycwoKVEhFUkUgSVMgTk8gQ09NTU9OIFRJTUVCQVNF IEJFVFdFRU4gQUxMIExBWUVSUy4gRE9OJ1QgRVhQRUNUIEFOWSBISUdILUFDQ1VSQUNZIC8KTE9X LUxBVEVOQ1kgSU4gVEhJUyBJTVBMRU1FTlRBVElPTi4KCgpUaGUgZnVuY3Rpb24gYXVkaW9fdGlt ZXIoKSBpbiBhdWRpby9hdWRpby5jIGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkgYW5kIGl0IGlzIHVz ZWQgYXMKYSBwdWxzZSB0byBwZXJmb3JtIHNvdW5kIGJ1ZmZlciB0cmFuc2ZlcnMgYW5kIG1peGlu Zy4gTW9yZSBzcGVjaWZpY2FsbHkgZm9yIGF1ZGlvCm91dHB1dCB2b2ljZXM6CgotIEZvciBlYWNo IEhXVm9pY2VPdXQsIGZpbmQgdGhlIG51bWJlciBvZiBhY3RpdmUgU1dWb2ljZU91dCwgYW5kIHRo ZSBtaW5pbXVtIG51bWJlcgogIG9mICd0b3RhbF9od19zYW1wbGVzX21peGVkJyB0aGF0IGhhdmUg YWxyZWFkeSBiZWVuIHdyaXR0ZW4gdG8gdGhlIGJ1ZmZlci4gV2Ugd2lsbAogIGNhbGwgdGhpcyB2 YWx1ZSB0aGUgbnVtYmVyIG9mICdsaXZlJyBzYW1wbGVzIGluIHRoZSBzdGVyZW8gYnVmZmVyLgoK LSBpZiAnbGl2ZScgaXMgMCwgY2FsbCB0aGUgY2FsbGJhY2sgb2YgZWFjaCBhY3RpdmUgU1dWb2lj ZU91dCB0byBmaWxsIHRoZSBzdGVyZW8KICBidWZmZXIsIGlmIG5lZWRlZCwgdGhlbiBleGl0LgoK LSBvdGhlcndpc2UsIGNhbGwgdGhlICdydW5fb3V0JyBtZXRob2Qgb2YgdGhlIEhXVm9pY2VPdXQg b2JqZWN0LiBUaGlzIHdpbGwgY2hhbmdlCiAgdGhlIHZhbHVlIG9mICdycG9zJyBhbmQgcmV0dXJu IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBwbGF5ZWQuIFRoZW4gdGhlCiAgJ3RvdGFsX2h3X3NhbXBs ZXNfbWl4ZWQnIGZpZWxkIG9mIGFsbCBhY3RpdmUgU1dWb2ljZU91dHMgaXMgZGVjcmVtZW50ZWQg YnkKICAncGxheWVkJywgYW5kIHRoZSBjYWxsYmFjayBpcyBjYWxsZWQgdG8gcmUtZmlsbCB0aGUg c3RlcmVvIGJ1ZmZlci4KCkl0J3MgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgU1dWb2ljZU91 dCBjYWxsYmFjazoKCi0gdGFrZXMgYSAnZnJlZScgcGFyYW1ldGVyIHdoaWNoIGlzIHRoZSBudW1i ZXIgb2Ygc3RlcmVvIHNvdW5kIHNhbXBsZXMgdGhhdCBjYW4KICBiZSBzZW50IHRvIHRoZSBoYXJk d2FyZSBzdGVyZW8gYnVmZmVyIChiZWZvcmUgcmF0ZSBhZGp1c3RtZW50LCBpLmUuIG5vdCB0aGUg bnVtYmVyCiAgb2Ygc291bmQgc2FtcGxlcyBpbiB0aGUgU1dWb2ljZU91dCBlbXVsYXRlZCBoYXJk d2FyZSBzb3VuZCBidWZmZXIpLgoKLSBtdXN0IGNhbGwgQVVEX3dyaXRlKHN3LCBidWZmLCBjb3Vu dCksIHdoZXJlICdidWZmJyBwb2ludHMgdG8gZW11bGF0ZWQgc291bmQKICBzYW1wbGVzLCBhbmQg dGhlaXIgJ2NvdW50Jywgd2hpY2ggbXVzdCBiZSA8PSB0aGUgJ2ZyZWUnIHBhcmFtZXRlci4KCi0g dGhlIGltcGxlbWVudGF0aW9uIG9mIEFVRF93cml0ZSgpIHdpbGwgY2FsbCB0aGUgJ3dyaXRlJyBt ZXRob2Qgb2YgdGhlIHRhcmdldAogIEhXVm9pY2VPdXQsIHdoaWNoIGluIHR1cm5zIGNhbGxzIHRo ZSBmdW5jdGlvbiBhdWRpb19wY21fc3dfd3JpdGUoKSB3aGljaCBkb2VzCiAgc3RhbmRhcmQgcmF0 ZS92b2x1bWUgYWRqdXN0bWVudCBiZWZvcmUgbWl4aW5nIHRoZSBjb252ZXJzaW9uIGludG8gdGhl IHRhcmdldAogIHN0ZXJlbyBidWZmZXIuIEl0IGFsc28gaW5jcmVhc2VzIHRoZSAndG90YWxfaHdf c2FtcGxlc19taXhlZCcgdmFsdWUgb2YgdGhlCiAgU1dWb2ljZU91dC4KCi0gYXVkaW9fcGNtX3N3 X3dyaXRlKCkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHNvdW5kIHNhbXBsZSAqYnl0ZXMqIHRoYXQg aGF2ZQogIGJlZW4gbWl4ZWQgaW50byB0aGUgc3RlcmVvIGJ1ZmZlciwgYW5kIHNvIGRvZXMgQVVE X3dyaXRlKCkuCgpTbywgaW4gdGhlIGVuZCwgd2UgaGF2ZSB0aGUgcHNldWRvLWNvZGU6CgogICAg ZXZlcnkgc291bmQgdGltZXIgdGlja3M6CiAgICAgIGZvciBodyBpbiBsaXN0X0hXVm9pY2VPdXQ6 CiAgICAgICAgIGxpdmUgPSBNSU4oW3N3LnRvdGFsX2h3X3NhbXBsZXNfbWl4ZWQgZm9yIHN3IGlu IGh3Lmxpc3RfU1dWb2ljZU91dCBdKQogICAgICAgICBpZiBsaXZlID4gMDoKICAgICAgICAgICAg cGxheWVkID0gaHcucnVuX291dChsaXZlKQogICAgICAgICAgICBmb3Igc3cgaW4gaHcubGlzdF9T V1ZvaWNlT3V0OgogICAgICAgICAgICAgICAgc3cudG90YWxfaHdfc2FtcGxlc19taXhlZCAtPSBw bGF5ZWQKCiAgICAgICAgZm9yIHN3IGluIGh3Lmxpc3RfU1dWb2ljZU91dDoKICAgICAgICAgICAg ZnJlZSA9IGh3LnNhbXBsZXMgLSBzdy50b3RhbF9od19zYW1wbGVzX21peGVkCiAgICAgICAgICAg IGlmIGZyZWUgPiAwOgogICAgICAgICAgICAgICAgc3cuY2FsbGJhY2soc3csIGZyZWUpCgpTT1VO RCBSRUNPUkRJTkcgREVUQUlMUzoKPT09PT09PT09PT09PT09PT09PT09PT09CgpUaGluZ3MgYXJl IHNpbWlsYXIgYnV0IGluIHJldmVyc2Ugb3JkZXIuCg== --000e0cd47cd261fe9704667128ab Content-Type: text/plain; charset=US-ASCII; name="CHAR-DEVICES.TXT" Content-Disposition: attachment; filename="CHAR-DEVICES.TXT" Content-Transfer-Encoding: base64 X-Attachment-Id: f_fsz4ed5a1 UUVNVSBDSEFSQUNURVIgIkRFVklDRVMiIE1BTkFHRU1FTlQKCkkuIENoYXJEcml2ZXJTdGF0ZSBv YmplY3RzOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCk9uZSBvZiB0aGUgc3RyYW5nZXN0 IGFic3RyYWN0aW9uIGluIFFFTVUgaXMgdGhlICJDaGFyRHJpdmVyU3RhdGUiCihhYmJyZXZpYXRl ZCBoZXJlIGFzICJDUyIpLgoKVGhlIENTIGlzIGVzc2VudGlhbGx5IGFuIG9iamVjdCB1c2VkIHRv IG1vZGVsIGEgY2hhcmFjdGVyIHN0cmVhbSB0aGF0CmNhbiBiZSBjb25uZWN0ZWQgdG8gdGhpbmdz IGxpa2UgYSBob3N0IHNlcmlhbCBwb3J0LCBhIGhvc3QgbmV0d29yayBzb2NrZXQsCmFuIGVtdWxh dGVkIGRldmljZSwgZXRjLi4uCgpXaGF0J3MgcmVhbGx5IHVudXN1YWwgaXMgaXRzIGludGVyZmFj ZSB0aG91Z2gsIHdoaWNoIGNvbWVzIGZyb20gdGhlIGZhY3QKdGhhdCBRRU1VIGltcGxlbWVudHMg YSBiaWcgZXZlbnQgbG9vcCB3aXRoIG5vIGJsb2NraW5nIGkvbyBhbGxvd2VkLiBZb3UKY2FuIHNl ZSAicWVtdS1jaGFyLmgiIGZvciB0aGUgZnVsbCBpbnRlcmZhY2UsIGJ1dCBoZXJlIHdlIHdpbGwg b25seSBkZXNjcmliZQphIGZldyBpbXBvcnRhbnQgZnVuY3Rpb25zOgoKICAtIHFlbXVfY2hyX3dy aXRlKCkgaXMgdXNlZCB0byB0cnkgdG8gd3JpdGUgZGF0YSBpbnRvIGEgQ1Mgb2JqZWN0LiBOb3Rl IHRoYXQKICAgIHN1Y2Nlc3MgaXMgbm90IGd1YXJhbnRlZWQ6IHRoZSBmdW5jdGlvbiByZXR1cm5z IHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdAogICAgd2VyZSByZWFsbHkgd3JpdHRlbiAod2hpY2gg Y2FuIGJlIDApIGFuZCB0aGUgY2FsbGVyIG11c3QgZGVhbCB3aXRoIGl0LgogICAgVGhpcyBpcyB2 ZXJ5IHNpbWlsYXIgdG8gd3JpdGluZyB0byBhIG5vbi1ibG9ja2luZyBCU0Qgc29ja2V0IG9uIFVu aXguCgogICAgICAgaW50ICBxZW11X2Nocl9yZWFkKCBDaGFyRHJpdmVyU3RhdGUqICBjcywKICAg ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogICAgZGF0YSwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgZGF0YWxlbiApOwoKICAgIFRoaXMg ZnVuY3Rpb24gbWF5IHJldHVybiAtMSBpbiBjYXNlIG9mIGVycm9yLCBidXQgdGhpcyBkZXBlbmRz IGVudGlyZWx5CiAgICBvbiB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiAoc29tZSBvZiB0 aGVtIHdpbGwganVzdCByZXR1cm4gMCBpbnN0ZWFkKS4KICAgIEluIHByYWN0aWNlLCB0aGlzIG1l YW5zIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHJlbGlhYmx5IGRpZmZlcmVudGlhdGUgYmV0d2Vlbgog ICAgYSAiY29ubmVjdGlvbiByZXNldCBieSBwZWVyIiBhbmQgYW4gIm9wZXJhdGlvbiBpbiBwcm9n cmVzcyIgOi0oCgogICAgVGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgaW4gYWR2YW5jZSBob3cgbWFu eSBieXRlcyBhIGdpdmVuIENoYXJEcml2ZXJTdGF0ZQogICAgY2FuIGFjY2VwdCwgbm9yIHRvIGJl IG5vdGlmaWVkIHdoZW4gaXRzIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gaXMgcmVhZHkKICAg IHRvIGFjY2VwdCBkYXRhIGFnYWluLgoKCiAgLSBxZW11X2Nocl9hZGRfaGFuZGxlcigpIGlzIHVz ZWQgdG8gYWRkICJyZWFkIiBhbmQgImV2ZW50IiBoYW5kbGVycwogICAgdG8gYSBDUyBvYmplY3Qu IFdlIHdpbGwgaWdub3JlICJldmVudHMiIGhlcmUgYW5kIGZvY3VzIG9uIHRoZQogICAgInJlYWQi IHBhcnQuCgogICAgVGhpbmcgaXMsIHlvdSBjYW5ub3QgZGlyZWN0bHkgcmVhZCBmcm9tIGEgQ1Mg b2JqZWN0LiBJbnN0ZWFkLCB5b3UgcHJvdmlkZQogICAgdHdvIGZ1bmN0aW9ucyB0aGF0IHdpbGwg YmUgY2FsbGVkIHdoZW5ldmVyIHRoZSBvYmplY3QgaGFzIHNvbWV0aGluZyBmb3IKICAgIHlvdToK CiAgICAgICAgLSBhICdjYW5fcmVhZCcgZnVuY3Rpb24gdGhhdCBzaGFsbCByZXR1cm4gdGhlIG51 bWJlciBvZiBieXRlcwogICAgICAgICAgdGhhdCB5b3UgYXJlIHJlYWR5IHRvIGFjY2VwdCBmcm9t IHRoZSBDaGFyRHJpdmVyU3RhdGUuIEl0J3MKICAgICAgICAgIGludGVyZmFjZSBpczoKCiAgICAg ICAgICAgICB0eXBlZGVmIGludCAgSU9DYW5SV0hhbmRsZXIgKHZvaWQqICBvcGFxdWUpOwoKICAg ICAgICAtIGEgJ3JlYWQnIGZ1bmN0aW9uIHRoYXQgd2lsbCBzZW5kIHlvdSBieXRlcyBmcm9tIHRo ZSBDaGFyRHJpdmVyU3RhdGUKCiAgICAgICAgICAgICB0eXBlZGVmIHZvaWQgSU9SZWFkSGFuZGxl ciAgKHZvaWQqICAgICAgICAgICBvcGFxdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqICBkYXRhLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgZGF0YWxlbik7CgogICAgICAgICAg bm9ybWFsbHksIHRoZSB2YWx1ZSBvZiAnZGF0YWxlbicgY2Fubm90IGJlIGxhcmdlciB0aGFuIHRo ZSByZXN1bHQKICAgICAgICAgIG9mIGEgcHJldmlvdXMgJ2Nhbl9yZWFkJyBjYWxsLgoKICAgIEZv ciBib3RoIGNhbGxiYWNrcywgJ29wYXF1ZScgaXMgYSB2YWx1ZSB0aGF0IHlvdSBwYXNzIHRvIHRo ZSBmdW5jdGlvbgogICAgcWVtdV9jaHJfYWRkX2hhbmRsZXIoKSB3aGljaCBzaWduYXR1cmUgaXM6 CgogICAgICAgICB2b2lkIHFlbXVfY2hyX2FkZF9oYW5kbGVycyhDaGFyRHJpdmVyU3RhdGUgKnMs CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPQ2FuUldIYW5kbGVyICAqZmRf Y2FuX3JlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPUmVhZEhhbmRs ZXIgICAqZmRfcmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9FdmVu dEhhbmRsZXIgICpmZF9ldmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg dm9pZCAgICAgICAgICAgICpvcGFxdWUpOwoKICAtIHFlbXVfY2hyX29wZW4oKSBpcyB1c2VkIHRv IGNyZWF0ZSBhIG5ldyBDaGFyRHJpdmVyU3RhdGUgb2JqZWN0IGZyb20gYQogICAgZGVzY3JpcHRp dmUgc3RyaW5nLCBpdCdzIGludGVyZmFjZSBpczoKCiAgICAgICAgIENoYXJEcml2ZXJTdGF0ZSog IHFlbXVfY2hyX29wZW4oY29uc3QgY2hhciogIGZpbGVuYW1lKTsKCiAgICB0aGVyZSBhcmUgdmFy aW91cyBmb3JtYXRzIGZvciBhY2NlcHRhYmxlICdmaWxlbmFtZXMnLCBhbmQgdGhleSBjb3JyZXNw b25kCiAgICB0byB0aGUgcGFyYW1ldGVycyBvZiB0aGUgJy1zZXJpYWwnIFFFTVUgb3B0aW9uIGRl c2NyaWJlZCBoZXJlOgoKICAgICAgIGh0dHA6Ly93d3cubm9uZ251Lm9yZy9xZW11L3FlbXUtZG9j Lmh0bWwjU0VDMTAKCiAgICBGb3IgZXhhbXBsZToKCiAgICAgICAiL2Rldi88ZmlsZT4iIChMaW51 eCBhbmQgT1MgWCBvbmx5KToKICAgICAgICAgICAgY29ubmVjdCB0byBhIGhvc3QgY2hhcmFjdGVy IGRldmljZSBmaWxlIChlLmcuIC9kZXYvdHR5UzApCgogICAgICAgImZpbGU6PGZpbGVuYW1lPiI6 CiAgICAgICAgICAgIFdyaXRlIG91dHB1dCB0byBhIGdpdmVuIGZpbGUgKHdyaXRlIG9ubHkpCgog ICAgICAgInN0ZGlvIjoKICAgICAgICAgICAgU3RhbmRhcmQgaW5wdXQvb3V0cHV0CgogICAgICAg InVkcDpbPHJlbW90ZV9ob3N0Pl06PHJlbW90ZV9wb3J0PltAWzxzcmNfaXA+XTo8c3JjX3BvcnQ+ XSI6CiAgICAgICAgICAgIENvbm5lY3QgdG8gYSBVRFAgc29ja2V0IGZvciBib3RoIHJlYWQvd3Jp dGUuCgogICAgICAgInRjcDpbPGhvc3Q+XTo8cG9ydD5bLHNlcnZlcl1bLG5vd2FpdF1bLG5vZGVs YXldIgogICAgICAgICAgICBDb25uZWN0IHRvIGEgVENQIHNvY2tldCBlaXRoZXIgYXMgYSBjbGll bnQgb3IgYSBzZXJ2ZXIuCgogICAgICAgICAgICBUaGUgJ25vd2FpdCcgb3B0aW9uIGlzIHVzZWQg dG8gYXZvaWQgd2FpdGluZyBmb3IgYSBjbGllbnQKICAgICAgICAgICAgY29ubmVjdGlvbi4KCiAg ICAgICAgICAgIFRoZSAnbm9kZWxheScgaXMgdXNlZCB0byBkaXNhYmxlIHRoZSBUQ1AgTmFnbGUg YWxnb3JpdGhtIHRvCiAgICAgICAgICAgIGltcHJvdmUgdGhyb3VnaHB1dC4KCiAgICBmb3IgQW5k cm9pZCwgYSBmZXcgc3BlY2lhbCBuYW1lcyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGludGVybmFs CiAgICBpbXBsZW1lbnRhdGlvbiBhbmQgcmVkaXJlY3QgdG8gcHJvZ3JhbSBmdW5jdGlvbnM6Cgog ICAgICAgImFuZHJvaWQta21zZyI6CiAgICAgICAgICAgIEEgQ2hhckRyaXZlclN0YXRlIHRoYXQg aXMgdXNlZCB0byByZWNlaXZlIGtlcm5lbCBsb2cgbWVzc2FnZXMKICAgICAgICAgICAgZnJvbSB0 aGUgZW11bGF0ZWQgL2Rldi90dHlTMCBzZXJpYWwgcG9ydC4KCiAgICAgICAiYW5kcm9pZC1xZW11 ZCI6CiAgICAgICAgICAgIEEgQ2hhckRyaXZlclN0YXRlIHRoYXQgaXMgdXNlZCB0byBleGNoYW5n ZSBtZXNzYWdlcyBiZXR3ZWVuIHRoZQogICAgICAgICAgICBlbXVsYXRvciBwcm9ncmFtIGFuZCB0 aGUgInFlbXVkIiBtdWx0aXBsZXhpbmcgZGFlbW9uIHRoYXQgcnVucyBpbgogICAgICAgICAgICB0 aGUgZW11bGF0ZWQgc3lzdGVtLgoKICAgICAgICAgICAgVGhlICJxZW11ZCIgZGFlbW9uIGlzIHVz ZWQgdG8gYWxsb3cgb25lIG9yIG1vcmUgY2xpZW50cyBpbiB0aGUKICAgICAgICAgICAgc3lzdGVt IHRvIGNvbm5lY3QgdG8gdmFyaW91cyBzZXJ2aWNlcyBydW5uaW5nIGluIHRoZSBlbXVsYXRvcgog ICAgICAgICAgICBwcm9ncmFtLiBUaGlzIGlzIG1haW5seSB1c2VkIHRvIGJ5cGFzcyB0aGUga2Vy bmVsIGluIG9yZGVyIHRvCiAgICAgICAgICAgIGltcGxlbWVudCBjZXJ0YWluIGZlYXR1cmVzIHdp dGggZWFzZS4KCiAgICAgICAiYW5kcm9pZC1nc20iOgogICAgICAgICAgICBBIENoYXJEcml2ZXJT dGF0ZSB0aGF0IGlzIHVzZWQgdG8gY29ubmVjdCB0aGUgZW11bGF0ZWQgc3lzdGVtIHRvCiAgICAg ICAgICAgIGEgaG9zdCBtb2RlbSBkZXZpY2Ugd2l0aCB0aGUgLXJhZGlvIDxkZXZpY2U+IG9wdGlv bi4gT3RoZXJ3aXNlLAogICAgICAgICAgICB0aGUgc3lzdGVtIHVzZXMgcWVtdWQgdG8gY29ubmVj dCB0byB0aGUgZW11bGF0b3IncyBpbnRlcm5hbCBtb2RlbQogICAgICAgICAgICBlbXVsYXRpb24u CgogICAgICAgICJhbmRyb2lkLWdwcyI6CiAgICAgICAgICAgIEEgQ2hhckRyaXZlclN0YXRlIHRo YXQgaXMgdXNlZCB0byBjb25uZWN0IHRoZSBlbXVsYXRlZCBzeXN0ZW0gdG8gYQogICAgICAgICAg ICBob3N0IEdQUyBkZXZpY2Ugd2l0aCB0aGUgLWdwcyA8ZGV2aWNlPiBvcHRpb24uIE90aGVyd2lz ZSB0aGUKICAgICAgICAgICAgc3lzdGVtIHVzZXMgcWVtdWQgdG8gY29ubmVjdCB0byB0aGUgZW11 bGF0b3IncyBpbnRlcm5hbCBHUFMKICAgICAgICAgICAgZW11bGF0aW9uLgoKCklJLiBDaGFyRHJp dmVyU3RhdGUgdXNlcnM6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpBcyBkZXNjcmliZWQg YWJvdmUsIGEgQ2hhckRyaXZlclN0YXRlICJ1c2VyIiBpcyBhIHBpZWNlIG9mIGNvZGUgdGhhdCBj YW4gd3JpdGUKdG8gYSBDaGFyRHJpdmVyU3RhdGUgKGJ5IGNhbGxpbmcgcWVtdV9jaHJfd3JpdGUo KSBleHBsaWNpdGVseSkgYW5kIGNhbiBhbHNvCnJlYWQgZnJvbSBpdCBhZnRlciByZWdpc3Rlcmlu ZyBjYW5fcmVhZC9yZWFkIGhhbmRsZXJzIGZvciBpdCB0aHJvdWdoCnFlbXVfY2hyX2FkZF9oYW5k bGVycygpLgoKVHlwaWNhbCBleGFtcGxlcyBhcmUgdGhlIGZvbGxvd2luZzoKCiAgLSBUaGUgaGFy ZHdhcmUgc2VyaWFsIHBvcnQgZW11bGF0aW9uIChlLmcuIGh3L2dvbGRmaXNoX3R0eS5jKSB3aWxs IHJlYWQgZGF0YQogICAgZnJvbSB0aGUga2VybmVsIHRoZW4gc2VuZCBpdCB0byBhIENTLiBJdCBh bHNvIHVzZXMgYSBzbWFsbCBidWZmZXIgdGhhdCBpcwogICAgdXNlZCB0byByZWFkIGRhdGEgZnJv bSB0aGUgQ1MgYW5kIHNlbmQgaXQgYmFjayB0byB0aGUga2VybmVsLgoKICAtIFRoZSBBbmRyb2lk IGVtdWxhdGVkIG1vZGVtIGFsc28gdXNlcyBhIENTIHRvIHRhbGsgd2l0aCBpdHMgY2xpZW50LAog ICAgd2hpY2ggd2lsbCBpbiBtb3N0IGNhc2VzIGFuIGVtdWxhdGVkIHNlcmlhbCBwb3J0LgoKCklJ SS4gQ2hhckJ1ZmZlciBvYmplY3RzOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClRoZSBBbmRy b2lkIGVtdWxhdG9yIHByb3ZpZGVzIGFuIG9iamVjdCBjYWxsZWQgYSBDaGFyQnVmZmVyIHdoaWNo IGFjdHMgYXMKYSBDaGFyRHJpdmVyU3RhdGUgb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBhICp3cml0 ZSogYnVmZmVyIHRvIHNlbmQgZGF0YSB0byBhCmdpdmVuIENTIG9iamVjdCwgY2FsbGVkIHRoZSBl bmRwb2ludC4gWW91IGNhbiBjcmVhdGUgb25lIHdpdGg6CgogICAgI2luY2x1ZGUgImNoYXJwaXBl LmgiCiAgICBDaGFyRHJpdmVyU3RhdGUqICBxZW11X2Nocl9vcGVuX2J1ZmZlciggQ2hhckRyaXZl clN0YXRlKiAgZW5kcG9pbnQgKTsKClRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG5ldyBDUyBvYmpl Y3QgdGhhdCB3aWxsIGJ1ZmZlciBpbiB0aGUgaGVhcCBhbnkgZGF0YQp0aGF0IGlzIHNlbnQgdG8g aXQsIGJ1dCBjYW5ub3QgYmUgc2VudCB0byB0aGUgZW5kcG9pbnQgeWV0LiBPbiBlYWNoIGV2ZW50 IGxvb3AKaXRlcmF0aW9uLCB0aGUgQ2hhckJ1ZmZlciB3aWxsIHRyeSB0byBzZW5kIGRhdGEgdG8g dGhlIGVuZHBvaW50IHVudGlsbCBpdApkb2Vzbid0IGhhdmUgYW55IGRhdGEgbGVmdC4KClRoaXMg Y2FuIGJlIHVzZWZ1bCB0byBzaW1wbGlmeSBjZXJ0YWluIENTIHVzZXJzIHdobyBkb24ndCB3YW50 IHRvIG1haW50YWluCnRoZWlyIG93biBlbWl0IGJ1ZmZlci4gTm90ZSB0aGF0IHdyaXRpbmcgdG8g YSBDaGFyQnVmZmVyIGFsd2F5cyBzdWNjZWVkcy4KCk5vdGUgYWxzbyB0aGF0IGNhbGxpbmcgcWVt dV9jaHJfYWRkX2hhbmRsZXIoKSBvbiB0aGUgQ2hhckJ1ZmZlciB3aWxsIGRvIHRoZQpzYW1lIG9u IHRoZSBlbmRwb2ludC4gQW55IGVuZHBvaW50LWluaXRpYXRlZCBjYWxscyB0byBjYW5fcmVhZCgp L3JlYWQoKQpjYWxsYmFja3MgYXJlIHBhc3NlZCBkaXJlY3RseSB0byB5b3VyIGhhbmRsZXIgZnVu Y3Rpb25zLgoKCklWLiBDaGFyUGlwZSBvYmplY3RzOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0KClRo ZSBBbmRyb2lkIGVtdWxhdG9yIGFsc28gcHJvdmlkZXMgYSBjb252ZW5pZW50IGFic3RyYWN0aW9u IGNhbGxlZCBhICJjaGFycGlwZSIKdXNlZCB0byBjb25uZWN0IHR3byBDaGFyRHJpdmVyU3RhdGUg dXNlcnMgdG9nZXRoZXIuIEZvciBleGFtcGxlLCB0aGlzIGlzIHVzZWQKdG8gY29ubmVjdCBhIHNl cmlhbCBwb3J0IGVtdWxhdGlvbiAoaW4gaHcvZ29sZGZpc2hfdHR5LmMpIHRvIHRoZSBpbnRlcm5h bApHU00gbW9kZW0gZW11bGF0aW9uIChzZWUgdGVsZXBob255L21vZGVtX2RyaXZlci5jKS4KCkVz c2VudGlhbGx5LCBhICJjaGFycGlwZSIgaXMgYSBiaS1kaXJlY3Rpb25uYWwgY29tbXVuaWNhdGlv biBwaXBlIHdob3NlIHR3bwplbmRwb2ludHMgYXJlIGJvdGggQ1Mgb2JqZWN0cy4gWW91IGNhbGwg InFlbXVfY2hyX29wZW5fcGlwZSgpIiB0byBjcmVhdGUgdGhlCnBpcGUsIGFuZCB0aGlzIGZ1bmN0 aW9uIHdpbGwgcmV0dXJuIHRoZSB0d28gZW5kcG9pbnRzIHRvIHlvdToKCiAgICAjaW5jbHVkZSAi Y2hhcnBpcGUuaCIKICAgIGludCAgcWVtdV9jaHJfb3Blbl9waXBlKENoYXJEcml2ZXJTdGF0ZSog KnBmaXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJEcml2ZXJTdGF0ZSogKnBz ZWNvbmQpOwoKV2hlbiB5b3Ugd3JpdGUgdG8gb25lIGVuZCBvZiB0aGUgcGlwZSAod2l0aCBxZW11 X2Nocl93cml0ZSgpKSwgdGhlIGNoYXJwaXBlCndpbGwgdHJ5IHRvIHdyaXRlIGFzIG11Y2ggZGF0 YSBhcyBwb3NzaWJsZSB0byB0aGUgb3RoZXIgZW5kLiBBbnkgcmVtYWluaW5nIGRhdGEKaXMgc3Rv cmVkIGluIGEgaGVhcC1hbGxvY2F0ZWQgYnVmZmVyLgoKVGhlIGNoYXJwaXBlIHdpbGwgdHJ5IHRv IHJlLXNlbmQgdGhlIGJ1ZmZlcmVkIGRhdGEgb24gdGhlIG5leHQgZXZlbnQgbG9vcAppdGVyYXRp b24gYnkgY2FsbGluZyB0aGUgY2FuX3JlYWQvcmVhZCBmdW5jdGlvbnMgb2YgdGhlIGNvcnJlc3Bv bmRpbmcgdXNlciwKaWYgdGhlcmUgaXMgb25lLgoKTm90ZSB0aGF0IHRoZXJlIGlzIG5vIGxpbWl0 IG9uIHRoZSBhbW91bnQgb2YgZGF0YSBidWZmZXJlZCBpbiBhIGNoYXJwaXBlLAphbmQgd3JpdGlu ZyB0byBpdCBpcyBuZXZlciBibG9ja2luZy4gVGhpcyBzaW1wbGlmaWVzIENoYXJEcml2ZXJTdGF0 ZQp1c2VycyB3aG8gZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBidWZmZXJpbmcgaXNzdWVzLgo= --000e0cd47cd261fe9704667128ab Content-Type: text/plain; charset=US-ASCII; name="CPU-EMULATION.TXT" Content-Disposition: attachment; filename="CPU-EMULATION.TXT" Content-Transfer-Encoding: base64 X-Attachment-Id: f_fsz4ehpj2 SE9XIFRIRSBRRU1VIEVYRUNVVElPTiBFTkdJTkUgV09SS1M6Cj09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQoKVHJhbnNsYXRpbmcgQVJNIHRvIHg4NiBtYWNoaW5lIGNvZGU6Ci0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKUUVNVSBzdGFydHMgYnkgaXNvbGF0 aW5nIGNvZGUgImZyYWdtZW50cyIgZnJvbSB0aGUgZW11bGF0ZWQgbWFjaGluZSBjb2RlLgpFYWNo ICJmcmFnbWVudCIgY29ycmVzcG9uZHMgdG8gYSBzZXJpZXMgb2YgQVJNIGluc3RydWN0aW9ucyBl bmRpbmcgd2l0aCBhCmJyYW5jaCAoZS5nLiBqdW1wcywgY29uZGl0aW9uYWwgYnJhbmNoZXMsIHJl dHVybnMpLgoKRWFjaCBmcmFnbWVudCBpcyB0cmFuc2xhdGVkIGludG8gYSAidHJhbnNsYXRlZCBi bG9jayIgKGEuay5hLiBUQikgb2YgaG9zdAptYWNoaW5lIGNvZGUgKGUuZy4geDg2KS4gQWxsIFRC cyBhcmUgcHV0IGluIGEgY2FjaGUgYW5kIGVhY2ggdGltZSB0aGUKaW5zdHJ1Y3Rpb24gcG9pbnRl ciBjaGFuZ2VzIChpLmUuIGF0IHRoZSBlbmQgb2YgVEIgZXhlY3V0aW9uKSwgYSBoYXNoCnRhYmxl IGxvb2t1cCBpcyBwZXJmb3JtZWQgdG8gZmluZCB0aGUgbmV4dCBUQiB0byBleGVjdXRlLgoKSWYg bm9uZSBleGlzdHMsIGEgbmV3IG9uZSBpcyBnZW5lcmF0ZWQuIEFzIGEgc3BlY2lhbCBleGNlcHRp b24sIGl0IGlzCnNvbWV0aW1lcyBwb3NzaWJsZSB0byAnbGluaycgdGhlIGVuZCBvZiBhIGdpdmVu IFRCIHRvIHRoZSBzdGFydCBvZgphbm90aGVyIG9uZSBieSB0YWNraW5nIGFuIGV4cGxpY2l0IGp1 bXAgaW5zdHJ1Y3Rpb24uCgpOb3RlIHRoYXQgZHVlIHRvIGRpZmZlcmVuY2VzIGluIHRyYW5zbGF0 aW9ucyBvZiBtZW1vcnktcmVsYXRlZCBvcGVyYXRpb25zCihkZXNjcmliZWQgYmVsb3cgaW4gIk1N VSBlbXVsYXRpb24iKSwgdGhlcmUgYXJlIGFjdHVhbGx5IHR3byBUQiBjYWNoZXMgcGVyCmVtdWxh dGVkIENQVTogb25lIGZvciB0cmFuc2xhdGVkIGtlcm5lbCBjb2RlLCBhbmQgb25lIGZvciB0cmFu c2xhdGVkCnVzZXItc3BhY2UgY29kZS4KCldoZW4gYSBjYWNoZSBmaWxscyB1cCwgaXQgaXMgc2lt cGx5IHRvdGFsbHkgZW1wdGllZCBhbmQgdHJhbnNsYXRpb24gc3RhcnRzCmFnYWluLgoKQ1BVIHN0 YXRlIGlzIGtlcHQgaW4gYSBzaW5nbGUgZ2xvYmFsIHN0cnVjdHVyZSB3aGljaCB0aGUgZ2VuZXJh dGVkIGNvZGUKY2FuIGFjY2VzcyBkaXJlY3RseSAod2l0aCBkaXJlY3QgbWVtb3J5IGFkZHJlc3Np bmcpLgoKVGhlIGZpbGUgdGFyZ2V0LWFybS90cmFuc2xhdGUuYyBpcyBpbiBjaGFyZ2Ugb2YgdHJh bnNsYXRpbmcgdGhlIEFSTSBvcgpUaHVtYiBpbnN0cnVjdGlvbnMgc3RhcnRpbmcgYXQgdGhlIGN1 cnJlbnQgaW5zdHJ1Y3Rpb24gcG9pbnRlciBwb3NpdGlvbgppbnRvIGEgVEIuIFRoaXMgaXMgZG9u ZSBieSBkZWNvbXBvc2luZyBlYWNoIGluc3RydWN0aW9uIGludG8gYSBzZXJpZXMgb2YKbWljcm8t b3BlcmF0aW9ucyBzdXBwb3J0ZWQgYnkgdGhlIFRDRyBjb2RlIGdlbmVyYXRvci4KClRDRyBzdGFu ZHMgZm9yICJUaW55IENvZGUgR2VuZXJhdG9yIiBhbmQgaXMgc3BlY2lmaWMgdG8gUUVNVS4gSXQg c3VwcG9ydHMKc2V2ZXJhbCBob3N0IG1hY2hpbmUgY29kZSBiYWNrZW5kcy4gU2VlIHNvdXJjZSBm aWxlcyB1bmRlciB0Y2cvIGZvciBkZXRhaWxzLgoKCk1NVSBFbXVsYXRpb246Ci0tLS0tLS0tLS0t LS0tCgpUaGUgQVJNIE1lbW9yeSBNYW5hZ2VtZW50IFVuaXQgaXMgZW11bGF0ZWQgaW4gc29mdHdh cmUsIHNpbmNlIGl0IGlzIHNvCmRpZmZlcmVudCBmcm9tIHRoZSBvbmUgb24gdGhlIGhvc3QuIEVz c2VudGlhbGx5LCBhIHNpbmdsZSBBUk0gbWVtb3J5IGxvYWQvc3RvcmUKaW5zdHJ1Y3Rpb24gaXMg dHJhbnNsYXRlZCBpbnRvIGEgc2VyaWVzIG9mIGhvc3QgbWFjaGluZSBpbnN0cnVjdGlvbnMgdGhh dCB3aWxsCnRyYW5zbGF0ZSB2aXJ0dWFsIGFkZHJlc3NlcyBpbnRvIHBoeXNpY2FsIG9uZXMgYnkg cGVyZm9ybWluZyB0aGUgZm9sbG93aW5nOgoKLSBmaXJzdCBsb29rdXAgaW4gYSBnbG9iYWwgMjU2 LWVudHJpZXMgY2FjaGUgZm9yIHRoZSBjdXJyZW50IHBhZ2UgYW5kIHNlZSBpZgogIGEgY29ycmVz cG9uZGluZyB2YWx1ZSBpcyBhbHJlYWR5IHN0b3JlZCB0aGVyZS4gSWYgdGhpcyBpcyB0aGUgY2Fz ZSwgdXNlIGl0CiAgZGlyZWN0bHkuCgotIG90aGVyd2lzZSwgY2FsbCBhIHNwZWNpYWwgaGVscGVy IGZ1bmN0aW9uIHRoYXQgd2lsbCBpbXBsZW1lbnQgdGhlIGZ1bGwKICB0cmFuc2xhdGlvbiBhY2Nv cmRpbmcgdG8gdGhlIGVtdWxhdGVkIHN5c3RlbSdzIHN0YXRlLCBhbmQgbW9kaWZ5IHRoZQogIGNh Y2hlIGFjY29yZGluZ2x5LgoKVGhlIHBhZ2UgY2FjaGUgaXMgY2FsbGVkIHRoZSAiVExCIiBpbiB0 aGUgUUVNVSBzb3VyY2VzLgoKTm90ZSB0aGF0IHRoZXJlIGFyZSBhY3R1YWxseSB0d28gVExCczog b25lIGlzIHVzZWQgZm9yIGhvc3QgbWFjaGluZQppbnN0cnVjdGlvbnMgdGhhdCBjb3JyZXNwb25k IHRvIGtlcm5lbCBjb2RlLCBhbmQgdGhlIG90aGVyIGZvciBpbnN0cnVjdGlvbnMKdHJhbnNsYXRl ZCBmcm9tIHVzZXItbGV2ZWwgY29kZS4KClRoaXMgbWVhbnMgdGhhdCBhIG1lbW9yeSBsb2FkIGlu IHRoZSBrZXJuZWwgd2lsbCBub3QgYmUgdHJhbnNsYXRlZCBpbnRvIHRoZQpzYW1lIGluc3RydWN0 aW9ucyB0aGFuIHRoZSBzYW1lIGxvYWQgaW4gdXNlciBzcGFjZS4KCkVhY2ggVExCIGlzIGFsc28g aW1wbGVtZW50ZWQgYXMgYSBnbG9iYWwgcGVyLWVtdWxhdGVkLUNQVSBoYXNoLXRhYmxlLgpUaGUg dXNlci1sZXZlbCBUTEIgaXMgZmx1c2hlZCBvbiBlYWNoIHByb2Nlc3MgY29udGV4dCBzd2l0Y2gu CgpXaGVuIGluaXRpYWxpemluZyB0aGUgTU1VIGVtdWxhdGlvbiwgb25lIGNhbiBkZWZpbmUgc2V2 ZXJhbCB6b25lcyBvZiB0aGUKYWRkcmVzcyBzcGFjZSwgd2l0aCBkaWZmZXJlbnQgYWNjZXNzIHJp Z2h0cyAvIHR5cGUuIFRoaXMgaXMgaG93IG1lbW9yeS1tYXBwZWQKSS9PIGlzIGltcGxlbWVudGVk OiB0aGUgdmlydHVhbC0+cGh5c2ljYWwgY29udmVyc2lvbiBoZWxwZXIgZnVuY3Rpb24gZGV0ZWN0 cwp0aGF0IHlvdSdyZSB0cnlpbmcgdG8gcmVhZC93cml0ZSBmcm9tIGFuIEkvTyBtZW1vcnkgcmVn aW9uLCBhbmQgd2lsbCB0aGVuIGNhbGwKYSBjYWxsYmFjayBmdW5jdGlvbiBhc3NvY2lhdGVkIHRv IGl0LgoKCkhhcmR3YXJlIEVtdWxhdGlvbjoKLS0tLS0tLS0tLS0tLS0tLS0tLQoKTW9zdCBoYXJk d2FyZSBlbXVsYXRpb24gY29kZSBpbml0aWFsaXplcyBieSByZWdpc3RlcmluZyBpdHMgb3duIHJl Z2lvbiBvZgpJL08gbWVtb3J5LCBhcyB3ZWxsIGFzIHByb3ZpZGluZyByZWFkL3dyaXRlIGNhbGxi YWNrcyBmb3IgaXQuIFRoZW4gYWN0aW9ucwp3aWxsIGJlIGJhc2VkIG9uIHdoaWNoIG9mZnNldCBv ZiB0aGUgSS9PIG1lbW9yeSBpcyByZWFkIGZyb20vd3JpdHRlbiB0byBhbmQKZXZlbnR1YWxseSB3 aXRoIHdoaWNoIHZhbHVlLgoKWW91IGNhbiBoYXZlIGEgbG9vayBhdCBody9nb2xkZmlzaF90dHku YyB0aGF0IGltcGxlbWVudHMgYW4gZW11bGF0ZWQgc2VyaWFsCnBvcnQgZm9yIHRoZSBHb2xkZmlz aCBwbGF0Zm9ybS4KCiJHb2xkZmlzaCIgaXMgc2ltcGx5IHRoZSBuYW1lIG9mIHRoZSB2aXJ0dWFs IExpbnV4IHBsYXRmb3JtIHVzZWQgdG8gYnVpbGQKdGhlIEFuZHJvaWQtZW11bGF0b3Itc3BlY2lm aWMga2VybmVsIGltYWdlLiBUaGUgY29ycmVzcG9uZGluZyBzb3VyY2VzIGFyZQpsb2NhdGVkIGlu IHRoZSBvcmlnaW4vYW5kcm9pZC1nb2xkZmlzaC0yLjYuMjcgYnJhbmNoIG9mCmdpdDovL2FuZHJv aWQuZ2l0Lmtlcm5lbC5vcmcva2VybmVsL2NvbW1vbi5naXQuIFlvdSBjYW4gaGF2ZSBhIGxvb2sg YXQKYXJjaC9hcm0vbWFjaC1nb2xkZmlzaC8gZm9yIHRoZSBjb3JyZXNwb25kaW5nIGtlcm5lbCBk cml2ZXIgc291cmNlcy4KCg== --000e0cd47cd261fe9704667128ab--