🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: gmane.linux.kernel
10 messages
10 total messages Started by "Pascal Bellard" Tue, 13 Sep 2005 15:46
[i386 BOOT CODE] kernel bootable again
#306268
Author: "Pascal Bellard"
Date: Tue, 13 Sep 2005 15:46
642 lines
47618 bytes
--MIMEStream=_0+288847_91228134754_2059427134795
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 8bit

Hello,

Please find attached a patch to build i386/x86_64 kernel directly
bootable. It may be usefull for rescue floppies and installation
floppies.

System sector count is updated by tools/bluid.c at offset 495. The
system could be up to 32 Mb long.

-- support any drive geometry --

Disk geometry detection assumes that no error raises on first track.
First track is read sector by sector and the first error determinates
the sectors per track count. Next, reads are performed track by track.
Tested on floppy H2/S18 and harddisk H16/S63. Should work on
every exotic drive supporting Int13h CHS.

-- cmdline support --

If ram_size (offset 504) bit 13 is set, the kernel cmdline
is load from the sector following the kernel image.

If Ctrl, Alt, Shift or CapsLock is pressed the kernel cmdline is
prompted until Enter key. BackSpace is supported.

Regards,

-pascal

--MIMEStream=_0+288847_91228134754_2059427134795
Content-Type: application/DEFANGED-1; name="linux-2_6_13-bootblock_u.DEFANGED-1"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="linux-2_6_13-bootblock_u.DEFANGED-1"

ZGlmZiAtcHVyTiBsaW51eC0yLjYuMTMvYXJjaC9pMzg2L2Jvb3QvYm9vdHNlY3QuUyBsaW51eC0y
LjYuMTMtYm9vdGJsb2NrL2FyY2gvaTM4Ni9ib290L2Jvb3RzZWN0LlMKLS0tIGxpbnV4LTIuNi4x
My9hcmNoL2kzODYvYm9vdC9ib290c2VjdC5TCTIwMDUtMDktMTIgMTA6Mzc6NTIuMDAwMDAwMDAw
ICswMjAwCisrKyBsaW51eC0yLjYuMTMtYm9vdGJsb2NrL2FyY2gvaTM4Ni9ib290L2Jvb3RzZWN0
LlMJMjAwNS0wOS0xMiAxMDo0MDoxOS4wMDAwMDAwMDAgKzAyMDAKQEAgLTQsMjAgKzQsMzEgQEAK
ICAqCW1vZGlmaWVkIGJ5IERyZXcgRWNraGFyZHQKICAqCW1vZGlmaWVkIGJ5IEJydWNlIEV2YW5z
IChiZGUpCiAgKgltb2RpZmllZCBieSBDaHJpcyBOb2UgKE1heSAxOTk5KSAoYXM4NiAtPiBnYXMp
Ci0gKglndXR0ZWQgYnkgSC4gUGV0ZXIgQW52aW4gKEphbiAyMDAzKQorICoKKyAqICAgICAgcmV3
cml0dGVuIHRvIHN1cHBvcnQgdXAgdG8gMzJNYiBrZXJuZWwsIGNtZGxpbmUKKyAqICAgICAgYW5k
IGFueSBkaXNrIGdlb21ldHJ5IGJ5IDxwYXNjYWwuYmVsbGFyZEBhZHMtbHUuY29tPgogICoKICAq
IEJJRyBGQVQgTk9URTogV2UncmUgaW4gcmVhbCBtb2RlIHVzaW5nIDY0ayBzZWdtZW50cy4gIFRo
ZXJlZm9yZSBzZWdtZW50CiAgKiBhZGRyZXNzZXMgbXVzdCBiZSBtdWx0aXBsaWVkIGJ5IDE2IHRv
IG9idGFpbiB0aGVpciByZXNwZWN0aXZlIGxpbmVhcgogICogYWRkcmVzc2VzLiBUbyBhdm9pZCBj
b25mdXNpb24sIGxpbmVhciBhZGRyZXNzZXMgYXJlIHdyaXR0ZW4gdXNpbmcgbGVhZGluZwogICog
aGV4IHdoaWxlIHNlZ21lbnQgYWRkcmVzc2VzIGFyZSB3cml0dGVuIGFzIHNlZ21lbnQ6b2Zmc2V0
LgogICoKKyAqIGJkZSAtIHNob3VsZCBub3QganVtcCBibGluZGx5LCB0aGVyZSBtYXkgYmUgc3lz
dGVtcyB3aXRoIG9ubHkgNTEySyBsb3cKKyAqIG1lbW9yeS4gIFVzZSBpbnQgMHgxMiB0byBnZXQg
dGhlIHRvcCBvZiBtZW1vcnksIGV0Yy4KKyAqCisgKiBJdCB0aGVuIGxvYWRzICdzZXR1cCcgZGly
ZWN0bHkgYWZ0ZXIgaXRzZWxmICgweDkwMjAwKSwgYW5kIHRoZSBzeXN0ZW0KKyAqIGF0IDB4MTAw
MDAsIHVzaW5nIEJJT1MgaW50ZXJydXB0cy4gCisgKgorICogVGhlIGxvYWRlciBoYXMgYmVlbiBt
YWRlIGFzIHNpbXBsZSBhcyBwb3NzaWJsZSwgYW5kIGNvbnRpbnVvdXMKKyAqIHJlYWQgZXJyb3Jz
IHdpbGwgcmVzdWx0IGluIGEgdW5icmVha2FibGUgbG9vcC4gUmVib290IGJ5IGhhbmQuIEl0Cisg
KiBsb2FkcyBwcmV0dHkgZmFzdCBieSBnZXR0aW5nIHdob2xlIHRyYWNrcyBhdCBhIHRpbWUgd2hl
bmV2ZXIgcG9zc2libGUuCiAgKi8KIAogI2luY2x1ZGUgPGFzbS9ib290Lmg+CiAKIFNFVFVQU0VD
VFMJPSA0CQkJLyogZGVmYXVsdCBuciBvZiBzZXR1cC1zZWN0b3JzICovCiBCT09UU0VHCQk9IDB4
MDdDMAkJLyogb3JpZ2luYWwgYWRkcmVzcyBvZiBib290LXNlY3RvciAqLwotSU5JVFNFRwkJPSBE
RUZfSU5JVFNFRwkJLyogd2UgbW92ZSBib290IGhlcmUgLSBvdXQgb2YgdGhlIHdheSAqLworSU5J
VFNFRwkJPSBERUZfSU5JVFNFRwkJLyogd2UgbG9hZCBib290IGhlcmUgLSBvdXQgb2YgdGhlIHdh
eSAqLwogU0VUVVBTRUcJPSBERUZfU0VUVVBTRUcJCS8qIHNldHVwIHN0YXJ0cyBoZXJlICovCiBT
WVNTRUcJCT0gREVGX1NZU1NFRwkJLyogc3lzdGVtIGxvYWRlZCBhdCAweDEwMDAwICg2NTUzNikg
Ki8KIFNZU1NJWkUJCT0gREVGX1NZU1NJWkUJCS8qIHN5c3RlbSBzaXplOiAjIG9mIDE2LWJ5dGUg
Y2xpY2tzICovCkBAIC0yNSw2ICszNiwxMiBAQCBTWVNTSVpFCQk9IERFRl9TWVNTSVpFCQkvKiBz
eXN0ZW0gc2l6ZTogCiBST09UX0RFVgk9IDAgCQkJLyogUk9PVF9ERVYgaXMgbm93IHdyaXR0ZW4g
YnkgImJ1aWxkIiAqLwogU1dBUF9ERVYJPSAwCQkJLyogU1dBUF9ERVYgaXMgbm93IHdyaXR0ZW4g
YnkgImJ1aWxkIiAqLwogCisvKiBzb21lIGV4dHJhIGZlYXR1cmVzICovCisjZGVmaW5lIERJU1BM
QVlfS0VSTkVMX1ZFUlNJT04JCWFzIHNvb24gYXMgcG9zc2libGUKKyNkZWZpbmUJRURJVF9DTURM
SU5FCQkJb24gaG90a2V5CisjZGVmaW5lCUxPQURfQ01ETElORQkJCWFjY29yZGluZyB0byBiaXQg
cmFtc2l6ZS4xMworI2RlZmluZSBFWFRSQV9ERVZJQ0VTCQkJdG8gZmlsbCByb290X2RldmljZQor
CiAjaWZuZGVmIFNWR0FfTU9ERQogI2RlZmluZSBTVkdBX01PREUgQVNLX1ZHQQogI2VuZGlmCkBA
IC00Miw1NyArNTksNDcwIEBAIFNXQVBfREVWCT0gMAkJCS8qIFNXQVBfREVWIGlzIG5vdyB3cml0
dGUKIAogLmdsb2JhbCBfc3RhcnQKIF9zdGFydDoKKwljbGQJCQkJIyBhc3N1bWUgbm90aGluZwor
CW1vdncJJElOSVRTRUcsICVheAorCW1vdncJJWF4LCAlZXMJCSMgJWF4ID0gJWVzID0gSU5JVFNF
RworI2lmIE1PVkVfQk9PVFNFQ1RPUgorIyBGaXJzdCB0aGluZ3MgZmlyc3QuIE1vdmUgb3Vyc2Vs
ZiBmcm9tIDB4N0MwMCAtPiAweDkwMDAwIGFuZCBqdW1wIHRoZXJlLgorCW1vdncJJEJPT1RTRUcs
ICVjeAorCW1vdncJJWN4LCAlZHMJCSMgJWRzID0gQk9PVFNFRworCW1vdmIJJDEsICVjaAkJCSMg
JWN4ID0gMjU2CisJc3Vidwklc2ksICVzaQorCXN1YncJJWRpLCAlZGkKKwlyZXAKKwltb3Zzdwor
CWxqbXAJJElOSVRTRUcsICRnbworZ286CQorI2Vsc2UKKwl4b3J3CSVjeCwgJWN4CQkjICVjeCA9
IDAKKyNlbmRpZgogCi0JIyBOb3JtYWxpemUgdGhlIHN0YXJ0IGFkZHJlc3MKLQlqbXBsCSRCT09U
U0VHLCAkc3RhcnQyCisjIGJkZSAtIGNoYW5nZWQgMHhmZjAwIHRvIDB4NDAwMCB0byB1c2UgZGVi
dWdnZXIgYXQgMHg2NDAwIHVwIChiZGUpLiAgV2UKKyMgd291bGRuJ3QgaGF2ZSB0byB3b3JyeSBh
Ym91dCB0aGlzIGlmIHdlIGNoZWNrZWQgdGhlIHRvcCBvZiBtZW1vcnkuICBBbHNvCisjIG15IEJJ
T1MgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gcHV0IHRoZSB3aW5pIGRyaXZlIHRhYmxlcyBpbiBoaWdo
IG1lbW9yeQorIyBpbnN0ZWFkIG9mIGluIHRoZSB2ZWN0b3IgdGFibGUuICBUaGUgb2xkIHN0YWNr
IG1pZ2h0IGhhdmUgY2xvYmJlcmVkIHRoZQorIyBkcml2ZSB0YWJsZS4KKworCW1vdncJJDB4NDAw
MC0xMiwgJWRpCQkjIDB4NDAwMCBpcyBhbiBhcmJpdHJhcnkgdmFsdWUgPj0KKwkJCQkJIyBsZW5n
dGggb2YgYm9vdHNlY3QgKyBsZW5ndGggb2YKKwkJCQkJIyBzZXR1cCArIHJvb20gZm9yIHN0YWNr
OworCQkJCQkjIDEyIGlzIGRpc2sgcGFybSBzaXplLgorCQkJCQkjIGdkdCB3aWxsIGhlYXQgNDgg
bW9yZSBieXRlcy4KKwltb3Z3CSVheCwgJXNzCQkjICVheCBhbmQgJWVzIGFscmVhZHkgY29udGFp
biBJTklUU0VHCisJbW92dwklZGksICVzcAkJIyBwdXQgc3RhY2sgYXQgSU5JVFNFRzoweDQwMDAt
MTIuCisKKyMgTWFueSBCSU9TJ3MgZGVmYXVsdCBkaXNrIHBhcmFtZXRlciB0YWJsZXMgd2lsbCBu
b3QgcmVjb2duaXplCisjIG11bHRpLXNlY3RvciByZWFkcyBiZXlvbmQgdGhlIG1heGltdW0gc2Vj
dG9yIG51bWJlciBzcGVjaWZpZWQKKyMgaW4gdGhlIGRlZmF1bHQgZGlza2V0dGUgcGFyYW1ldGVy
IHRhYmxlcyAtIHRoaXMgbWF5IG1lYW4gNworIyBzZWN0b3JzIGluIHNvbWUgY2FzZXMuCisjCisj
IFNpbmNlIHNpbmdsZSBzZWN0b3IgcmVhZHMgYXJlIHNsb3cgYW5kIG91dCBvZiB0aGUgcXVlc3Rp
b24sCisjIHdlIG11c3QgdGFrZSBjYXJlIG9mIHRoaXMgYnkgY3JlYXRpbmcgbmV3IHBhcmFtZXRl
ciB0YWJsZXMKKyMgKGZvciB0aGUgZmlyc3QgZGlzaykgaW4gUkFNLiAgV2UgY2FuIHNldCB0aGUg
bWF4aW11bSBzZWN0b3IKKyMgY291bnQgdG8gMzYgLSB0aGUgbW9zdCB3ZSB3aWxsIGVuY291bnRl
ciBvbiBhbiBFRCAyLjg4LiAgCisjCisjIEhpZ2ggZG9lc24ndCBodXJ0LiAgTG93IGRvZXMuICBM
ZXQncyB1c2UgdGhlIG1heDogNjMKKyMKKyMgU2VnbWVudHMgYXJlIGFzIGZvbGxvd3M6ICVlcyA9
ICVzcyA9IElOSVRTRUcsCisjICVmcyBhbmQgJWdzIGFyZSB1bnVzZWQuCisKKwltb3Z3CSQweDc4
LCAlYngJCSMgJWRzOiVieCBpcyBwYXJhbWV0ZXIgdGFibGUgYWRkcmVzcworCW1vdncJJWN4LCAl
ZHMJCSMgJWRzID0gMAorCWxkc3cJKCVieCksICVzaQkJIyAlZHM6JXNpIGlzIHNvdXJjZQorCW1v
dmIJJDYsICVjbAkJCSMgY29weSAxMiBieXRlcworCXJlcAkJCQkjIGRvbid0IHdvcnJ5IGFib3V0
IGNsZAorCW1vdnN3CQkJCSMgYWxyZWFkeSBkb25lIGFib3ZlCisJbW92dwklY3gsICVkcwkJIyAl
ZHMgPSAwCisJbW92dwklc3AsICglYngpCQkjICVzcCA9IDB4NDAwMC0xMgorCW1vdncJJWVzLCAy
KCVieCkKKwlwdXNodwklZXMKKwlwb3B3CSVkcwkJCSMgbm93ICVkcyA9ICVlcyA9ICVzcyA9IElO
SVRTRUcKKwltb3ZiCSQ2MywgMHg0LTEyKCVkaSkJIyBwYXRjaCBzZWN0b3IgY291bnQsICVkaSA9
IDB4NDAwMAorCisJY2xpCisJY2J3CQkJCSMgJWF4ID0gMCA6IGdlb21ldHJ5IHVua25vd24geWV0
CisJeG9yYgklZGgsICVkaAkJIyBoZWFkIDAsIGN1cnJlbnQgZHJpdmUKKwlpbmN3CSVjeAkJCSMg
Y3lsaW5kZXIgMCwgc2VjdG9yIDEKKwltb3Z3CSVjeCwgJWRpCQkjIHJlYWQgMSBzZWN0b3IKKwlj
YWxsCXJlYWRfZmlyc3Rfc2VjdG9yCSMgcmVhZCBib290c2VjdG9yIGFnYWluIHRvIGhhdmUKKwkJ
CQkJIyBhY2Nlc3MgdG8gZGF0YSBzZWdtZW50CisKKyNpZm5kZWYJRElTUExBWV9LRVJORUxfVkVS
U0lPTgorCW1vdncJJG1zZzEsICVzaQorCWNhbGwJcHV0cworI2VuZGlmCiAKLXN0YXJ0MjoKLQlt
b3Z3CSVjcywgJWF4Ci0JbW92dwklYXgsICVkcwotCW1vdncJJWF4LCAlZXMKLQltb3Z3CSVheCwg
JXNzCi0JbW92dwkkMHg3YzAwLCAlc3AKLQlzdGkKLQljbGQKKyMgTG9hZCB0aGUgc2V0dXAtc2Vj
dG9ycyBkaXJlY3RseSBhZnRlciB0aGUgbW92ZWQgYm9vdGJsb2NrIChhdCAweDkwMjAwKS4KIAot
CW1vdncJJGJ1Z2dlcl9vZmZfbXNnLCAlc2kKKwltb3ZiCXNldHVwX3NlY3RzLCAlYWwKKyNpZmRl
ZiBDSEVDS19TRVRVUF9TSVpFCisJb3JiCSVhbCwgJWFsCisJam5lCXNldHVwX3NpemVfb2sKKwlt
b3ZiCSRTRVRVUFNFQ1RTLCAlYWwKK3NldHVwX3NpemVfb2s6CQorI2VuZGlmCisJY2J3CisJeGNo
ZwklYXgsICVkaQorCWNhbGwJcmVhZF9zZWN0b3JzCQkjIHJlYWQgc2V0dXAKKworI2lmZGVmCURJ
U1BMQVlfS0VSTkVMX1ZFUlNJT04KKyNkZWZpbmUga2VybmVsX3ZlcnNpb24JMHhFCisJbW92dwkk
MHgyMDAsJXNpCisJYWRkdwlrZXJuZWxfdmVyc2lvbiglc2kpLCVzaQkjIHN0YXJ0aW5nIHByb3Rv
Y29sIDIuMDAsIEtlcm5lbCAxLjMuNzMKKwljYWxsCXB1dHMJCQkjIHNob3cgd2hpY2gga2VybmVs
IHdlIGFyZSBsb2FkaW5nCisjZW5kaWYKIAotbXNnX2xvb3A6Ci0JbG9kc2IKLQlhbmRiCSVhbCwg
JWFsCi0JanoJZGllCi0JbW92YgkkMHhlLCAlYWgKLQltb3Z3CSQ3LCAlYngKLQlpbnQJJDB4MTAK
LQlqbXAJbXNnX2xvb3AKKyMgVGhpcyByb3V0aW5lIGxvYWRzIHRoZSBzeXN0ZW0gYXQgYWRkcmVz
cyBTWVNTRUcsIG1ha2luZyBzdXJlCisjIG5vIDY0a0IgYm91bmRhcmllcyBhcmUgY3Jvc3NlZC4g
V2UgdHJ5IHRvIGxvYWQgaXQgYXMgZmFzdCBhcworIyBwb3NzaWJsZSwgbG9hZGluZyB3aG9sZSB0
cmFja3Mgd2hlbmV2ZXIgd2UgY2FuLgorCisjaWZkZWYgX19CSUdfS0VSTkVMX18KK3R5cGVfb2Zf
bG9hZGVyCT0JNTI4CisJbW92dwkkMjQsICVjeAkJIyBhbGxvY2F0ZSA0OCBieXRlcyBpbiBzdGFj
aworaW5pdF9nZHQ6CisJcHVzaAkkMAkJCSMgICBpbml0aWFsaXplZCB3aXRoIDAKKwlsb29wCWlu
aXRfZ2R0CisJbW92dwklc3AsICVzaQkJIyBmb3IgYm9vdHNlY3RfZ2R0CisJbW92dwkkMHg5MzAw
KyhTWVNTRUcvNDA5NiksICVheAkjIHNvdXJjZSA9IFNZU1NFRworCWN3ZAorCW1vdncJJWF4LCAy
MCglc2kpCQkjIGJvb3RzZWN0X3NyY19iYXNlKzIKKwltb3ZiCSQweDEwLTEsICVhbAkJIyBkZXN0
aW5hdGlvbiA9IDB4MTAwMDAwCisJbW92dwklYXgsIDI4KCVzaSkJCSMgYm9vdHNlY3RfZHN0X2Jh
c2UrMgorCW1vdncJJWR4LCAxNiglc2kpCQkjIGJvb3RzZWN0X3NyYyA9IDY0S2IKKwltb3Z3CSVk
eCwgMjQoJXNpKQkJIyBib290c2VjdF9kc3QgPSA2NEtiCisJbW92YgklZGwsIHR5cGVfb2ZfbG9h
ZGVyCSMgbG9hZGVyIHR5cGUgPSAweEZGCitzeXNscDoKKwltb3Z3CSRTWVNTRUcsICVheAorCW1v
dncJJWF4LCAlZXMKKwltb3Z3CSQxMjgsJWRpCQkjIDY0S2IgaW4gc2VjdG9ycworCXN1YncJJWRp
LCBzeXNfc2VjdHMKKwlwdXNoZgorCWpuYwlub3RfbGFzdAorCWFkZHcJc3lzX3NlY3RzLCAlZGkK
K25vdF9sYXN0OgorCWNhbGwJcmVhZF9zZWN0b3JzCisJaW5jdwkyOCglc2kpCQkJIyBib290c2Vj
dF9kc3RfYmFzZSsyCisJbW92dwkkMHg4MDAwLCAlY3gJCSMgZnVsbCA2NEsKKwltb3ZiCSQweDg3
LCAlYWgKKwlwdXNoCSVzcworCXBvcAklZXMJCQkjIGdkdCBpbiBlczpzaQorCWludAkkMHgxNQor
CXBvcGYKKwlqYQlzeXNscAorI2Vsc2UKKwltb3Z3CSRTWVNTRUcsICVheAorCW1vdncJJWF4LCAl
ZXMKK3N5c2xwOgorCW1vdncJJDEyOCozMiwlYXgJCSMgNjRLYiBpbiBwYXJhZ3JhcGhzCisJc3Vi
dwklYXgsIHN5c3NpemUKKwlwdXNoZgorCWpuYwlub3RfbGFzdAorCWFkZHcJc3lzc2l6ZSwgJWF4
Citub3RfbGFzdDoKKwltb3ZiCSQ1LCAlY2wJCQkjIHBhcmFncmFwaHMgLT4gc2VjdG9ycworCXNo
cncJJWNsLCAlYXgKKwl4Y2hnCSVheCwgJWRpCisJY2FsbAlyZWFkX3NlY3RvcnMKKwlwb3BmCisJ
amEJc3lzbHAKKyNlbmRpZgogCi1kaWU6Ci0JIyBBbGxvdyB0aGUgdXNlciB0byBwcmVzcyBhIGtl
eSwgdGhlbiByZWJvb3QKLQl4b3J3CSVheCwgJWF4Ci0JaW50CSQweDE2Ci0JaW50CSQweDE5Cisj
IEFmdGVyIHRoYXQgd2UgY2hlY2sgd2hpY2ggcm9vdC1kZXZpY2UgdG8gdXNlLiBJZiB0aGUgZGV2
aWNlIGlzCisjIGRlZmluZWQgKCE9IDApLCBub3RoaW5nIGlzIGRvbmUgYW5kIHRoZSBnaXZlbiBk
ZXZpY2UgaXMgdXNlZC4KKyMgT3RoZXJ3aXNlLCBvbmUgb2YgL2Rldi9mZDBIMjg4MCAoMiwzMikg
b3IgL2Rldi9QUzAgKDIsMjgpIG9yIC9kZXYvYXQwICgyLDgpCisjIGRlcGVuZGluZyBvbiB0aGUg
bnVtYmVyIG9mIHNlY3RvcnMgd2UgcHJldGVuZCB0byBrbm93IHdlIGhhdmUuCisKKworCW1vdncJ
cm9vdF9kZXYsICVheAorCW9ydwklYXgsICVheAorCWpueglyb290X2RlZmluZWQKKworCW1vdncJ
JGZsb3BweV90YWJsZSwlc2kKK3NjYW5fZmxvcHB5X3RhYmxlOgorCWxvZHN3CisJY21wYglsaW1p
dHMsICVhaAorCWplCXNldF9yb290CisJam5vCXNjYW5fZmxvcHB5X3RhYmxlCitzZXRfcm9vdDoK
Kwltb3ZiCSQyLCAlYWgKKwlhZGRiCSVkbCwgJWFsCQkjIGFkZCBjdXJyZW50IChmbG9wcHkpIGRy
aXZlCisJbW92dwklYXgsIHJvb3RfZGV2Cityb290X2RlZmluZWQ6CisKKyNpZiBkZWZpbmVkKExP
QURfQ01ETElORSkgfHwgZGVmaW5lZChFRElUX0NNRExJTkUpCisjZGVmaW5lIEJVRkZFUgkweDdG
MDAKKwltb3Z3CSRCVUZGRVIsICVzaQorCW1vdncJJXNpLCAoJXNpKQkJIyBkZWZhdWx0IDogbm8g
Y21kbGluZQorI2VuZGlmCiAKLQkjIGludCAweDE5IHNob3VsZCBuZXZlciByZXR1cm4uICBJbiBj
YXNlIGl0IGRvZXMgYW55d2F5LAotCSMgaW52b2tlIHRoZSBCSU9TIHJlc2V0IGNvZGUuLi4KLQls
am1wCSQweGYwMDAsJDB4ZmZmMAorI2lmZGVmCUxPQURfQ01ETElORQorCXRlc3RiCSQweDIwLHJh
bV9zaXplKzEJIyBiaXQgMTEgdG8gMTMgd2hlcmUgdW51c2VkCisJCQkJCSMgbm93IGJpdCAxMyBt
ZWFuczogbG9hZCBjbWRsaW5lCisJanoJbm9jbWQKKwltb3Z3CSRCVUZGRVIvMTYrSU5JVFNFRywg
JWF4CisJbW92dwklYXgsICVlcworCW1vdncJJDEsICVkaQkJCSMgY21kbGluZSA9IDUxMiBieXRl
cyBtYXgKKwljYWxsCXJlYWRfc2VjdG9ycworbm9jbWQ6CisjZW5kaWYKIAorI2RlZmluZSBSU0hG
VCAgIDB4MDEKKyNkZWZpbmUgTFNIRlQgICAweDAyCisjZGVmaW5lIENUUkwgICAgMHgwNAorI2Rl
ZmluZSBBTFQgICAgIDB4MDgKKyNkZWZpbmUgU0NSTENLICAweDEwCisjZGVmaW5lIE5VTUxDSyAg
MHgyMAorI2RlZmluZSBDQVBTTENLIDB4NDAKKyNkZWZpbmUgSU5TRVJUICAweDgwCisKKyNpZmRl
ZglFRElUX0NNRExJTkUKKyMgVGhlIGNtZGxpbmUgY2FuIGJlIGVudGVyZWQgYW5kIG1vZGlmZWQg
b24gaG90IGtleS4KKyMgT25seSBjaGFyYWN0ZXJzIGJlZm9yZSB0aGUgY3Vyc29yIGFyZSBwYXNz
ZWQgdG8gdGhlIGtlcm5lbC4KKwltb3ZiCSQyLCAlYWgJCQkjIGdldCBrZXlib2FyZCBzdGF0dXMK
KwlpbnQJJDB4MTYKKwl0ZXN0YgkkUlNIRlR8TFNIRlR8Q1RSTHxBTFR8Q0FQU0xDSywgJWFsCisJ
anoJbm9jbWRsaW5lCisJcHVzaHcJJXNpCisJY2FsbAlwdXRzCQkJIyBzZXQgJWFoIGFuZCAlYngK
K2NtZGxwOgorIyBpZiAxCisJbW92YgkkMzIsICVhbAkJIyBjbGVhciBlbmQgb2YgbGluZQorCWlu
dAkkMHgxMAkJCSMgIHdpdGggU3BhY2UKKwltb3ZiCSQ4LCAlYWwJCQkjICAgYW5kIEJhY2tTcGFj
ZQorCWludAkkMHgxMAorIyBlbmRpZgorCWRlY3cJJXNpCitjbWRnZXQ6CisJY2J3CQkJCSMgJWFo
ID0gMCwgZ2V0IGtleWJvYXJkIGNoYXJhY3RlcgorCWludAkkMHgxNgorCWNtcGIJJDgsICVhbAkJ
CSMgQmFja1NwYWNlID8KKwlqZQljbWRicworCWNidworCW1vdncJJWF4LCAoJXNpKQkJIyBzdG9y
ZSBlbmQgb2Ygc3RyaW5nIHRvbworCWluY3cJJXNpCisJaW5jdwklc2kKK2NtZGJzOgorCWNtcHcJ
JEJVRkZFUiwgJXNpCQkjIGxvd2VyIGxpbWl0IGlzIGNoZWNrZWQKKwlqZQljbWRnZXQJCQkjICAg
YnV0IHVwcGVyIGxpbWl0IG5vdAorCWNhbGwJcHV0YworCWNtcGIJJDEzLCAlYWwJCSMgRW50ZXIg
PworCWpuZQljbWRscAorCXBvcHcJJXNpCitub2NtZGxpbmU6CisjZW5kaWYKIAotYnVnZ2VyX29m
Zl9tc2c6Ci0JLmFzY2lpCSJEaXJlY3QgYm9vdGluZyBmcm9tIGZsb3BweSBpcyBubyBsb25nZXIg
c3VwcG9ydGVkLlxyXG4iCi0JLmFzY2lpCSJQbGVhc2UgdXNlIGEgYm9vdCBsb2FkZXIgcHJvZ3Jh
bSBpbnN0ZWFkLlxyXG4iCi0JLmFzY2lpCSJcbiIKLQkuYXNjaWkJIlJlbW92ZSBkaXNrIGFuZCBw
cmVzcyBhbnkga2V5IHRvIHJlYm9vdCAuIC4gLlxyXG4iCi0JLmJ5dGUJMAorI2lmIGRlZmluZWQo
TE9BRF9DTURMSU5FKSB8fCBkZWZpbmVkKEVESVRfQ01ETElORSkKKyNpZiAxCitjbWRfbGluZV9t
YWdpYwk9CTB4MjAKK2NtZF9saW5lX29mZnNldAk9CTB4MjIKKwltb3Z3CSQweEEzM0YsIGNtZF9s
aW5lX21hZ2ljCisJbW92dwklc2ksIGNtZF9saW5lX29mZnNldAorI2Vsc2UKKyMgcHJvdG9jb2wg
Pj0gMi4wMiwgc3RhcnRpbmcgS2VybmVsIDIuNC4wLXRlc3QzLXByZTMKK2NtZF9saW5lX3B0cgk9
CTB4MjI4CisJbW92engJJXNpLCAlZWF4CisJYWRkbAkkSU5JVFNFRyoxNiwgJWVheAorCW1vdmwJ
JWVheCwgY21kX2xpbmVfcHRyCisjZW5kaWYKK2VtcHR5Y21kbGluZToKKyNlbmRpZgorCQorIyBU
aGlzIHByb2NlZHVyZSB0dXJucyBvZmYgdGhlIGZsb3BweSBkcml2ZSBtb3Rvciwgc28KKyMgdGhh
dCB3ZSBlbnRlciB0aGUga2VybmVsIGluIGEga25vd24gc3RhdGUsIGFuZAorIyBkb24ndCBoYXZl
IHRvIHdvcnJ5IGFib3V0IGl0IGxhdGVyLgorCisjaWYgMQora2lsbF9tb3RvcjoKKwl4b3J3CSVh
eCwgJWF4CQkjIHJlc2V0IEZEQworCWludAkkMHgxMworI2Vsc2UKK2tpbGxfbW90b3I6CisJbW92
dwkkMHgzZjIsICVkeAorCXhvcmIJJWFsLCAlYWwKKwlvdXRiCSVhbCwgJWR4CisjZW5kaWYKIAor
CWNhbGwJcHJpbnRfbmwKIAotCSMgS2VybmVsIGF0dHJpYnV0ZXM7IHVzZWQgYnkgc2V0dXAKKyMg
QWZ0ZXIgdGhhdCAoZXZlcnl0aGluZyBsb2FkZWQpLCB3ZSBqdW1wIHRvIHRoZSBzZXR1cC1yb3V0
aW5lCisjIGxvYWRlZCBkaXJlY3RseSBhZnRlciB0aGUgYm9vdGJsb2NrOgorIyBTZWdtZW50cyBh
cmUgYXMgZm9sbG93czogJWRzID0gJXNzID0gSU5JVFNFRworCisJbGptcAkkU0VUVVBTRUcsICQw
CisKKyMgcmVhZF9zZWN0b3JzIHJlYWRzICVkaSBzZWN0b3JzIGludG8gJWVzOjAgYnVmZmVyLgor
IyAlZXM6MCBpcyB1cGRhdGVkIHRvIHRoZSBuZXh0IG1lbW9yeSBsb2NhdGlvbi4KKyMgRmlyc3Qs
IHNlY3RvcnMgYXJlIHJlYWQgc2VjdG9yIGJ5IHNlY3RvciB1bnRpbAorIyBzZWN0b3IgcGVyIHRy
YWNrIGNvdW50IGlzIGtub3duLiBUaGVuIHRoZXkgYXJlCisjIHJlYWQgdHJhY2sgYnkgdHJhY2su
CisjIEFzc3VtZSBubyBlcnJvciBvbiBmaXJzdCB0cmFjay4KKworI2RlZmluZSBUUkFDS19CWV9U
UkFDSwlsb2FkIGFzIGZhc3QgYXMgcG9zc2libGUgIQorI2RlZmluZSBTSE9XX1JFR1MJc2hvdyBp
bnQxMyBzdGF0dXMgJiBwYXJhbWV0ZXJzCisKK2NoZWNrX2xpbWl0czoKKyAgICAgICAgY21wYiAg
ICAlYWwsICVjbAkJIyBtYXggc2VjdG9yIGtub3duID8KKyAgICAgICAgamEJbmV4dF9oZWFkCQkj
ICAgbm8gLT4gc3RvcmUgaXQKKyAgICAgICAgY21wYiAgICAlYWgsICVkaAkJIyBtYXggaGVhZCBr
bm93biA/CisgICAgICAgIGphCW5leHRfdHJhY2sJCSMgICBubyAtPiBzdG9yZSBpdAorCXB1c2hh
CQkJCSMgc2F2ZSBjb250ZXh0CisjaWZkZWYgU0hPV19SRUdTCisJcHVzaHcJJWVzCQkJIyBwcmlu
dCAlZXMgKG5hbWVkIEVYKQorCXB1c2h3CSVkeAkJCSMgcHJpbnQgJWR4CisJcHVzaHcJJWN4CQkJ
IyBwcmludCAlY3gKKwl4b3J3CSVjeCwgJWN4CisJcHVzaHcJJWN4CQkJIyBwcmludCAlYngKKyMg
aWZkZWYgVFJBQ0tfQllfVFJBQ0sKKwltb3ZiCSQyLCAlYmgKKyMgZW5kaWYKKwlwdXNodwklYngJ
CQkjIHByaW50ICVheAorCW1vdmIJJDYsJWNsCisJam1wCXByaW50X2FsbAkJIyBwcmludCAlYnAg
KHN0YXR1cykKK3ByaW50X2xvb3A6CisJbW92YgkkMHg2ICsgJ0EnIC0gMSwgJWFsCisJc3ViYgkl
Y2wsICVhbAorCW1vdncJJHJlZ3MsICVzaQkJIyBjYWxsZXIgJXNpIGlzIHNhdmVkCisJY2FsbAlw
dXRjcwkJCSMgcHV0YyglYWwpICsgcHV0cyglc2kpCisjIGl0IHdpbGwgcHJpbnQgb3V0IGFsbCBv
ZiB0aGUgcmVnaXN0ZXJzLgorCXBvcHcJJWJwCQkJIyBsb2FkIHdvcmQgaW50byAlYnAKK3ByaW50
X2FsbDoKKwlwdXNodwklY3gJCQkjIHNhdmUgY291bnQgcmVtYWluaW5nCisJbW92YgkkNCwgJWNs
CQkJIyA0IGhleCBkaWdpdHMKK3ByaW50X2RpZ2l0OgorCXJvbHcJJDQsICVicAkJCSMgcm90YXRl
IHRvIHVzZSBsb3cgNCBiaXRzCisJbW92YgkkMHgwZiwgJWFsCisJYW5kdwklYnAsICVheAkJIyAl
YWwgPSBtYXNrIGZvciBueWJibGUKKwlhZGRiCSQweDkwLCAlYWwJCSMgY29udmVydCAlYWwgdG8g
YXNjaWkgaGV4CisJZGFhCQkJCSMgaW4gb25seSBmb3VyIGluc3RydWN0aW9ucyEKKwlhZGNiCSQw
eDQwLCAlYWwKKwlkYWEKKwljYWxsCXB1dGMJCQkjIHNldCAlYWggYW5kICVieAorCWxvb3AJcHJp
bnRfZGlnaXQKKwltb3ZiCSQweDIwLCAlYWwJCSMgU1BBQ0UKKwlpbnQJJDB4MTAKKwlwb3B3CSVj
eAorCWxvb3AJcHJpbnRfbG9vcAorCXhjaGcJJWF4LCAlY3gJCSMgJWFoID0gMAorI2Vsc2UKKwlj
YncJCQkJIyAlYWggPSAwCisjZW5kaWYKKyAgICAgICAgaW50ICAgICAkMHgxMwkJCSMgcmVzZXQg
Y29udHJvbGVyCisJcG9wYQkJCQkjIHJlc3RvcmUgY29udGV4dAorcmVhZF9zZWN0b3JzbHA6City
ZWFkX2ZpcnN0X3NlY3RvcjoKKyAgICAgICAgcHVzaHcgICAlZGkJCQkjIHNlY3RvciBjb3VudAor
ICAgICAgICBwdXNodyAgICVheAkJCSMgbGltaXRzCisgICAgICAgIHB1c2h3ICAgJWR4CisgICAg
ICAgIHB1c2h3ICAgJWN4CisJeG9ydwklYngsICVieAorI2lmZGVmIFRSQUNLX0JZX1RSQUNLCisJ
c3ViYgklY2wsICVhbAkJIyBzZWN0b3JzIHJlbWFpbmluZyBpbiB0cmFjaworCWphCXRvbGFzdHNl
Y3QKKwltb3ZiCSQxLCAlYWwJCQkjIDEgc2VjdG9yIG1pbmkKK3RvbGFzdHNlY3Q6CisJY2J3CisJ
Y21wdwklZGksICVheAorCWpiCW1vcmUxdHJrCisJbW92dwklZGksICVheAkJIyBzZWN0b3JzIHRv
IHJlYWQKK21vcmUxdHJrOgorCXB1c2gJJWF4CisJbW92YgkkMiwgJWFoCQkJIyBjbWQ6IHJlYWQg
Y2hzCisjZWxzZQorICAgICAgICBtb3Z3ICAgICQweDIwMSwgJWF4CQkjIHNlY3RvciBieSBzZWN0
b3IKKwlwdXNoCSVheAorI2VuZGlmCisgICAgICAgIGludCAgICAgJDB4MTMKKwl4Y2hnCSVheCwg
JWJwCQkjIHN0YXR1cworICAgICAgICBwb3B3ICAgICVieAkJCSMgJWF4IAorICAgICAgICBwb3B3
ICAgICVjeAorICAgICAgICBwb3B3ICAgICVkeAorICAgICAgICBwb3B3ICAgICVheAkJCSMgbGlt
aXRzCisgICAgICAgIHBvcHcgICAgJWRpCQkJIyBzZWN0b3IgY291bnQKKwlqYwljaGVja19saW1p
dHMKK25leHRfc2VjdG9yOgorI2lmZGVmIFRSQUNLX0JZX1RSQUNLCisJc3VidwklYngsJWRpCQkJ
IyB1cGRhdGUgc2VjdG9yIGNvdW50ZXIKKwlhZGR3CSVieCwlY3gJCQkjIG5leHQgc2VjdG9yCisJ
c2hsdwkkNSwlYngJCQkjIHNlY3RvcnMgLT4gcGFyYWdyYWdocworCW1vdncJJWVzLCAlYnAKKwlh
ZGR3CSVieCwgJWJwCisjZWxzZQorCWRlY3cJJWRpCQkJIyB1cGRhdGUgc2VjdG9yIGNvdW50ZXIK
KwlpbmN3CSVjeAkJCSMgbmV4dCBzZWN0b3IKKwltb3Z3CSVlcywgJWJwCisJYWRkdwkkMzIsICVi
cAkJIyBzZWN0b3Igc2l6ZSBpbiBwYXJhZ3JhZ2hzCisjZW5kaWYKKwltb3Z3CSVicCwgJWVzCQkj
IG5leHQgbG9jYXRpb24KKyAgICAgICAgY21wYiAgICAlYWwsJWNsCQkJIyByZWFjaCBzZWN0b3Ig
bGltaXQgPworICAgICAgICBqbmUgICAgIGJkZW5kbHAKK25leHRfaGVhZDoKKyAgICAgICAgbW92
YiAgICAlY2wsJWFsCisgICAgICAgIGluY2IgICAgJWRoCQkJIyBuZXh0IGhlYWQKKyAgICAgICAg
bW92YiAgICAkMSwlY2wJCQkjIGZpcnN0IHNlY3RvcgorICAgICAgICBjbXBiICAgICVhaCwlZGgJ
CQkjIHJlYWNoIGhlYWQgbGltaXQgPworICAgICAgICBqbmUgICAgIGJkZW5kbHAKK25leHRfdHJh
Y2s6CisgICAgICAgIG1vdmIgICAgJWRoLCVhaAorICAgICAgICBtb3ZiICAgICQwLCVkaAkJCSMg
Zmlyc3QgaGVhZAorIyBOT1RFIDogc3VwcG9ydCAyNTYgY3lsaW5kZXJzIG1heAorICAgICAgICBp
bmNiICAgICVjaAkJCSMgbmV4dCBjeWxpbmRlcgorYmRlbmRscDoKK2N1cmRyaXZlID0JX3N0YXJ0
CitjdXJkeAk9CV9zdGFydAorY3VyY3gJPQlfc3RhcnQrMgorbGltaXRzCT0JX3N0YXJ0KzQKKwlt
b3Z3CSVkeCwgY3VyZHgJCSMgc2F2ZSBkaXNrIHN0YXRlCisJbW92dwklY3gsIGN1cmN4CisJbW92
dwklYXgsIGxpbWl0cworcmVhZF9zZWN0b3JzOgorCW1vdncJY3VyZHgsICVkeAkJIyByZXN0b3Jl
IGRpc2sgc3RhdGUKKwltb3Z3CWN1cmN4LCAlY3gKKyMgICBhbCBpcyBsYXN0IHNlY3RvcisxCisj
ICAgYWggaXMgbGFzdCBoZWFkKzEKKwltb3Z3CWxpbWl0cywgJWF4CisJb3J3CSVkaSwlZGkKKyAg
ICAgICAgam5lCXJlYWRfc2VjdG9yc2xwCisJbW92YgkkMHgyZSwgJWFsIAkJIyBsb2FkaW5nLi4u
IG1lc3NhZ2UgMmUgPSAuCitwdXRjOgorCW1vdmIJJDB4ZSwgJWFoCisJbW92dwkkNywgJWJ4CQkJ
IyAgIG9uZSBkb3QgZWFjaCA2NGsKKyAJaW50CSQweDEwCityZXR1cm46CisJcmV0CisKK3ByaW50
X25sOgorCQorCW1vdmIJJDB4ZCwgJWFsCQkjIENSCisJY2FsbAlwdXRjCisJbW92YgkkMHhhLCAl
YWwJCSMgTEYKKwlqbXAJcHV0YworCitwdXRzOgorCWNhbGwJcHJpbnRfbmwJCSMgc2V0ICVhaCBh
bmQgJWJ4CitwdXRzbHA6CisJbG9kc2IKKwlvcmIJJWFsLCVhbAkJCSMgZW5kIG9mIHN0cmluZyBp
cyBcMAorCWp6CXJldHVybgorcHV0Y3M6CisJaW50CSQweDEwCisJam1wCXB1dHNscAogCi0JLm9y
ZyA0OTcKK2Zsb3BweV90YWJsZToKKyNpZmRlZiBFWFRSQV9ERVZJQ0VTCQkKKwkJLmJ5dGUJMTYs
OQkJCSMgL2Rldi9mZDB1NzIwCisJCS5ieXRlCTEyLDEwCQkJIyAvZGV2L2ZkMHU4MDAKKwkJLmJ5
dGUJODAsMTEJCQkjIC9kZXYvZmQwdTg4MAorCQkuYnl0ZQkxMjUsMjAJCQkjIC9kZXYvZmQwdTE2
MDAKKwkJLmJ5dGUJNDQsMjEJCQkjIC9kZXYvZmQwdTE2ODAKKwkJLmJ5dGUJOTYsMjIJCQkjIC9k
ZXYvZmQwdTE3NjAKKwkJLmJ5dGUJMTE2LDIzCQkJIyAvZGV2L2ZkMHUxODQwCisJCS5ieXRlCTEw
MCwyNAkJCSMgL2Rldi9mZDB1MTkyMAorCQkuYnl0ZQkxMDUsNDAJCQkjIC9kZXYvZmQwdTMyMDAK
KwkJLmJ5dGUJMTA5LDQ0CQkJIyAvZGV2L2ZkMHUzNTIwCisJCS5ieXRlCTExMyw0OAkJCSMgL2Rl
di9mZDB1Mzg0MAorI2VuZGlmCQkKKwkJLmJ5dGUJOCwxNQkJCSMgL2Rldi9mZDBoMTIwMCAtIC9k
ZXYvcHMwCisJCS5ieXRlCTI4LDE4CQkJIyAvZGV2L2ZkMHUxNDQwIC0gL2Rldi9QUzAKKwkJLmJ5
dGUJMzIsMzYJCQkjIC9kZXYvZmQwdTI4ODAgLSAvZGV2L2ZkMEgyODgwCisJCS5ieXRlCTAsMTI4
CQkJIyAvZGV2L2ZkMCAtIGRlZmF1bHQ6IGF1dG9kZXRlY3QKKworcmVnczoJCS5hc2NpegkiWDoi
CisKKyNpZm5kZWYJRElTUExBWV9LRVJORUxfVkVSU0lPTgorbXNnMToJCS5hc2NpegkiTG9hZGlu
ZyIKKyNlbmRpZgkJCisKK3RhaWw6CisJCS5zcGFjZQk0OTUrc3RhcnQtdGFpbAkJCisKKyMub3Jn
IDQ5NQorc3lzX3NlY3RzOgkud29yZCBTWVNTSVpFIC8gMzIJCSMgc2l6ZSBtYXggaXMgbm93IDMy
TWIKKyMub3JnIDQ5Nwogc2V0dXBfc2VjdHM6CS5ieXRlIFNFVFVQU0VDVFMKIHJvb3RfZmxhZ3M6
CS53b3JkIFJPT1RfUkRPTkxZCi1zeXNzaXplOgkud29yZCBTWVNTSVpFCitzeXNzaXplOgkud29y
ZCBTWVNTSVpFICUgMHgxMDAwMAkJIyBzaXplIG1heCB3YXMgMU1iCiBzd2FwX2RldjoJLndvcmQg
U1dBUF9ERVYKLXJhbV9zaXplOgkud29yZCBSQU1ESVNLCityYW1fc2l6ZToJLndvcmQgUkFNRElT
SwkJCSMgcmFtZGlzayBzaXplLCByYW1kaXNrIGZsYWdzIGFuZCBjbWRsaW5lIGZsYWcKIHZpZF9t
b2RlOgkud29yZCBTVkdBX01PREUKIHJvb3RfZGV2Ogkud29yZCBST09UX0RFVgogYm9vdF9mbGFn
Ogkud29yZCAweEFBNTUKZGlmZiAtcHVyTiBsaW51eC0yLjYuMTMvYXJjaC9pMzg2L2Jvb3QvdG9v
bHMvYnVpbGQuYyBsaW51eC0yLjYuMTMtYm9vdGJsb2NrL2FyY2gvaTM4Ni9ib290L3Rvb2xzL2J1
aWxkLmMKLS0tIGxpbnV4LTIuNi4xMy9hcmNoL2kzODYvYm9vdC90b29scy9idWlsZC5jCTIwMDUt
MDktMTIgMTA6Mzg6NTIuMDAwMDAwMDAwICswMjAwCisrKyBsaW51eC0yLjYuMTMtYm9vdGJsb2Nr
L2FyY2gvaTM4Ni9ib290L3Rvb2xzL2J1aWxkLmMJMjAwNS0wOS0xMiAxMDo0NjoyNS4wMDAwMDAw
MDAgKzAyMDAKQEAgLTE2OCwxMCArMTY4LDEzIEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoq
IGFyZ3YpCiAJfQogCWNsb3NlKGZkKTsKIAotCWlmIChsc2VlaygxLCA0OTcsIFNFRUtfU0VUKSAh
PSA0OTcpCQkgICAgLyogV3JpdGUgc2l6ZXMgdG8gdGhlIGJvb3RzZWN0b3IgKi8KKwlpZiAobHNl
ZWsoMSwgNDk1LCBTRUVLX1NFVCkgIT0gNDk1KQkJICAgIC8qIFdyaXRlIHNpemVzIHRvIHRoZSBi
b290c2VjdG9yICovCiAJCWRpZSgiT3V0cHV0OiBzZWVrIGZhaWxlZCIpOwotCWJ1ZlswXSA9IHNl
dHVwX3NlY3RvcnM7Ci0JaWYgKHdyaXRlKDEsIGJ1ZiwgMSkgIT0gMSkKKwlzeiA9IChzYi5zdF9z
aXplICsgNTExKSAvIDUxMjsKKwlidWZbMF0gPSAoc3ogJiAweGZmKTsKKwlidWZbMV0gPSAoKHN6
ID4+IDgpICYgMHhmZik7CisJYnVmWzJdID0gc2V0dXBfc2VjdG9yczsKKwlpZiAod3JpdGUoMSwg
YnVmLCAzKSAhPSAzKQogCQlkaWUoIldyaXRlIG9mIHNldHVwIHNlY3RvciBjb3VudCBmYWlsZWQi
KTsKIAlpZiAobHNlZWsoMSwgNTAwLCBTRUVLX1NFVCkgIT0gNTAwKQogCQlkaWUoIk91dHB1dDog
c2VlayBmYWlsZWQiKTsKZGlmZiAtcHVyTiBsaW51eC0yLjYuMTMvYXJjaC9pMzg2L2tlcm5lbC9z
ZXR1cC5jIGxpbnV4LTIuNi4xMy1ib290YmxvY2svYXJjaC9pMzg2L2tlcm5lbC9zZXR1cC5jCi0t
LSBsaW51eC0yLjYuMTMvYXJjaC9pMzg2L2tlcm5lbC9zZXR1cC5jCTIwMDUtMDktMTIgMTA6Mzg6
NTMuMDAwMDAwMDAwICswMjAwCisrKyBsaW51eC0yLjYuMTMtYm9vdGJsb2NrL2FyY2gvaTM4Ni9r
ZXJuZWwvc2V0dXAuYwkyMDA1LTA5LTEyIDEwOjU3OjAxLjAwMDAwMDAwMCArMDIwMApAQCAtMTU2
LDYgKzE1Niw3IEBAIHVuc2lnbmVkIGxvbmcgc2F2ZWRfdmlkZW9tb2RlOwogI2RlZmluZSBSQU1E
SVNLX0lNQUdFX1NUQVJUX01BU0sgIAkweDA3RkYKICNkZWZpbmUgUkFNRElTS19QUk9NUFRfRkxB
RwkJMHg4MDAwCiAjZGVmaW5lIFJBTURJU0tfTE9BRF9GTEFHCQkweDQwMDAJCisjZGVmaW5lIENN
RExJTkVfTE9BRF9GTEFHCQkweDIwMDAJCiAKIHN0YXRpYyBjaGFyIGNvbW1hbmRfbGluZVtDT01N
QU5EX0xJTkVfU0laRV07CiAKZGlmZiAtcHVyTiBsaW51eC0yLjYuMTMvYXJjaC94ODZfNjQvYm9v
dC9ib290c2VjdC5TIGxpbnV4LTIuNi4xMy1ib290YmxvY2svYXJjaC94ODZfNjQvYm9vdC9ib290
c2VjdC5TCi0tLSBsaW51eC0yLjYuMTMvYXJjaC94ODZfNjQvYm9vdC9ib290c2VjdC5TCTIwMDUt
MDktMTIgMTA6Mzc6NTguMDAwMDAwMDAwICswMjAwCisrKyBsaW51eC0yLjYuMTMtYm9vdGJsb2Nr
L2FyY2gveDg2XzY0L2Jvb3QvYm9vdHNlY3QuUwkyMDA1LTA5LTEyIDEwOjU4OjA3LjAwMDAwMDAw
MCArMDIwMApAQCAtNCwyMCArNCwzMSBAQAogICoJbW9kaWZpZWQgYnkgRHJldyBFY2toYXJkdAog
ICoJbW9kaWZpZWQgYnkgQnJ1Y2UgRXZhbnMgKGJkZSkKICAqCW1vZGlmaWVkIGJ5IENocmlzIE5v
ZSAoTWF5IDE5OTkpIChhczg2IC0+IGdhcykKLSAqCWd1dHRlZCBieSBILiBQZXRlciBBbnZpbiAo
SmFuIDIwMDMpCisgKgorICogICAgICByZXdyaXR0ZW4gdG8gc3VwcG9ydCB1cCB0byAzMk1iIGtl
cm5lbCwgY21kbGluZQorICogICAgICBhbmQgYW55IGRpc2sgZ2VvbWV0cnkgYnkgPHBhc2NhbC5i
ZWxsYXJkQGFkcy1sdS5jb20+CiAgKgogICogQklHIEZBVCBOT1RFOiBXZSdyZSBpbiByZWFsIG1v
ZGUgdXNpbmcgNjRrIHNlZ21lbnRzLiAgVGhlcmVmb3JlIHNlZ21lbnQKICAqIGFkZHJlc3NlcyBt
dXN0IGJlIG11bHRpcGxpZWQgYnkgMTYgdG8gb2J0YWluIHRoZWlyIHJlc3BlY3RpdmUgbGluZWFy
CiAgKiBhZGRyZXNzZXMuIFRvIGF2b2lkIGNvbmZ1c2lvbiwgbGluZWFyIGFkZHJlc3NlcyBhcmUg
d3JpdHRlbiB1c2luZyBsZWFkaW5nCiAgKiBoZXggd2hpbGUgc2VnbWVudCBhZGRyZXNzZXMgYXJl
IHdyaXR0ZW4gYXMgc2VnbWVudDpvZmZzZXQuCiAgKgorICogYmRlIC0gc2hvdWxkIG5vdCBqdW1w
IGJsaW5kbHksIHRoZXJlIG1heSBiZSBzeXN0ZW1zIHdpdGggb25seSA1MTJLIGxvdworICogbWVt
b3J5LiAgVXNlIGludCAweDEyIHRvIGdldCB0aGUgdG9wIG9mIG1lbW9yeSwgZXRjLgorICoKKyAq
IEl0IHRoZW4gbG9hZHMgJ3NldHVwJyBkaXJlY3RseSBhZnRlciBpdHNlbGYgKDB4OTAyMDApLCBh
bmQgdGhlIHN5c3RlbQorICogYXQgMHgxMDAwMCwgdXNpbmcgQklPUyBpbnRlcnJ1cHRzLiAKKyAq
CisgKiBUaGUgbG9hZGVyIGhhcyBiZWVuIG1hZGUgYXMgc2ltcGxlIGFzIHBvc3NpYmxlLCBhbmQg
Y29udGludW91cworICogcmVhZCBlcnJvcnMgd2lsbCByZXN1bHQgaW4gYSB1bmJyZWFrYWJsZSBs
b29wLiBSZWJvb3QgYnkgaGFuZC4gSXQKKyAqIGxvYWRzIHByZXR0eSBmYXN0IGJ5IGdldHRpbmcg
d2hvbGUgdHJhY2tzIGF0IGEgdGltZSB3aGVuZXZlciBwb3NzaWJsZS4KICAqLwogCiAjaW5jbHVk
ZSA8YXNtL2Jvb3QuaD4KIAogU0VUVVBTRUNUUwk9IDQJCQkvKiBkZWZhdWx0IG5yIG9mIHNldHVw
LXNlY3RvcnMgKi8KIEJPT1RTRUcJCT0gMHgwN0MwCQkvKiBvcmlnaW5hbCBhZGRyZXNzIG9mIGJv
b3Qtc2VjdG9yICovCi1JTklUU0VHCQk9IERFRl9JTklUU0VHCQkvKiB3ZSBtb3ZlIGJvb3QgaGVy
ZSAtIG91dCBvZiB0aGUgd2F5ICovCitJTklUU0VHCQk9IERFRl9JTklUU0VHCQkvKiB3ZSBsb2Fk
IGJvb3QgaGVyZSAtIG91dCBvZiB0aGUgd2F5ICovCiBTRVRVUFNFRwk9IERFRl9TRVRVUFNFRwkJ
Lyogc2V0dXAgc3RhcnRzIGhlcmUgKi8KIFNZU1NFRwkJPSBERUZfU1lTU0VHCQkvKiBzeXN0ZW0g
bG9hZGVkIGF0IDB4MTAwMDAgKDY1NTM2KSAqLwogU1lTU0laRQkJPSBERUZfU1lTU0laRQkJLyog
c3lzdGVtIHNpemU6ICMgb2YgMTYtYnl0ZSBjbGlja3MgKi8KQEAgLTI1LDYgKzM2LDEyIEBAIFNZ
U1NJWkUJCT0gREVGX1NZU1NJWkUJCS8qIHN5c3RlbSBzaXplOiAKIFJPT1RfREVWCT0gMCAJCQkv
KiBST09UX0RFViBpcyBub3cgd3JpdHRlbiBieSAiYnVpbGQiICovCiBTV0FQX0RFVgk9IDAJCQkv
KiBTV0FQX0RFViBpcyBub3cgd3JpdHRlbiBieSAiYnVpbGQiICovCiAKKy8qIHNvbWUgZXh0cmEg
ZmVhdHVyZXMgKi8KKyNkZWZpbmUgRElTUExBWV9LRVJORUxfVkVSU0lPTgkJYXMgc29vbiBhcyBw
b3NzaWJsZQorI2RlZmluZQlFRElUX0NNRExJTkUJCQlvbiBob3RrZXkKKyNkZWZpbmUJTE9BRF9D
TURMSU5FCQkJYWNjb3JkaW5nIHRvIGJpdCByYW1zaXplLjEzCisjZGVmaW5lIEVYVFJBX0RFVklD
RVMJCQl0byBmaWxsIHJvb3RfZGV2aWNlCisKICNpZm5kZWYgU1ZHQV9NT0RFCiAjZGVmaW5lIFNW
R0FfTU9ERSBBU0tfVkdBCiAjZW5kaWYKQEAgLTQyLDU3ICs1OSw0NzAgQEAgU1dBUF9ERVYJPSAw
CQkJLyogU1dBUF9ERVYgaXMgbm93IHdyaXR0ZQogCiAuZ2xvYmFsIF9zdGFydAogX3N0YXJ0Ogor
CWNsZAkJCQkjIGFzc3VtZSBub3RoaW5nCisJbW92dwkkSU5JVFNFRywgJWF4CisJbW92dwklYXgs
ICVlcwkJIyAlYXggPSAlZXMgPSBJTklUU0VHCisjaWYgTU9WRV9CT09UU0VDVE9SCisjIEZpcnN0
IHRoaW5ncyBmaXJzdC4gTW92ZSBvdXJzZWxmIGZyb20gMHg3QzAwIC0+IDB4OTAwMDAgYW5kIGp1
bXAgdGhlcmUuCisJbW92dwkkQk9PVFNFRywgJWN4CisJbW92dwklY3gsICVkcwkJIyAlZHMgPSBC
T09UU0VHCisJbW92YgkkMSwgJWNoCQkJIyAlY3ggPSAyNTYKKwlzdWJ3CSVzaSwgJXNpCisJc3Vi
dwklZGksICVkaQorCXJlcAorCW1vdnN3CisJbGptcAkkSU5JVFNFRywgJGdvCitnbzoJCisjZWxz
ZQorCXhvcncJJWN4LCAlY3gJCSMgJWN4ID0gMAorI2VuZGlmCiAKLQkjIE5vcm1hbGl6ZSB0aGUg
c3RhcnQgYWRkcmVzcwotCWptcGwJJEJPT1RTRUcsICRzdGFydDIKKyMgYmRlIC0gY2hhbmdlZCAw
eGZmMDAgdG8gMHg0MDAwIHRvIHVzZSBkZWJ1Z2dlciBhdCAweDY0MDAgdXAgKGJkZSkuICBXZQor
IyB3b3VsZG4ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoaXMgaWYgd2UgY2hlY2tlZCB0aGUgdG9w
IG9mIG1lbW9yeS4gIEFsc28KKyMgbXkgQklPUyBjYW4gYmUgY29uZmlndXJlZCB0byBwdXQgdGhl
IHdpbmkgZHJpdmUgdGFibGVzIGluIGhpZ2ggbWVtb3J5CisjIGluc3RlYWQgb2YgaW4gdGhlIHZl
Y3RvciB0YWJsZS4gIFRoZSBvbGQgc3RhY2sgbWlnaHQgaGF2ZSBjbG9iYmVyZWQgdGhlCisjIGRy
aXZlIHRhYmxlLgorCisJbW92dwkkMHg0MDAwLTEyLCAlZGkJCSMgMHg0MDAwIGlzIGFuIGFyYml0
cmFyeSB2YWx1ZSA+PQorCQkJCQkjIGxlbmd0aCBvZiBib290c2VjdCArIGxlbmd0aCBvZgorCQkJ
CQkjIHNldHVwICsgcm9vbSBmb3Igc3RhY2s7CisJCQkJCSMgMTIgaXMgZGlzayBwYXJtIHNpemUu
CisJCQkJCSMgZ2R0IHdpbGwgaGVhdCA0OCBtb3JlIGJ5dGVzLgorCW1vdncJJWF4LCAlc3MJCSMg
JWF4IGFuZCAlZXMgYWxyZWFkeSBjb250YWluIElOSVRTRUcKKwltb3Z3CSVkaSwgJXNwCQkjIHB1
dCBzdGFjayBhdCBJTklUU0VHOjB4NDAwMC0xMi4KKworIyBNYW55IEJJT1MncyBkZWZhdWx0IGRp
c2sgcGFyYW1ldGVyIHRhYmxlcyB3aWxsIG5vdCByZWNvZ25pemUKKyMgbXVsdGktc2VjdG9yIHJl
YWRzIGJleW9uZCB0aGUgbWF4aW11bSBzZWN0b3IgbnVtYmVyIHNwZWNpZmllZAorIyBpbiB0aGUg
ZGVmYXVsdCBkaXNrZXR0ZSBwYXJhbWV0ZXIgdGFibGVzIC0gdGhpcyBtYXkgbWVhbiA3CisjIHNl
Y3RvcnMgaW4gc29tZSBjYXNlcy4KKyMKKyMgU2luY2Ugc2luZ2xlIHNlY3RvciByZWFkcyBhcmUg
c2xvdyBhbmQgb3V0IG9mIHRoZSBxdWVzdGlvbiwKKyMgd2UgbXVzdCB0YWtlIGNhcmUgb2YgdGhp
cyBieSBjcmVhdGluZyBuZXcgcGFyYW1ldGVyIHRhYmxlcworIyAoZm9yIHRoZSBmaXJzdCBkaXNr
KSBpbiBSQU0uICBXZSBjYW4gc2V0IHRoZSBtYXhpbXVtIHNlY3RvcgorIyBjb3VudCB0byAzNiAt
IHRoZSBtb3N0IHdlIHdpbGwgZW5jb3VudGVyIG9uIGFuIEVEIDIuODguICAKKyMKKyMgSGlnaCBk
b2Vzbid0IGh1cnQuICBMb3cgZG9lcy4gIExldCdzIHVzZSB0aGUgbWF4OiA2MworIworIyBTZWdt
ZW50cyBhcmUgYXMgZm9sbG93czogJWVzID0gJXNzID0gSU5JVFNFRywKKyMgJWZzIGFuZCAlZ3Mg
YXJlIHVudXNlZC4KKworCW1vdncJJDB4NzgsICVieAkJIyAlZHM6JWJ4IGlzIHBhcmFtZXRlciB0
YWJsZSBhZGRyZXNzCisJbW92dwklY3gsICVkcwkJIyAlZHMgPSAwCisJbGRzdwkoJWJ4KSwgJXNp
CQkjICVkczolc2kgaXMgc291cmNlCisJbW92YgkkNiwgJWNsCQkJIyBjb3B5IDEyIGJ5dGVzCisJ
cmVwCQkJCSMgZG9uJ3Qgd29ycnkgYWJvdXQgY2xkCisJbW92c3cJCQkJIyBhbHJlYWR5IGRvbmUg
YWJvdmUKKwltb3Z3CSVjeCwgJWRzCQkjICVkcyA9IDAKKwltb3Z3CSVzcCwgKCVieCkJCSMgJXNw
ID0gMHg0MDAwLTEyCisJbW92dwklZXMsIDIoJWJ4KQorCXB1c2h3CSVlcworCXBvcHcJJWRzCQkJ
IyBub3cgJWRzID0gJWVzID0gJXNzID0gSU5JVFNFRworCW1vdmIJJDYzLCAweDQtMTIoJWRpKQkj
IHBhdGNoIHNlY3RvciBjb3VudCwgJWRpID0gMHg0MDAwCisKKwljbGkKKwljYncJCQkJIyAlYXgg
PSAwIDogZ2VvbWV0cnkgdW5rbm93biB5ZXQKKwl4b3JiCSVkaCwgJWRoCQkjIGhlYWQgMCwgY3Vy
cmVudCBkcml2ZQorCWluY3cJJWN4CQkJIyBjeWxpbmRlciAwLCBzZWN0b3IgMQorCW1vdncJJWN4
LCAlZGkJCSMgcmVhZCAxIHNlY3RvcgorCWNhbGwJcmVhZF9maXJzdF9zZWN0b3IJIyByZWFkIGJv
b3RzZWN0b3IgYWdhaW4gdG8gaGF2ZQorCQkJCQkjIGFjY2VzcyB0byBkYXRhIHNlZ21lbnQKKwor
I2lmbmRlZglESVNQTEFZX0tFUk5FTF9WRVJTSU9OCisJbW92dwkkbXNnMSwgJXNpCisJY2FsbAlw
dXRzCisjZW5kaWYKIAotc3RhcnQyOgotCW1vdncJJWNzLCAlYXgKLQltb3Z3CSVheCwgJWRzCi0J
bW92dwklYXgsICVlcwotCW1vdncJJWF4LCAlc3MKLQltb3Z3CSQweDdjMDAsICVzcAotCXN0aQot
CWNsZAorIyBMb2FkIHRoZSBzZXR1cC1zZWN0b3JzIGRpcmVjdGx5IGFmdGVyIHRoZSBtb3ZlZCBi
b290YmxvY2sgKGF0IDB4OTAyMDApLgogCi0JbW92dwkkYnVnZ2VyX29mZl9tc2csICVzaQorCW1v
dmIJc2V0dXBfc2VjdHMsICVhbAorI2lmZGVmIENIRUNLX1NFVFVQX1NJWkUKKwlvcmIJJWFsLCAl
YWwKKwlqbmUJc2V0dXBfc2l6ZV9vaworCW1vdmIJJFNFVFVQU0VDVFMsICVhbAorc2V0dXBfc2l6
ZV9vazoJCisjZW5kaWYKKwljYncKKwl4Y2hnCSVheCwgJWRpCisJY2FsbAlyZWFkX3NlY3RvcnMJ
CSMgcmVhZCBzZXR1cAorCisjaWZkZWYJRElTUExBWV9LRVJORUxfVkVSU0lPTgorI2RlZmluZSBr
ZXJuZWxfdmVyc2lvbgkweEUKKwltb3Z3CSQweDIwMCwlc2kKKwlhZGR3CWtlcm5lbF92ZXJzaW9u
KCVzaSksJXNpCSMgc3RhcnRpbmcgcHJvdG9jb2wgMi4wMCwgS2VybmVsIDEuMy43MworCWNhbGwJ
cHV0cwkJCSMgc2hvdyB3aGljaCBrZXJuZWwgd2UgYXJlIGxvYWRpbmcKKyNlbmRpZgogCi1tc2df
bG9vcDoKLQlsb2RzYgotCWFuZGIJJWFsLCAlYWwKLQlqeglkaWUKLQltb3ZiCSQweGUsICVhaAot
CW1vdncJJDcsICVieAotCWludAkkMHgxMAotCWptcAltc2dfbG9vcAorIyBUaGlzIHJvdXRpbmUg
bG9hZHMgdGhlIHN5c3RlbSBhdCBhZGRyZXNzIFNZU1NFRywgbWFraW5nIHN1cmUKKyMgbm8gNjRr
QiBib3VuZGFyaWVzIGFyZSBjcm9zc2VkLiBXZSB0cnkgdG8gbG9hZCBpdCBhcyBmYXN0IGFzCisj
IHBvc3NpYmxlLCBsb2FkaW5nIHdob2xlIHRyYWNrcyB3aGVuZXZlciB3ZSBjYW4uCisKKyNpZmRl
ZiBfX0JJR19LRVJORUxfXwordHlwZV9vZl9sb2FkZXIJPQk1MjgKKwltb3Z3CSQyNCwgJWN4CQkj
IGFsbG9jYXRlIDQ4IGJ5dGVzIGluIHN0YWNrCitpbml0X2dkdDoKKwlwdXNoCSQwCQkJIyAgIGlu
aXRpYWxpemVkIHdpdGggMAorCWxvb3AJaW5pdF9nZHQKKwltb3Z3CSVzcCwgJXNpCQkjIGZvciBi
b290c2VjdF9nZHQKKwltb3Z3CSQweDkzMDArKFNZU1NFRy80MDk2KSwgJWF4CSMgc291cmNlID0g
U1lTU0VHCisJY3dkCisJbW92dwklYXgsIDIwKCVzaSkJCSMgYm9vdHNlY3Rfc3JjX2Jhc2UrMgor
CW1vdmIJJDB4MTAtMSwgJWFsCQkjIGRlc3RpbmF0aW9uID0gMHgxMDAwMDAKKwltb3Z3CSVheCwg
MjgoJXNpKQkJIyBib290c2VjdF9kc3RfYmFzZSsyCisJbW92dwklZHgsIDE2KCVzaSkJCSMgYm9v
dHNlY3Rfc3JjID0gNjRLYgorCW1vdncJJWR4LCAyNCglc2kpCQkjIGJvb3RzZWN0X2RzdCA9IDY0
S2IKKwltb3ZiCSVkbCwgdHlwZV9vZl9sb2FkZXIJIyBsb2FkZXIgdHlwZSA9IDB4RkYKK3N5c2xw
OgorCW1vdncJJFNZU1NFRywgJWF4CisJbW92dwklYXgsICVlcworCW1vdncJJDEyOCwlZGkJCSMg
NjRLYiBpbiBzZWN0b3JzCisJc3VidwklZGksIHN5c19zZWN0cworCXB1c2hmCisJam5jCW5vdF9s
YXN0CisJYWRkdwlzeXNfc2VjdHMsICVkaQorbm90X2xhc3Q6CisJY2FsbAlyZWFkX3NlY3RvcnMK
KwlpbmN3CTI4KCVzaSkJCQkjIGJvb3RzZWN0X2RzdF9iYXNlKzIKKwltb3Z3CSQweDgwMDAsICVj
eAkJIyBmdWxsIDY0SworCW1vdmIJJDB4ODcsICVhaAorCXB1c2gJJXNzCisJcG9wCSVlcwkJCSMg
Z2R0IGluIGVzOnNpCisJaW50CSQweDE1CisJcG9wZgorCWphCXN5c2xwCisjZWxzZQorCW1vdncJ
JFNZU1NFRywgJWF4CisJbW92dwklYXgsICVlcworc3lzbHA6CisJbW92dwkkMTI4KjMyLCVheAkJ
IyA2NEtiIGluIHBhcmFncmFwaHMKKwlzdWJ3CSVheCwgc3lzc2l6ZQorCXB1c2hmCisJam5jCW5v
dF9sYXN0CisJYWRkdwlzeXNzaXplLCAlYXgKK25vdF9sYXN0OgorCW1vdmIJJDUsICVjbAkJCSMg
cGFyYWdyYXBocyAtPiBzZWN0b3JzCisJc2hydwklY2wsICVheAorCXhjaGcJJWF4LCAlZGkKKwlj
YWxsCXJlYWRfc2VjdG9ycworCXBvcGYKKwlqYQlzeXNscAorI2VuZGlmCiAKLWRpZToKLQkjIEFs
bG93IHRoZSB1c2VyIHRvIHByZXNzIGEga2V5LCB0aGVuIHJlYm9vdAotCXhvcncJJWF4LCAlYXgK
LQlpbnQJJDB4MTYKLQlpbnQJJDB4MTkKKyMgQWZ0ZXIgdGhhdCB3ZSBjaGVjayB3aGljaCByb290
LWRldmljZSB0byB1c2UuIElmIHRoZSBkZXZpY2UgaXMKKyMgZGVmaW5lZCAoIT0gMCksIG5vdGhp
bmcgaXMgZG9uZSBhbmQgdGhlIGdpdmVuIGRldmljZSBpcyB1c2VkLgorIyBPdGhlcndpc2UsIG9u
ZSBvZiAvZGV2L2ZkMEgyODgwICgyLDMyKSBvciAvZGV2L1BTMCAoMiwyOCkgb3IgL2Rldi9hdDAg
KDIsOCkKKyMgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2Ygc2VjdG9ycyB3ZSBwcmV0ZW5kIHRv
IGtub3cgd2UgaGF2ZS4KKworCisJbW92dwlyb290X2RldiwgJWF4CisJb3J3CSVheCwgJWF4CisJ
am56CXJvb3RfZGVmaW5lZAorCisJbW92dwkkZmxvcHB5X3RhYmxlLCVzaQorc2Nhbl9mbG9wcHlf
dGFibGU6CisJbG9kc3cKKwljbXBiCWxpbWl0cywgJWFoCisJamUJc2V0X3Jvb3QKKwlqbm8Jc2Nh
bl9mbG9wcHlfdGFibGUKK3NldF9yb290OgorCW1vdmIJJDIsICVhaAorCWFkZGIJJWRsLCAlYWwJ
CSMgYWRkIGN1cnJlbnQgKGZsb3BweSkgZHJpdmUKKwltb3Z3CSVheCwgcm9vdF9kZXYKK3Jvb3Rf
ZGVmaW5lZDoKKworI2lmIGRlZmluZWQoTE9BRF9DTURMSU5FKSB8fCBkZWZpbmVkKEVESVRfQ01E
TElORSkKKyNkZWZpbmUgQlVGRkVSCTB4N0YwMAorCW1vdncJJEJVRkZFUiwgJXNpCisJbW92dwkl
c2ksICglc2kpCQkjIGRlZmF1bHQgOiBubyBjbWRsaW5lCisjZW5kaWYKIAotCSMgaW50IDB4MTkg
c2hvdWxkIG5ldmVyIHJldHVybi4gIEluIGNhc2UgaXQgZG9lcyBhbnl3YXksCi0JIyBpbnZva2Ug
dGhlIEJJT1MgcmVzZXQgY29kZS4uLgotCWxqbXAJJDB4ZjAwMCwkMHhmZmYwCisjaWZkZWYJTE9B
RF9DTURMSU5FCisJdGVzdGIJJDB4MjAscmFtX3NpemUrMQkjIGJpdCAxMSB0byAxMyB3aGVyZSB1
bnVzZWQKKwkJCQkJIyBub3cgYml0IDEzIG1lYW5zOiBsb2FkIGNtZGxpbmUKKwlqeglub2NtZAor
CW1vdncJJEJVRkZFUi8xNitJTklUU0VHLCAlYXgKKwltb3Z3CSVheCwgJWVzCisJbW92dwkkMSwg
JWRpCQkJIyBjbWRsaW5lID0gNTEyIGJ5dGVzIG1heAorCWNhbGwJcmVhZF9zZWN0b3JzCitub2Nt
ZDoKKyNlbmRpZgogCisjZGVmaW5lIFJTSEZUICAgMHgwMQorI2RlZmluZSBMU0hGVCAgIDB4MDIK
KyNkZWZpbmUgQ1RSTCAgICAweDA0CisjZGVmaW5lIEFMVCAgICAgMHgwOAorI2RlZmluZSBTQ1JM
Q0sgIDB4MTAKKyNkZWZpbmUgTlVNTENLICAweDIwCisjZGVmaW5lIENBUFNMQ0sgMHg0MAorI2Rl
ZmluZSBJTlNFUlQgIDB4ODAKKworI2lmZGVmCUVESVRfQ01ETElORQorIyBUaGUgY21kbGluZSBj
YW4gYmUgZW50ZXJlZCBhbmQgbW9kaWZlZCBvbiBob3Qga2V5LgorIyBPbmx5IGNoYXJhY3RlcnMg
YmVmb3JlIHRoZSBjdXJzb3IgYXJlIHBhc3NlZCB0byB0aGUga2VybmVsLgorCW1vdmIJJDIsICVh
aAkJCSMgZ2V0IGtleWJvYXJkIHN0YXR1cworCWludAkkMHgxNgorCXRlc3RiCSRSU0hGVHxMU0hG
VHxDVFJMfEFMVHxDQVBTTENLLCAlYWwKKwlqeglub2NtZGxpbmUKKwlwdXNodwklc2kKKwljYWxs
CXB1dHMJCQkjIHNldCAlYWggYW5kICVieAorY21kbHA6CisjIGlmIDEKKwltb3ZiCSQzMiwgJWFs
CQkjIGNsZWFyIGVuZCBvZiBsaW5lCisJaW50CSQweDEwCQkJIyAgd2l0aCBTcGFjZQorCW1vdmIJ
JDgsICVhbAkJCSMgICBhbmQgQmFja1NwYWNlCisJaW50CSQweDEwCisjIGVuZGlmCisJZGVjdwkl
c2kKK2NtZGdldDoKKwljYncJCQkJIyAlYWggPSAwLCBnZXQga2V5Ym9hcmQgY2hhcmFjdGVyCisJ
aW50CSQweDE2CisJY21wYgkkOCwgJWFsCQkJIyBCYWNrU3BhY2UgPworCWplCWNtZGJzCisJY2J3
CisJbW92dwklYXgsICglc2kpCQkjIHN0b3JlIGVuZCBvZiBzdHJpbmcgdG9vCisJaW5jdwklc2kK
KwlpbmN3CSVzaQorY21kYnM6CisJY21wdwkkQlVGRkVSLCAlc2kJCSMgbG93ZXIgbGltaXQgaXMg
Y2hlY2tlZAorCWplCWNtZGdldAkJCSMgICBidXQgdXBwZXIgbGltaXQgbm90CisJY2FsbAlwdXRj
CisJY21wYgkkMTMsICVhbAkJIyBFbnRlciA/CisJam5lCWNtZGxwCisJcG9wdwklc2kKK25vY21k
bGluZToKKyNlbmRpZgogCi1idWdnZXJfb2ZmX21zZzoKLQkuYXNjaWkJIkRpcmVjdCBib290aW5n
IGZyb20gZmxvcHB5IGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuXHJcbiIKLQkuYXNjaWkJIlBsZWFz
ZSB1c2UgYSBib290IGxvYWRlciBwcm9ncmFtIGluc3RlYWQuXHJcbiIKLQkuYXNjaWkJIlxuIgot
CS5hc2NpaQkiUmVtb3ZlIGRpc2sgYW5kIHByZXNzIGFueSBrZXkgdG8gcmVib290IC4gLiAuXHJc
biIKLQkuYnl0ZQkwCisjaWYgZGVmaW5lZChMT0FEX0NNRExJTkUpIHx8IGRlZmluZWQoRURJVF9D
TURMSU5FKQorI2lmIDEKK2NtZF9saW5lX21hZ2ljCT0JMHgyMAorY21kX2xpbmVfb2Zmc2V0CT0J
MHgyMgorCW1vdncJJDB4QTMzRiwgY21kX2xpbmVfbWFnaWMKKwltb3Z3CSVzaSwgY21kX2xpbmVf
b2Zmc2V0CisjZWxzZQorIyBwcm90b2NvbCA+PSAyLjAyLCBzdGFydGluZyBLZXJuZWwgMi40LjAt
dGVzdDMtcHJlMworY21kX2xpbmVfcHRyCT0JMHgyMjgKKwltb3Z6eAklc2ksICVlYXgKKwlhZGRs
CSRJTklUU0VHKjE2LCAlZWF4CisJbW92bAklZWF4LCBjbWRfbGluZV9wdHIKKyNlbmRpZgorZW1w
dHljbWRsaW5lOgorI2VuZGlmCisJCisjIFRoaXMgcHJvY2VkdXJlIHR1cm5zIG9mZiB0aGUgZmxv
cHB5IGRyaXZlIG1vdG9yLCBzbworIyB0aGF0IHdlIGVudGVyIHRoZSBrZXJuZWwgaW4gYSBrbm93
biBzdGF0ZSwgYW5kCisjIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgaXQgbGF0ZXIuCisKKyNp
ZiAxCitraWxsX21vdG9yOgorCXhvcncJJWF4LCAlYXgJCSMgcmVzZXQgRkRDCisJaW50CSQweDEz
CisjZWxzZQora2lsbF9tb3RvcjoKKwltb3Z3CSQweDNmMiwgJWR4CisJeG9yYgklYWwsICVhbAor
CW91dGIJJWFsLCAlZHgKKyNlbmRpZgogCisJY2FsbAlwcmludF9ubAogCi0JIyBLZXJuZWwgYXR0
cmlidXRlczsgdXNlZCBieSBzZXR1cAorIyBBZnRlciB0aGF0IChldmVyeXRoaW5nIGxvYWRlZCks
IHdlIGp1bXAgdG8gdGhlIHNldHVwLXJvdXRpbmUKKyMgbG9hZGVkIGRpcmVjdGx5IGFmdGVyIHRo
ZSBib290YmxvY2s6CisjIFNlZ21lbnRzIGFyZSBhcyBmb2xsb3dzOiAlZHMgPSAlc3MgPSBJTklU
U0VHCisKKwlsam1wCSRTRVRVUFNFRywgJDAKKworIyByZWFkX3NlY3RvcnMgcmVhZHMgJWRpIHNl
Y3RvcnMgaW50byAlZXM6MCBidWZmZXIuCisjICVlczowIGlzIHVwZGF0ZWQgdG8gdGhlIG5leHQg
bWVtb3J5IGxvY2F0aW9uLgorIyBGaXJzdCwgc2VjdG9ycyBhcmUgcmVhZCBzZWN0b3IgYnkgc2Vj
dG9yIHVudGlsCisjIHNlY3RvciBwZXIgdHJhY2sgY291bnQgaXMga25vd24uIFRoZW4gdGhleSBh
cmUKKyMgcmVhZCB0cmFjayBieSB0cmFjay4KKyMgQXNzdW1lIG5vIGVycm9yIG9uIGZpcnN0IHRy
YWNrLgorCisjZGVmaW5lIFRSQUNLX0JZX1RSQUNLCWxvYWQgYXMgZmFzdCBhcyBwb3NzaWJsZSAh
CisjZGVmaW5lIFNIT1dfUkVHUwlzaG93IGludDEzIHN0YXR1cyAmIHBhcmFtZXRlcnMKKworY2hl
Y2tfbGltaXRzOgorICAgICAgICBjbXBiICAgICVhbCwgJWNsCQkjIG1heCBzZWN0b3Iga25vd24g
PworICAgICAgICBqYQluZXh0X2hlYWQJCSMgICBubyAtPiBzdG9yZSBpdAorICAgICAgICBjbXBi
ICAgICVhaCwgJWRoCQkjIG1heCBoZWFkIGtub3duID8KKyAgICAgICAgamEJbmV4dF90cmFjawkJ
IyAgIG5vIC0+IHN0b3JlIGl0CisJcHVzaGEJCQkJIyBzYXZlIGNvbnRleHQKKyNpZmRlZiBTSE9X
X1JFR1MKKwlwdXNodwklZXMJCQkjIHByaW50ICVlcyAobmFtZWQgRVgpCisJcHVzaHcJJWR4CQkJ
IyBwcmludCAlZHgKKwlwdXNodwklY3gJCQkjIHByaW50ICVjeAorCXhvcncJJWN4LCAlY3gKKwlw
dXNodwklY3gJCQkjIHByaW50ICVieAorIyBpZmRlZiBUUkFDS19CWV9UUkFDSworCW1vdmIJJDIs
ICViaAorIyBlbmRpZgorCXB1c2h3CSVieAkJCSMgcHJpbnQgJWF4CisJbW92YgkkNiwlY2wKKwlq
bXAJcHJpbnRfYWxsCQkjIHByaW50ICVicCAoc3RhdHVzKQorcHJpbnRfbG9vcDoKKwltb3ZiCSQw
eDYgKyAnQScgLSAxLCAlYWwKKwlzdWJiCSVjbCwgJWFsCisJbW92dwkkcmVncywgJXNpCQkjIGNh
bGxlciAlc2kgaXMgc2F2ZWQKKwljYWxsCXB1dGNzCQkJIyBwdXRjKCVhbCkgKyBwdXRzKCVzaSkK
KyMgaXQgd2lsbCBwcmludCBvdXQgYWxsIG9mIHRoZSByZWdpc3RlcnMuCisJcG9wdwklYnAJCQkj
IGxvYWQgd29yZCBpbnRvICVicAorcHJpbnRfYWxsOgorCXB1c2h3CSVjeAkJCSMgc2F2ZSBjb3Vu
dCByZW1haW5pbmcKKwltb3ZiCSQ0LCAlY2wJCQkjIDQgaGV4IGRpZ2l0cworcHJpbnRfZGlnaXQ6
CisJcm9sdwkkNCwgJWJwCQkJIyByb3RhdGUgdG8gdXNlIGxvdyA0IGJpdHMKKwltb3ZiCSQweDBm
LCAlYWwKKwlhbmR3CSVicCwgJWF4CQkjICVhbCA9IG1hc2sgZm9yIG55YmJsZQorCWFkZGIJJDB4
OTAsICVhbAkJIyBjb252ZXJ0ICVhbCB0byBhc2NpaSBoZXgKKwlkYWEJCQkJIyBpbiBvbmx5IGZv
dXIgaW5zdHJ1Y3Rpb25zIQorCWFkY2IJJDB4NDAsICVhbAorCWRhYQorCWNhbGwJcHV0YwkJCSMg
c2V0ICVhaCBhbmQgJWJ4CisJbG9vcAlwcmludF9kaWdpdAorCW1vdmIJJDB4MjAsICVhbAkJIyBT
UEFDRQorCWludAkkMHgxMAorCXBvcHcJJWN4CisJbG9vcAlwcmludF9sb29wCisJeGNoZwklYXgs
ICVjeAkJIyAlYWggPSAwCisjZWxzZQorCWNidwkJCQkjICVhaCA9IDAKKyNlbmRpZgorICAgICAg
ICBpbnQgICAgICQweDEzCQkJIyByZXNldCBjb250cm9sZXIKKwlwb3BhCQkJCSMgcmVzdG9yZSBj
b250ZXh0CityZWFkX3NlY3RvcnNscDoKK3JlYWRfZmlyc3Rfc2VjdG9yOgorICAgICAgICBwdXNo
dyAgICVkaQkJCSMgc2VjdG9yIGNvdW50CisgICAgICAgIHB1c2h3ICAgJWF4CQkJIyBsaW1pdHMK
KyAgICAgICAgcHVzaHcgICAlZHgKKyAgICAgICAgcHVzaHcgICAlY3gKKwl4b3J3CSVieCwgJWJ4
CisjaWZkZWYgVFJBQ0tfQllfVFJBQ0sKKwlzdWJiCSVjbCwgJWFsCQkjIHNlY3RvcnMgcmVtYWlu
aW5nIGluIHRyYWNrCisJamEJdG9sYXN0c2VjdAorCW1vdmIJJDEsICVhbAkJCSMgMSBzZWN0b3Ig
bWluaQordG9sYXN0c2VjdDoKKwljYncKKwljbXB3CSVkaSwgJWF4CisJamIJbW9yZTF0cmsKKwlt
b3Z3CSVkaSwgJWF4CQkjIHNlY3RvcnMgdG8gcmVhZAorbW9yZTF0cms6CisJcHVzaAklYXgKKwlt
b3ZiCSQyLCAlYWgJCQkjIGNtZDogcmVhZCBjaHMKKyNlbHNlCisgICAgICAgIG1vdncgICAgJDB4
MjAxLCAlYXgJCSMgc2VjdG9yIGJ5IHNlY3RvcgorCXB1c2gJJWF4CisjZW5kaWYKKyAgICAgICAg
aW50ICAgICAkMHgxMworCXhjaGcJJWF4LCAlYnAJCSMgc3RhdHVzCisgICAgICAgIHBvcHcgICAg
JWJ4CQkJIyAlYXggCisgICAgICAgIHBvcHcgICAgJWN4CisgICAgICAgIHBvcHcgICAgJWR4Cisg
ICAgICAgIHBvcHcgICAgJWF4CQkJIyBsaW1pdHMKKyAgICAgICAgcG9wdyAgICAlZGkJCQkjIHNl
Y3RvciBjb3VudAorCWpjCWNoZWNrX2xpbWl0cworbmV4dF9zZWN0b3I6CisjaWZkZWYgVFJBQ0tf
QllfVFJBQ0sKKwlzdWJ3CSVieCwlZGkJCQkjIHVwZGF0ZSBzZWN0b3IgY291bnRlcgorCWFkZHcJ
JWJ4LCVjeAkJCSMgbmV4dCBzZWN0b3IKKwlzaGx3CSQ1LCVieAkJCSMgc2VjdG9ycyAtPiBwYXJh
Z3JhZ2hzCisJbW92dwklZXMsICVicAorCWFkZHcJJWJ4LCAlYnAKKyNlbHNlCisJZGVjdwklZGkJ
CQkjIHVwZGF0ZSBzZWN0b3IgY291bnRlcgorCWluY3cJJWN4CQkJIyBuZXh0IHNlY3RvcgorCW1v
dncJJWVzLCAlYnAKKwlhZGR3CSQzMiwgJWJwCQkjIHNlY3RvciBzaXplIGluIHBhcmFncmFnaHMK
KyNlbmRpZgorCW1vdncJJWJwLCAlZXMJCSMgbmV4dCBsb2NhdGlvbgorICAgICAgICBjbXBiICAg
ICVhbCwlY2wJCQkjIHJlYWNoIHNlY3RvciBsaW1pdCA/CisgICAgICAgIGpuZSAgICAgYmRlbmRs
cAorbmV4dF9oZWFkOgorICAgICAgICBtb3ZiICAgICVjbCwlYWwKKyAgICAgICAgaW5jYiAgICAl
ZGgJCQkjIG5leHQgaGVhZAorICAgICAgICBtb3ZiICAgICQxLCVjbAkJCSMgZmlyc3Qgc2VjdG9y
CisgICAgICAgIGNtcGIgICAgJWFoLCVkaAkJCSMgcmVhY2ggaGVhZCBsaW1pdCA/CisgICAgICAg
IGpuZSAgICAgYmRlbmRscAorbmV4dF90cmFjazoKKyAgICAgICAgbW92YiAgICAlZGgsJWFoCisg
ICAgICAgIG1vdmIgICAgJDAsJWRoCQkJIyBmaXJzdCBoZWFkCisjIE5PVEUgOiBzdXBwb3J0IDI1
NiBjeWxpbmRlcnMgbWF4CisgICAgICAgIGluY2IgICAgJWNoCQkJIyBuZXh0IGN5bGluZGVyCiti
ZGVuZGxwOgorY3VyZHJpdmUgPQlfc3RhcnQKK2N1cmR4CT0JX3N0YXJ0CitjdXJjeAk9CV9zdGFy
dCsyCitsaW1pdHMJPQlfc3RhcnQrNAorCW1vdncJJWR4LCBjdXJkeAkJIyBzYXZlIGRpc2sgc3Rh
dGUKKwltb3Z3CSVjeCwgY3VyY3gKKwltb3Z3CSVheCwgbGltaXRzCityZWFkX3NlY3RvcnM6CisJ
bW92dwljdXJkeCwgJWR4CQkjIHJlc3RvcmUgZGlzayBzdGF0ZQorCW1vdncJY3VyY3gsICVjeAor
IyAgIGFsIGlzIGxhc3Qgc2VjdG9yKzEKKyMgICBhaCBpcyBsYXN0IGhlYWQrMQorCW1vdncJbGlt
aXRzLCAlYXgKKwlvcncJJWRpLCVkaQorICAgICAgICBqbmUJcmVhZF9zZWN0b3JzbHAKKwltb3Zi
CSQweDJlLCAlYWwgCQkjIGxvYWRpbmcuLi4gbWVzc2FnZSAyZSA9IC4KK3B1dGM6CisJbW92Ygkk
MHhlLCAlYWgKKwltb3Z3CSQ3LCAlYngJCQkjICAgb25lIGRvdCBlYWNoIDY0aworIAlpbnQJJDB4
MTAKK3JldHVybjoKKwlyZXQKKworcHJpbnRfbmw6CisJCisJbW92YgkkMHhkLCAlYWwJCSMgQ1IK
KwljYWxsCXB1dGMKKwltb3ZiCSQweGEsICVhbAkJIyBMRgorCWptcAlwdXRjCisKK3B1dHM6CisJ
Y2FsbAlwcmludF9ubAkJIyBzZXQgJWFoIGFuZCAlYngKK3B1dHNscDoKKwlsb2RzYgorCW9yYgkl
YWwsJWFsCQkJIyBlbmQgb2Ygc3RyaW5nIGlzIFwwCisJanoJcmV0dXJuCitwdXRjczoKKwlpbnQJ
JDB4MTAKKwlqbXAJcHV0c2xwCiAKLQkub3JnIDQ5NworZmxvcHB5X3RhYmxlOgorI2lmZGVmIEVY
VFJBX0RFVklDRVMJCQorCQkuYnl0ZQkxNiw5CQkJIyAvZGV2L2ZkMHU3MjAKKwkJLmJ5dGUJMTIs
MTAJCQkjIC9kZXYvZmQwdTgwMAorCQkuYnl0ZQk4MCwxMQkJCSMgL2Rldi9mZDB1ODgwCisJCS5i
eXRlCTEyNSwyMAkJCSMgL2Rldi9mZDB1MTYwMAorCQkuYnl0ZQk0NCwyMQkJCSMgL2Rldi9mZDB1
MTY4MAorCQkuYnl0ZQk5NiwyMgkJCSMgL2Rldi9mZDB1MTc2MAorCQkuYnl0ZQkxMTYsMjMJCQkj
IC9kZXYvZmQwdTE4NDAKKwkJLmJ5dGUJMTAwLDI0CQkJIyAvZGV2L2ZkMHUxOTIwCisJCS5ieXRl
CTEwNSw0MAkJCSMgL2Rldi9mZDB1MzIwMAorCQkuYnl0ZQkxMDksNDQJCQkjIC9kZXYvZmQwdTM1
MjAKKwkJLmJ5dGUJMTEzLDQ4CQkJIyAvZGV2L2ZkMHUzODQwCisjZW5kaWYJCQorCQkuYnl0ZQk4
LDE1CQkJIyAvZGV2L2ZkMGgxMjAwIC0gL2Rldi9wczAKKwkJLmJ5dGUJMjgsMTgJCQkjIC9kZXYv
ZmQwdTE0NDAgLSAvZGV2L1BTMAorCQkuYnl0ZQkzMiwzNgkJCSMgL2Rldi9mZDB1Mjg4MCAtIC9k
ZXYvZmQwSDI4ODAKKwkJLmJ5dGUJMCwxMjgJCQkjIC9kZXYvZmQwIC0gZGVmYXVsdDogYXV0b2Rl
dGVjdAorCityZWdzOgkJLmFzY2l6CSJYOiIKKworI2lmbmRlZglESVNQTEFZX0tFUk5FTF9WRVJT
SU9OCittc2cxOgkJLmFzY2l6CSJMb2FkaW5nIgorI2VuZGlmCQkKKwordGFpbDoKKwkJLnNwYWNl
CTQ5NStzdGFydC10YWlsCQkKKworIy5vcmcgNDk1CitzeXNfc2VjdHM6CS53b3JkIFNZU1NJWkUg
LyAzMgkJIyBzaXplIG1heCBpcyBub3cgMzJNYgorIy5vcmcgNDk3CiBzZXR1cF9zZWN0czoJLmJ5
dGUgU0VUVVBTRUNUUwogcm9vdF9mbGFnczoJLndvcmQgUk9PVF9SRE9OTFkKLXN5c3NpemU6CS53
b3JkIFNZU1NJWkUKK3N5c3NpemU6CS53b3JkIFNZU1NJWkUgJSAweDEwMDAwCQkjIHNpemUgbWF4
IHdhcyAxTWIKIHN3YXBfZGV2Ogkud29yZCBTV0FQX0RFVgotcmFtX3NpemU6CS53b3JkIFJBTURJ
U0sKK3JhbV9zaXplOgkud29yZCBSQU1ESVNLCQkJIyByYW1kaXNrIHNpemUsIHJhbWRpc2sgZmxh
Z3MgYW5kIGNtZGxpbmUgZmxhZwogdmlkX21vZGU6CS53b3JkIFNWR0FfTU9ERQogcm9vdF9kZXY6
CS53b3JkIFJPT1RfREVWCiBib290X2ZsYWc6CS53b3JkIDB4QUE1NQpkaWZmIC1wdXJOIGxpbnV4
LTIuNi4xMy9hcmNoL3g4Nl82NC9ib290L3Rvb2xzL2J1aWxkLmMgbGludXgtMi42LjEzLWJvb3Ri
bG9jay9hcmNoL3g4Nl82NC9ib290L3Rvb2xzL2J1aWxkLmMKLS0tIGxpbnV4LTIuNi4xMy9hcmNo
L3g4Nl82NC9ib290L3Rvb2xzL2J1aWxkLmMJMjAwNS0wOS0xMiAxMDozODo1Ny4wMDAwMDAwMDAg
KzAyMDAKKysrIGxpbnV4LTIuNi4xMy1ib290YmxvY2svYXJjaC94ODZfNjQvYm9vdC90b29scy9i
dWlsZC5jCTIwMDUtMDktMTIgMTE6MDA6NDQuMDAwMDAwMDAwICswMjAwCkBAIC0xNjksMTAgKzE2
OSwxMyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKiBhcmd2KQogCX0KIAljbG9zZShmZCk7
CiAKLQlpZiAobHNlZWsoMSwgNDk3LCBTRUVLX1NFVCkgIT0gNDk3KQkJICAgIC8qIFdyaXRlIHNp
emVzIHRvIHRoZSBib290c2VjdG9yICovCisJaWYgKGxzZWVrKDEsIDQ5NSwgU0VFS19TRVQpICE9
IDQ5NSkJCSAgICAvKiBXcml0ZSBzaXplcyB0byB0aGUgYm9vdHNlY3RvciAqLwogCQlkaWUoIk91
dHB1dDogc2VlayBmYWlsZWQiKTsKLQlidWZbMF0gPSBzZXR1cF9zZWN0b3JzOwotCWlmICh3cml0
ZSgxLCBidWYsIDEpICE9IDEpCisJc3ogPSAoc2Iuc3Rfc2l6ZSArIDUxMSkgLyA1MTI7CisJYnVm
WzBdID0gKHN6ICYgMHhmZik7CisJYnVmWzFdID0gKChzeiA+PiA4KSAmIDB4ZmYpOworCWJ1Zlsy
XSA9IHNldHVwX3NlY3RvcnM7CisJaWYgKHdyaXRlKDEsIGJ1ZiwgMykgIT0gMykKIAkJZGllKCJX
cml0ZSBvZiBzZXR1cCBzZWN0b3IgY291bnQgZmFpbGVkIik7CiAJaWYgKGxzZWVrKDEsIDUwMCwg
U0VFS19TRVQpICE9IDUwMCkKIAkJZGllKCJPdXRwdXQ6IHNlZWsgZmFpbGVkIik7CmRpZmYgLXB1
ck4gbGludXgtMi42LjEzL0RvY3VtZW50YXRpb24vaTM4Ni9ib290LnR4dCBsaW51eC0yLjYuMTMt
Ym9vdGJsb2NrL0RvY3VtZW50YXRpb24vaTM4Ni9ib290LnR4dAotLS0gbGludXgtMi42LjEzL0Rv
Y3VtZW50YXRpb24vaTM4Ni9ib290LnR4dAkyMDA1LTA5LTEyIDEwOjM2OjUwLjAwMDAwMDAwMCAr
MDIwMAorKysgbGludXgtMi42LjEzLWJvb3RibG9jay9Eb2N1bWVudGF0aW9uL2kzODYvYm9vdC50
eHQJMjAwNS0wOS0xMiAxMjoyMjo0My4wMDAwMDAwMDAgKzAyMDAKQEAgLTEwMyw2ICsxMDMsNyBA
QCBUaGUgaGVhZGVyIGxvb2tzIGxpa2U6CiBPZmZzZXQJUHJvdG8JTmFtZQkJTWVhbmluZwogL1Np
emUKIAorMDFFRi8yCU4vQQlzeXNfc2VjdHMJRE8gTk9UIFVTRSAtIGZvciBib290c2VjdC5TIHVz
ZSBvbmx5CiAwMUYxLzEJQUxMCXNldHVwX3NlY3RzCVRoZSBzaXplIG9mIHRoZSBzZXR1cCBpbiBz
ZWN0b3JzCiAwMUYyLzIJQUxMCXJvb3RfZmxhZ3MJSWYgc2V0LCB0aGUgcm9vdCBpcyBtb3VudGVk
IHJlYWRvbmx5CiAwMUY0LzIJQUxMCXN5c3NpemUJCURPIE5PVCBVU0UgLSBmb3IgYm9vdHNlY3Qu
UyB1c2Ugb25seQpkaWZmIC1wdXJOIGxpbnV4LTIuNi4xMy9Eb2N1bWVudGF0aW9uL3JhbWRpc2su
dHh0IGxpbnV4LTIuNi4xMy1ib290YmxvY2svRG9jdW1lbnRhdGlvbi9yYW1kaXNrLnR4dAotLS0g
bGludXgtMi42LjEzL0RvY3VtZW50YXRpb24vcmFtZGlzay50eHQJMjAwNS0wOS0xMiAxMDozNToz
OS4wMDAwMDAwMDAgKzAyMDAKKysrIGxpbnV4LTIuNi4xMy1ib290YmxvY2svRG9jdW1lbnRhdGlv
bi9yYW1kaXNrLnR4dAkyMDA1LTA5LTEyIDEwOjU1OjM1LjAwMDAwMDAwMCArMDIwMApAQCAtNjMs
MTIgKzYzLDE0IEBAIHRvIDIgTUIgKDJeMTEpIG9mIHdoZXJlIHRvIGZpbmQgdGhlIFJBTSAKIDE0
IGluZGljYXRlcyB0aGF0IGEgUkFNIGRpc2sgaXMgdG8gYmUgbG9hZGVkLCBhbmQgYml0IDE1IGlu
ZGljYXRlcyB3aGV0aGVyIGEKIHByb21wdC93YWl0IHNlcXVlbmNlIGlzIHRvIGJlIGdpdmVuIGJl
Zm9yZSB0cnlpbmcgdG8gcmVhZCB0aGUgUkFNIGRpc2suIFNpbmNlCiB0aGUgUkFNIGRpc2sgZHlu
YW1pY2FsbHkgZ3Jvd3MgYXMgZGF0YSBpcyBiZWluZyB3cml0dGVuIGludG8gaXQsIGEgc2l6ZSBm
aWVsZAotaXMgbm90IHJlcXVpcmVkLiBCaXRzIDExIHRvIDEzIGFyZSBub3QgY3VycmVudGx5IHVz
ZWQgYW5kIG1heSBhcyB3ZWxsIGJlIHplcm8uCitpcyBub3QgcmVxdWlyZWQuIEJpdCAxMyBpbmRp
Y2F0ZXMgdGhhdCBhIGNtZGxpbmUgaXMgdG8gYmUgbG9hZGVkIGJ5IHRoZSBrZXJuZWwKK2Jvb3Ri
bG9jaywgQml0cyAxMSB0byAxMiBhcmUgbm90IGN1cnJlbnRseSB1c2VkIGFuZCBtYXkgYXMgd2Vs
bCBiZSB6ZXJvLgogVGhlc2UgbnVtYmVycyBhcmUgbm8gbWFnaWNhbCBzZWNyZXRzLCBhcyBzZWVu
IGJlbG93OgogCiAuL2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYzojZGVmaW5lIFJBTURJU0tfSU1B
R0VfU1RBUlRfTUFTSyAgICAgMHgwN0ZGCiAuL2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYzojZGVm
aW5lIFJBTURJU0tfUFJPTVBUX0ZMQUcgICAgICAgICAgMHg4MDAwCiAuL2FyY2gvaTM4Ni9rZXJu
ZWwvc2V0dXAuYzojZGVmaW5lIFJBTURJU0tfTE9BRF9GTEFHICAgICAgICAgICAgMHg0MDAwCisu
L2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYzojZGVmaW5lIENNRExJTkVfTE9BRF9GTEFHICAgICAg
ICAgICAgMHgyMDAwCiAKIENvbnNpZGVyIGEgdHlwaWNhbCB0d28gZmxvcHB5IGRpc2sgc2V0dXAs
IHdoZXJlIHlvdSB3aWxsIGhhdmUgdGhlIAoga2VybmVsIG9uIGRpc2sgb25lLCBhbmQgaGF2ZSBh
bHJlYWR5IHB1dCBhIFJBTSBkaXNrIGltYWdlIG9udG8gZGlzayAjMi4KQEAgLTE1OSw2ICsxNjEs
OCBAQCB1c2VycyBtYXkgd2lzaCB0byBjb21iaW5lIHN0ZXBzIChkKSBhbmQgCiBDaGFuZ2Vsb2c6
CiAtLS0tLS0tLS0tCiAKKzA5LTA1IDoJCVJlc2VydmUgQ01ETElORV9MT0FEIGJpdC4KKwogMTAt
MjItMDQgOglVcGRhdGVkIHRvIHJlZmxlY3QgY2hhbmdlcyBpbiBjb21tYW5kIGxpbmUgb3B0aW9u
cywgcmVtb3ZlCiAJCW9ic29sZXRlIHJlZmVyZW5jZXMsIGdlbmVyYWwgY2xlYW51cC4KIAkJSmFt
ZXMgTmVsc29uIChqYW1lczQ3NjVAZ21haWwuY29tKQo
--MIMEStream=_0+288847_91228134754_2059427134795--
Re: [i386 BOOT CODE] kernel bootable again
#306430
Author: "H. Peter Anvin"
Date: Tue, 13 Sep 2005 12:42
35 lines
1167 bytes
Frank Sorenson wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Pascal Bellard wrote:
>
>>Hello,
>>
>>Please find attached a patch to build i386/x86_64 kernel directly
>>bootable. It may be usefull for rescue floppies and installation
>>floppies.
>
>
> Pascal,
>
> In commit f8eeaaf4180334a8e5c3582fe62a5f8176a8c124, build.c has already
> changed, and I don't believe it's very compatible with this change.
>
> See
> http://www.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;høeeaaf4180334a8e5c3582fe62a5f8176a8c124
>
> Also, we'll need to see comments from H. Peter Anvin on this patch.
> CC'ing him.
>

Geometry detection by looking for error returns is fundamentally broken.
  Way too many non-traditional floppies (USB, IDE...) do not handle this
at all, they will return successfully, with the data being the data from
a sector from another track, and thus you end up with aliasing and a
corrupt boot.  You can do it with fingerprinting, but that's complex and
error-prone.

In short, this made sense in 1991, but it hasn't made sense for a very
long time now.  Resurrecting bootsect.S is *NOT* a good idea.

	-hpa
Re: [i386 BOOT CODE] kernel bootable again
#306409
Author: Frank Sorenson
Date: Tue, 13 Sep 2005 13:04
1279 lines
36426 bytes
This is a multi-part message in MIME format.
--------------050004020807060004040109
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Pascal Bellard wrote:
> Hello,
>
> Please find attached a patch to build i386/x86_64 kernel directly
> bootable. It may be usefull for rescue floppies and installation
> floppies.

Pascal,

In commit f8eeaaf4180334a8e5c3582fe62a5f8176a8c124, build.c has already
changed, and I don't believe it's very compatible with this change.

See
http://www.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;høeeaaf4180334a8e5c3582fe62a5f8176a8c124

Also, we'll need to see comments from H. Peter Anvin on this patch.
CC'ing him.


> System sector count is updated by tools/bluid.c at offset 495. The
> system could be up to 32 Mb long.
>
> -- support any drive geometry --
>
> Disk geometry detection assumes that no error raises on first track.
> First track is read sector by sector and the first error determinates
> the sectors per track count. Next, reads are performed track by track.
> Tested on floppy H2/S18 and harddisk H16/S63. Should work on
> every exotic drive supporting Int13h CHS.
>
> -- cmdline support --
>
> If ram_size (offset 504) bit 13 is set, the kernel cmdline
> is load from the sector following the kernel image.
>
> If Ctrl, Alt, Shift or CapsLock is pressed the kernel cmdline is
> prompted until Enter key. BackSpace is supported.
>
> Regards,
>
> -pascal

Frank
- --
Frank Sorenson - KD7TZK
Systems Manager, Computer Science Department
Brigham Young University
frank@tuxrocks.com
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.6 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org

iD8DBQFDJyKhaI0dwg4A47wRAjMoAJ9laL5kvIzkbJAxigSJahqkdnmx8gCg6dOy
V6ML9fJQjmfjcdxNGnbSuZ0=7P9o
-----END PGP SIGNATURE-----

--------------050004020807060004040109
Content-Type: text/x-patch;
 name="linux-2_6_13-bootblock.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="linux-2_6_13-bootblock.patch"

diff -purN linux-2.6.13/arch/i386/boot/bootsect.S linux-2.6.13-bootblock/arch/i386/boot/bootsect.S
--- linux-2.6.13/arch/i386/boot/bootsect.S	2005-09-12 10:37:52.000000000 +0200
+++ linux-2.6.13-bootblock/arch/i386/boot/bootsect.S	2005-09-12 10:40:19.000000000 +0200
@@ -4,20 +4,31 @@
  *	modified by Drew Eckhardt
  *	modified by Bruce Evans (bde)
  *	modified by Chris Noe (May 1999) (as86 -> gas)
- *	gutted by H. Peter Anvin (Jan 2003)
+ *
+ *      rewritten to support up to 32Mb kernel, cmdline
+ *      and any disk geometry by <pascal.bellard@ads-lu.com>
  *
  * BIG FAT NOTE: We're in real mode using 64k segments.  Therefore segment
  * addresses must be multiplied by 16 to obtain their respective linear
  * addresses. To avoid confusion, linear addresses are written using leading
  * hex while segment addresses are written as segment:offset.
  *
+ * bde - should not jump blindly, there may be systems with only 512K low
+ * memory.  Use int 0x12 to get the top of memory, etc.
+ *
+ * It then loads 'setup' directly after itself (0x90200), and the system
+ * at 0x10000, using BIOS interrupts.
+ *
+ * The loader has been made as simple as possible, and continuous
+ * read errors will result in a unbreakable loop. Reboot by hand. It
+ * loads pretty fast by getting whole tracks at a time whenever possible.
  */

 #include <asm/boot.h>

 SETUPSECTS	= 4			/* default nr of setup-sectors */
 BOOTSEG		= 0x07C0		/* original address of boot-sector */
-INITSEG		= DEF_INITSEG		/* we move boot here - out of the way */
+INITSEG		= DEF_INITSEG		/* we load boot here - out of the way */
 SETUPSEG	= DEF_SETUPSEG		/* setup starts here */
 SYSSEG		= DEF_SYSSEG		/* system loaded at 0x10000 (65536) */
 SYSSIZE		= DEF_SYSSIZE		/* system size: # of 16-byte clicks */
@@ -25,6 +36,12 @@ SYSSIZE		= DEF_SYSSIZE		/* system size:
 ROOT_DEV	= 0 			/* ROOT_DEV is now written by "build" */
 SWAP_DEV	= 0			/* SWAP_DEV is now written by "build" */

+/* some extra features */
+#define DISPLAY_KERNEL_VERSION		as soon as possible
+#define	EDIT_CMDLINE			on hotkey
+#define	LOAD_CMDLINE			according to bit ramsize.13
+#define EXTRA_DEVICES			to fill root_device
+
 #ifndef SVGA_MODE
 #define SVGA_MODE ASK_VGA
 #endif
@@ -42,57 +59,470 @@ SWAP_DEV	= 0			/* SWAP_DEV is now writte

 .global _start
 _start:
+	cld				# assume nothing
+	movw	$INITSEG, %ax
+	movw	%ax, %es		# %ax = %es = INITSEG
+#if MOVE_BOOTSECTOR
+# First things first. Move ourself from 0x7C00 -> 0x90000 and jump there.
+	movw	$BOOTSEG, %cx
+	movw	%cx, %ds		# %ds = BOOTSEG
+	movb	$1, %ch			# %cx = 256
+	subw	%si, %si
+	subw	%di, %di
+	rep
+	movsw
+	ljmp	$INITSEG, $go
+go:
+#else
+	xorw	%cx, %cx		# %cx = 0
+#endif

-	# Normalize the start address
-	jmpl	$BOOTSEG, $start2
+# bde - changed 0xff00 to 0x4000 to use debugger at 0x6400 up (bde).  We
+# wouldn't have to worry about this if we checked the top of memory.  Also
+# my BIOS can be configured to put the wini drive tables in high memory
+# instead of in the vector table.  The old stack might have clobbered the
+# drive table.
+
+	movw	$0x4000-12, %di		# 0x4000 is an arbitrary value >+					# length of bootsect + length of
+					# setup + room for stack;
+					# 12 is disk parm size.
+					# gdt will heat 48 more bytes.
+	movw	%ax, %ss		# %ax and %es already contain INITSEG
+	movw	%di, %sp		# put stack at INITSEG:0x4000-12.
+
+# Many BIOS's default disk parameter tables will not recognize
+# multi-sector reads beyond the maximum sector number specified
+# in the default diskette parameter tables - this may mean 7
+# sectors in some cases.
+#
+# Since single sector reads are slow and out of the question,
+# we must take care of this by creating new parameter tables
+# (for the first disk) in RAM.  We can set the maximum sector
+# count to 36 - the most we will encounter on an ED 2.88.
+#
+# High doesn't hurt.  Low does.  Let's use the max: 63
+#
+# Segments are as follows: %es = %ss = INITSEG,
+# %fs and %gs are unused.
+
+	movw	$0x78, %bx		# %ds:%bx is parameter table address
+	movw	%cx, %ds		# %ds = 0
+	ldsw	(%bx), %si		# %ds:%si is source
+	movb	$6, %cl			# copy 12 bytes
+	rep				# don't worry about cld
+	movsw				# already done above
+	movw	%cx, %ds		# %ds = 0
+	movw	%sp, (%bx)		# %sp = 0x4000-12
+	movw	%es, 2(%bx)
+	pushw	%es
+	popw	%ds			# now %ds = %es = %ss = INITSEG
+	movb	$63, 0x4-12(%di)	# patch sector count, %di = 0x4000
+
+	cli
+	cbw				# %ax = 0 : geometry unknown yet
+	xorb	%dh, %dh		# head 0, current drive
+	incw	%cx			# cylinder 0, sector 1
+	movw	%cx, %di		# read 1 sector
+	call	read_first_sector	# read bootsector again to have
+					# access to data segment
+
+#ifndef	DISPLAY_KERNEL_VERSION
+	movw	$msg1, %si
+	call	puts
+#endif

-start2:
-	movw	%cs, %ax
-	movw	%ax, %ds
-	movw	%ax, %es
-	movw	%ax, %ss
-	movw	$0x7c00, %sp
-	sti
-	cld
+# Load the setup-sectors directly after the moved bootblock (at 0x90200).

-	movw	$bugger_off_msg, %si
+	movb	setup_sects, %al
+#ifdef CHECK_SETUP_SIZE
+	orb	%al, %al
+	jne	setup_size_ok
+	movb	$SETUPSECTS, %al
+setup_size_ok:
+#endif
+	cbw
+	xchg	%ax, %di
+	call	read_sectors		# read setup
+
+#ifdef	DISPLAY_KERNEL_VERSION
+#define kernel_version	0xE
+	movw	$0x200,%si
+	addw	kernel_version(%si),%si	# starting protocol 2.00, Kernel 1.3.73
+	call	puts			# show which kernel we are loading
+#endif

-msg_loop:
-	lodsb
-	andb	%al, %al
-	jz	die
-	movb	$0xe, %ah
-	movw	$7, %bx
-	int	$0x10
-	jmp	msg_loop
+# This routine loads the system at address SYSSEG, making sure
+# no 64kB boundaries are crossed. We try to load it as fast as
+# possible, loading whole tracks whenever we can.
+
+#ifdef __BIG_KERNEL__
+type_of_loader	=	528
+	movw	$24, %cx		# allocate 48 bytes in stack
+init_gdt:
+	push	$0			#   initialized with 0
+	loop	init_gdt
+	movw	%sp, %si		# for bootsect_gdt
+	movw	$0x9300+(SYSSEG/4096), %ax	# source = SYSSEG
+	cwd
+	movw	%ax, 20(%si)		# bootsect_src_base+2
+	movb	$0x10-1, %al		# destination = 0x100000
+	movw	%ax, 28(%si)		# bootsect_dst_base+2
+	movw	%dx, 16(%si)		# bootsect_src = 64Kb
+	movw	%dx, 24(%si)		# bootsect_dst = 64Kb
+	movb	%dl, type_of_loader	# loader type = 0xFF
+syslp:
+	movw	$SYSSEG, %ax
+	movw	%ax, %es
+	movw	$128,%di		# 64Kb in sectors
+	subw	%di, sys_sects
+	pushf
+	jnc	not_last
+	addw	sys_sects, %di
+not_last:
+	call	read_sectors
+	incw	28(%si)			# bootsect_dst_base+2
+	movw	$0x8000, %cx		# full 64K
+	movb	$0x87, %ah
+	push	%ss
+	pop	%es			# gdt in es:si
+	int	$0x15
+	popf
+	ja	syslp
+#else
+	movw	$SYSSEG, %ax
+	movw	%ax, %es
+syslp:
+	movw	$128*32,%ax		# 64Kb in paragraphs
+	subw	%ax, syssize
+	pushf
+	jnc	not_last
+	addw	syssize, %ax
+not_last:
+	movb	$5, %cl			# paragraphs -> sectors
+	shrw	%cl, %ax
+	xchg	%ax, %di
+	call	read_sectors
+	popf
+	ja	syslp
+#endif

-die:
-	# Allow the user to press a key, then reboot
-	xorw	%ax, %ax
-	int	$0x16
-	int	$0x19
+# After that we check which root-device to use. If the device is
+# defined (!= 0), nothing is done and the given device is used.
+# Otherwise, one of /dev/fd0H2880 (2,32) or /dev/PS0 (2,28) or /dev/at0 (2,8)
+# depending on the number of sectors we pretend to know we have.
+
+
+	movw	root_dev, %ax
+	orw	%ax, %ax
+	jnz	root_defined
+
+	movw	$floppy_table,%si
+scan_floppy_table:
+	lodsw
+	cmpb	limits, %ah
+	je	set_root
+	jno	scan_floppy_table
+set_root:
+	movb	$2, %ah
+	addb	%dl, %al		# add current (floppy) drive
+	movw	%ax, root_dev
+root_defined:
+
+#if defined(LOAD_CMDLINE) || defined(EDIT_CMDLINE)
+#define BUFFER	0x7F00
+	movw	$BUFFER, %si
+	movw	%si, (%si)		# default : no cmdline
+#endif

-	# int 0x19 should never return.  In case it does anyway,
-	# invoke the BIOS reset code...
-	ljmp	$0xf000,$0xfff0
+#ifdef	LOAD_CMDLINE
+	testb	$0x20,ram_size+1	# bit 11 to 13 where unused
+					# now bit 13 means: load cmdline
+	jz	nocmd
+	movw	$BUFFER/16+INITSEG, %ax
+	movw	%ax, %es
+	movw	$1, %di			# cmdline = 512 bytes max
+	call	read_sectors
+nocmd:
+#endif

+#define RSHFT   0x01
+#define LSHFT   0x02
+#define CTRL    0x04
+#define ALT     0x08
+#define SCRLCK  0x10
+#define NUMLCK  0x20
+#define CAPSLCK 0x40
+#define INSERT  0x80
+
+#ifdef	EDIT_CMDLINE
+# The cmdline can be entered and modifed on hot key.
+# Only characters before the cursor are passed to the kernel.
+	movb	$2, %ah			# get keyboard status
+	int	$0x16
+	testb	$RSHFT|LSHFT|CTRL|ALT|CAPSLCK, %al
+	jz	nocmdline
+	pushw	%si
+	call	puts			# set %ah and %bx
+cmdlp:
+# if 1
+	movb	$32, %al		# clear end of line
+	int	$0x10			#  with Space
+	movb	$8, %al			#   and BackSpace
+	int	$0x10
+# endif
+	decw	%si
+cmdget:
+	cbw				# %ah = 0, get keyboard character
+	int	$0x16
+	cmpb	$8, %al			# BackSpace ?
+	je	cmdbs
+	cbw
+	movw	%ax, (%si)		# store end of string too
+	incw	%si
+	incw	%si
+cmdbs:
+	cmpw	$BUFFER, %si		# lower limit is checked
+	je	cmdget			#   but upper limit not
+	call	putc
+	cmpb	$13, %al		# Enter ?
+	jne	cmdlp
+	popw	%si
+nocmdline:
+#endif

-bugger_off_msg:
-	.ascii	"Direct booting from floppy is no longer supported.\r\n"
-	.ascii	"Please use a boot loader program instead.\r\n"
-	.ascii	"\n"
-	.ascii	"Remove disk and press any key to reboot . . .\r\n"
-	.byte	0
+#if defined(LOAD_CMDLINE) || defined(EDIT_CMDLINE)
+#if 1
+cmd_line_magic	=	0x20
+cmd_line_offset	=	0x22
+	movw	$0xA33F, cmd_line_magic
+	movw	%si, cmd_line_offset
+#else
+# protocol >= 2.02, starting Kernel 2.4.0-test3-pre3
+cmd_line_ptr	=	0x228
+	movzx	%si, %eax
+	addl	$INITSEG*16, %eax
+	movl	%eax, cmd_line_ptr
+#endif
+emptycmdline:
+#endif
+
+# This procedure turns off the floppy drive motor, so
+# that we enter the kernel in a known state, and
+# don't have to worry about it later.
+
+#if 1
+kill_motor:
+	xorw	%ax, %ax		# reset FDC
+	int	$0x13
+#else
+kill_motor:
+	movw	$0x3f2, %dx
+	xorb	%al, %al
+	outb	%al, %dx
+#endif

+	call	print_nl

-	# Kernel attributes; used by setup
+# After that (everything loaded), we jump to the setup-routine
+# loaded directly after the bootblock:
+# Segments are as follows: %ds = %ss = INITSEG
+
+	ljmp	$SETUPSEG, $0
+
+# read_sectors reads %di sectors into %es:0 buffer.
+# %es:0 is updated to the next memory location.
+# First, sectors are read sector by sector until
+# sector per track count is known. Then they are
+# read track by track.
+# Assume no error on first track.
+
+#define TRACK_BY_TRACK	load as fast as possible !
+#define SHOW_REGS	show int13 status & parameters
+
+check_limits:
+        cmpb    %al, %cl		# max sector known ?
+        ja	next_head		#   no -> store it
+        cmpb    %ah, %dh		# max head known ?
+        ja	next_track		#   no -> store it
+	pusha				# save context
+#ifdef SHOW_REGS
+	pushw	%es			# print %es (named EX)
+	pushw	%dx			# print %dx
+	pushw	%cx			# print %cx
+	xorw	%cx, %cx
+	pushw	%cx			# print %bx
+# ifdef TRACK_BY_TRACK
+	movb	$2, %bh
+# endif
+	pushw	%bx			# print %ax
+	movb	$6,%cl
+	jmp	print_all		# print %bp (status)
+print_loop:
+	movb	$0x6 + 'A' - 1, %al
+	subb	%cl, %al
+	movw	$regs, %si		# caller %si is saved
+	call	putcs			# putc(%al) + puts(%si)
+# it will print out all of the registers.
+	popw	%bp			# load word into %bp
+print_all:
+	pushw	%cx			# save count remaining
+	movb	$4, %cl			# 4 hex digits
+print_digit:
+	rolw	$4, %bp			# rotate to use low 4 bits
+	movb	$0x0f, %al
+	andw	%bp, %ax		# %al = mask for nybble
+	addb	$0x90, %al		# convert %al to ascii hex
+	daa				# in only four instructions!
+	adcb	$0x40, %al
+	daa
+	call	putc			# set %ah and %bx
+	loop	print_digit
+	movb	$0x20, %al		# SPACE
+	int	$0x10
+	popw	%cx
+	loop	print_loop
+	xchg	%ax, %cx		# %ah = 0
+#else
+	cbw				# %ah = 0
+#endif
+        int     $0x13			# reset controler
+	popa				# restore context
+read_sectorslp:
+read_first_sector:
+        pushw   %di			# sector count
+        pushw   %ax			# limits
+        pushw   %dx
+        pushw   %cx
+	xorw	%bx, %bx
+#ifdef TRACK_BY_TRACK
+	subb	%cl, %al		# sectors remaining in track
+	ja	tolastsect
+	movb	$1, %al			# 1 sector mini
+tolastsect:
+	cbw
+	cmpw	%di, %ax
+	jb	more1trk
+	movw	%di, %ax		# sectors to read
+more1trk:
+	push	%ax
+	movb	$2, %ah			# cmd: read chs
+#else
+        movw    $0x201, %ax		# sector by sector
+	push	%ax
+#endif
+        int     $0x13
+	xchg	%ax, %bp		# status
+        popw    %bx			# %ax
+        popw    %cx
+        popw    %dx
+        popw    %ax			# limits
+        popw    %di			# sector count
+	jc	check_limits
+next_sector:
+#ifdef TRACK_BY_TRACK
+	subw	%bx,%di			# update sector counter
+	addw	%bx,%cx			# next sector
+	shlw	$5,%bx			# sectors -> paragraghs
+	movw	%es, %bp
+	addw	%bx, %bp
+#else
+	decw	%di			# update sector counter
+	incw	%cx			# next sector
+	movw	%es, %bp
+	addw	$32, %bp		# sector size in paragraghs
+#endif
+	movw	%bp, %es		# next location
+        cmpb    %al,%cl			# reach sector limit ?
+        jne     bdendlp
+next_head:
+        movb    %cl,%al
+        incb    %dh			# next head
+        movb    $1,%cl			# first sector
+        cmpb    %ah,%dh			# reach head limit ?
+        jne     bdendlp
+next_track:
+        movb    %dh,%ah
+        movb    $0,%dh			# first head
+# NOTE : support 256 cylinders max
+        incb    %ch			# next cylinder
+bdendlp:
+curdrive =	_start
+curdx	=	_start
+curcx	=	_start+2
+limits	=	_start+4
+	movw	%dx, curdx		# save disk state
+	movw	%cx, curcx
+	movw	%ax, limits
+read_sectors:
+	movw	curdx, %dx		# restore disk state
+	movw	curcx, %cx
+#   al is last sector+1
+#   ah is last head+1
+	movw	limits, %ax
+	orw	%di,%di
+        jne	read_sectorslp
+	movb	$0x2e, %al 		# loading... message 2e = .
+putc:
+	movb	$0xe, %ah
+	movw	$7, %bx			#   one dot each 64k
+ 	int	$0x10
+return:
+	ret
+
+print_nl:
+
+	movb	$0xd, %al		# CR
+	call	putc
+	movb	$0xa, %al		# LF
+	jmp	putc
+
+puts:
+	call	print_nl		# set %ah and %bx
+putslp:
+	lodsb
+	orb	%al,%al			# end of string is \0
+	jz	return
+putcs:
+	int	$0x10
+	jmp	putslp

-	.org 497
+floppy_table:
+#ifdef EXTRA_DEVICES
+		.byte	16,9			# /dev/fd0u720
+		.byte	12,10			# /dev/fd0u800
+		.byte	80,11			# /dev/fd0u880
+		.byte	125,20			# /dev/fd0u1600
+		.byte	44,21			# /dev/fd0u1680
+		.byte	96,22			# /dev/fd0u1760
+		.byte	116,23			# /dev/fd0u1840
+		.byte	100,24			# /dev/fd0u1920
+		.byte	105,40			# /dev/fd0u3200
+		.byte	109,44			# /dev/fd0u3520
+		.byte	113,48			# /dev/fd0u3840
+#endif
+		.byte	8,15			# /dev/fd0h1200 - /dev/ps0
+		.byte	28,18			# /dev/fd0u1440 - /dev/PS0
+		.byte	32,36			# /dev/fd0u2880 - /dev/fd0H2880
+		.byte	0,128			# /dev/fd0 - default: autodetect
+
+regs:		.asciz	"X:"
+
+#ifndef	DISPLAY_KERNEL_VERSION
+msg1:		.asciz	"Loading"
+#endif
+
+tail:
+		.space	495+start-tail
+
+#.org 495
+sys_sects:	.word SYSSIZE / 32		# size max is now 32Mb
+#.org 497
 setup_sects:	.byte SETUPSECTS
 root_flags:	.word ROOT_RDONLY
-syssize:	.word SYSSIZE
+syssize:	.word SYSSIZE % 0x10000		# size max was 1Mb
 swap_dev:	.word SWAP_DEV
-ram_size:	.word RAMDISK
+ram_size:	.word RAMDISK			# ramdisk size, ramdisk flags and cmdline flag
 vid_mode:	.word SVGA_MODE
 root_dev:	.word ROOT_DEV
 boot_flag:	.word 0xAA55
diff -purN linux-2.6.13/arch/i386/boot/tools/build.c linux-2.6.13-bootblock/arch/i386/boot/tools/build.c
--- linux-2.6.13/arch/i386/boot/tools/build.c	2005-09-12 10:38:52.000000000 +0200
+++ linux-2.6.13-bootblock/arch/i386/boot/tools/build.c	2005-09-12 10:46:25.000000000 +0200
@@ -168,10 +168,13 @@ int main(int argc, char ** argv)
 	}
 	close(fd);

-	if (lseek(1, 497, SEEK_SET) != 497)		    /* Write sizes to the bootsector */
+	if (lseek(1, 495, SEEK_SET) != 495)		    /* Write sizes to the bootsector */
 		die("Output: seek failed");
-	buf[0] = setup_sectors;
-	if (write(1, buf, 1) != 1)
+	sz = (sb.st_size + 511) / 512;
+	buf[0] = (sz & 0xff);
+	buf[1] = ((sz >> 8) & 0xff);
+	buf[2] = setup_sectors;
+	if (write(1, buf, 3) != 3)
 		die("Write of setup sector count failed");
 	if (lseek(1, 500, SEEK_SET) != 500)
 		die("Output: seek failed");
diff -purN linux-2.6.13/arch/i386/kernel/setup.c linux-2.6.13-bootblock/arch/i386/kernel/setup.c
--- linux-2.6.13/arch/i386/kernel/setup.c	2005-09-12 10:38:53.000000000 +0200
+++ linux-2.6.13-bootblock/arch/i386/kernel/setup.c	2005-09-12 10:57:01.000000000 +0200
@@ -156,6 +156,7 @@ unsigned long saved_videomode;
 #define RAMDISK_IMAGE_START_MASK  	0x07FF
 #define RAMDISK_PROMPT_FLAG		0x8000
 #define RAMDISK_LOAD_FLAG		0x4000
+#define CMDLINE_LOAD_FLAG		0x2000

 static char command_line[COMMAND_LINE_SIZE];

diff -purN linux-2.6.13/arch/x86_64/boot/bootsect.S linux-2.6.13-bootblock/arch/x86_64/boot/bootsect.S
--- linux-2.6.13/arch/x86_64/boot/bootsect.S	2005-09-12 10:37:58.000000000 +0200
+++ linux-2.6.13-bootblock/arch/x86_64/boot/bootsect.S	2005-09-12 10:58:07.000000000 +0200
@@ -4,20 +4,31 @@
  *	modified by Drew Eckhardt
  *	modified by Bruce Evans (bde)
  *	modified by Chris Noe (May 1999) (as86 -> gas)
- *	gutted by H. Peter Anvin (Jan 2003)
+ *
+ *      rewritten to support up to 32Mb kernel, cmdline
+ *      and any disk geometry by <pascal.bellard@ads-lu.com>
  *
  * BIG FAT NOTE: We're in real mode using 64k segments.  Therefore segment
  * addresses must be multiplied by 16 to obtain their respective linear
  * addresses. To avoid confusion, linear addresses are written using leading
  * hex while segment addresses are written as segment:offset.
  *
+ * bde - should not jump blindly, there may be systems with only 512K low
+ * memory.  Use int 0x12 to get the top of memory, etc.
+ *
+ * It then loads 'setup' directly after itself (0x90200), and the system
+ * at 0x10000, using BIOS interrupts.
+ *
+ * The loader has been made as simple as possible, and continuous
+ * read errors will result in a unbreakable loop. Reboot by hand. It
+ * loads pretty fast by getting whole tracks at a time whenever possible.
  */

 #include <asm/boot.h>

 SETUPSECTS	= 4			/* default nr of setup-sectors */
 BOOTSEG		= 0x07C0		/* original address of boot-sector */
-INITSEG		= DEF_INITSEG		/* we move boot here - out of the way */
+INITSEG		= DEF_INITSEG		/* we load boot here - out of the way */
 SETUPSEG	= DEF_SETUPSEG		/* setup starts here */
 SYSSEG		= DEF_SYSSEG		/* system loaded at 0x10000 (65536) */
 SYSSIZE		= DEF_SYSSIZE		/* system size: # of 16-byte clicks */
@@ -25,6 +36,12 @@ SYSSIZE		= DEF_SYSSIZE		/* system size:
 ROOT_DEV	= 0 			/* ROOT_DEV is now written by "build" */
 SWAP_DEV	= 0			/* SWAP_DEV is now written by "build" */

+/* some extra features */
+#define DISPLAY_KERNEL_VERSION		as soon as possible
+#define	EDIT_CMDLINE			on hotkey
+#define	LOAD_CMDLINE			according to bit ramsize.13
+#define EXTRA_DEVICES			to fill root_device
+
 #ifndef SVGA_MODE
 #define SVGA_MODE ASK_VGA
 #endif
@@ -42,57 +59,470 @@ SWAP_DEV	= 0			/* SWAP_DEV is now writte

 .global _start
 _start:
+	cld				# assume nothing
+	movw	$INITSEG, %ax
+	movw	%ax, %es		# %ax = %es = INITSEG
+#if MOVE_BOOTSECTOR
+# First things first. Move ourself from 0x7C00 -> 0x90000 and jump there.
+	movw	$BOOTSEG, %cx
+	movw	%cx, %ds		# %ds = BOOTSEG
+	movb	$1, %ch			# %cx = 256
+	subw	%si, %si
+	subw	%di, %di
+	rep
+	movsw
+	ljmp	$INITSEG, $go
+go:
+#else
+	xorw	%cx, %cx		# %cx = 0
+#endif

-	# Normalize the start address
-	jmpl	$BOOTSEG, $start2
+# bde - changed 0xff00 to 0x4000 to use debugger at 0x6400 up (bde).  We
+# wouldn't have to worry about this if we checked the top of memory.  Also
+# my BIOS can be configured to put the wini drive tables in high memory
+# instead of in the vector table.  The old stack might have clobbered the
+# drive table.
+
+	movw	$0x4000-12, %di		# 0x4000 is an arbitrary value >+					# length of bootsect + length of
+					# setup + room for stack;
+					# 12 is disk parm size.
+					# gdt will heat 48 more bytes.
+	movw	%ax, %ss		# %ax and %es already contain INITSEG
+	movw	%di, %sp		# put stack at INITSEG:0x4000-12.
+
+# Many BIOS's default disk parameter tables will not recognize
+# multi-sector reads beyond the maximum sector number specified
+# in the default diskette parameter tables - this may mean 7
+# sectors in some cases.
+#
+# Since single sector reads are slow and out of the question,
+# we must take care of this by creating new parameter tables
+# (for the first disk) in RAM.  We can set the maximum sector
+# count to 36 - the most we will encounter on an ED 2.88.
+#
+# High doesn't hurt.  Low does.  Let's use the max: 63
+#
+# Segments are as follows: %es = %ss = INITSEG,
+# %fs and %gs are unused.
+
+	movw	$0x78, %bx		# %ds:%bx is parameter table address
+	movw	%cx, %ds		# %ds = 0
+	ldsw	(%bx), %si		# %ds:%si is source
+	movb	$6, %cl			# copy 12 bytes
+	rep				# don't worry about cld
+	movsw				# already done above
+	movw	%cx, %ds		# %ds = 0
+	movw	%sp, (%bx)		# %sp = 0x4000-12
+	movw	%es, 2(%bx)
+	pushw	%es
+	popw	%ds			# now %ds = %es = %ss = INITSEG
+	movb	$63, 0x4-12(%di)	# patch sector count, %di = 0x4000
+
+	cli
+	cbw				# %ax = 0 : geometry unknown yet
+	xorb	%dh, %dh		# head 0, current drive
+	incw	%cx			# cylinder 0, sector 1
+	movw	%cx, %di		# read 1 sector
+	call	read_first_sector	# read bootsector again to have
+					# access to data segment
+
+#ifndef	DISPLAY_KERNEL_VERSION
+	movw	$msg1, %si
+	call	puts
+#endif

-start2:
-	movw	%cs, %ax
-	movw	%ax, %ds
-	movw	%ax, %es
-	movw	%ax, %ss
-	movw	$0x7c00, %sp
-	sti
-	cld
+# Load the setup-sectors directly after the moved bootblock (at 0x90200).

-	movw	$bugger_off_msg, %si
+	movb	setup_sects, %al
+#ifdef CHECK_SETUP_SIZE
+	orb	%al, %al
+	jne	setup_size_ok
+	movb	$SETUPSECTS, %al
+setup_size_ok:
+#endif
+	cbw
+	xchg	%ax, %di
+	call	read_sectors		# read setup
+
+#ifdef	DISPLAY_KERNEL_VERSION
+#define kernel_version	0xE
+	movw	$0x200,%si
+	addw	kernel_version(%si),%si	# starting protocol 2.00, Kernel 1.3.73
+	call	puts			# show which kernel we are loading
+#endif

-msg_loop:
-	lodsb
-	andb	%al, %al
-	jz	die
-	movb	$0xe, %ah
-	movw	$7, %bx
-	int	$0x10
-	jmp	msg_loop
+# This routine loads the system at address SYSSEG, making sure
+# no 64kB boundaries are crossed. We try to load it as fast as
+# possible, loading whole tracks whenever we can.
+
+#ifdef __BIG_KERNEL__
+type_of_loader	=	528
+	movw	$24, %cx		# allocate 48 bytes in stack
+init_gdt:
+	push	$0			#   initialized with 0
+	loop	init_gdt
+	movw	%sp, %si		# for bootsect_gdt
+	movw	$0x9300+(SYSSEG/4096), %ax	# source = SYSSEG
+	cwd
+	movw	%ax, 20(%si)		# bootsect_src_base+2
+	movb	$0x10-1, %al		# destination = 0x100000
+	movw	%ax, 28(%si)		# bootsect_dst_base+2
+	movw	%dx, 16(%si)		# bootsect_src = 64Kb
+	movw	%dx, 24(%si)		# bootsect_dst = 64Kb
+	movb	%dl, type_of_loader	# loader type = 0xFF
+syslp:
+	movw	$SYSSEG, %ax
+	movw	%ax, %es
+	movw	$128,%di		# 64Kb in sectors
+	subw	%di, sys_sects
+	pushf
+	jnc	not_last
+	addw	sys_sects, %di
+not_last:
+	call	read_sectors
+	incw	28(%si)			# bootsect_dst_base+2
+	movw	$0x8000, %cx		# full 64K
+	movb	$0x87, %ah
+	push	%ss
+	pop	%es			# gdt in es:si
+	int	$0x15
+	popf
+	ja	syslp
+#else
+	movw	$SYSSEG, %ax
+	movw	%ax, %es
+syslp:
+	movw	$128*32,%ax		# 64Kb in paragraphs
+	subw	%ax, syssize
+	pushf
+	jnc	not_last
+	addw	syssize, %ax
+not_last:
+	movb	$5, %cl			# paragraphs -> sectors
+	shrw	%cl, %ax
+	xchg	%ax, %di
+	call	read_sectors
+	popf
+	ja	syslp
+#endif

-die:
-	# Allow the user to press a key, then reboot
-	xorw	%ax, %ax
-	int	$0x16
-	int	$0x19
+# After that we check which root-device to use. If the device is
+# defined (!= 0), nothing is done and the given device is used.
+# Otherwise, one of /dev/fd0H2880 (2,32) or /dev/PS0 (2,28) or /dev/at0 (2,8)
+# depending on the number of sectors we pretend to know we have.
+
+
+	movw	root_dev, %ax
+	orw	%ax, %ax
+	jnz	root_defined
+
+	movw	$floppy_table,%si
+scan_floppy_table:
+	lodsw
+	cmpb	limits, %ah
+	je	set_root
+	jno	scan_floppy_table
+set_root:
+	movb	$2, %ah
+	addb	%dl, %al		# add current (floppy) drive
+	movw	%ax, root_dev
+root_defined:
+
+#if defined(LOAD_CMDLINE) || defined(EDIT_CMDLINE)
+#define BUFFER	0x7F00
+	movw	$BUFFER, %si
+	movw	%si, (%si)		# default : no cmdline
+#endif

-	# int 0x19 should never return.  In case it does anyway,
-	# invoke the BIOS reset code...
-	ljmp	$0xf000,$0xfff0
+#ifdef	LOAD_CMDLINE
+	testb	$0x20,ram_size+1	# bit 11 to 13 where unused
+					# now bit 13 means: load cmdline
+	jz	nocmd
+	movw	$BUFFER/16+INITSEG, %ax
+	movw	%ax, %es
+	movw	$1, %di			# cmdline = 512 bytes max
+	call	read_sectors
+nocmd:
+#endif

+#define RSHFT   0x01
+#define LSHFT   0x02
+#define CTRL    0x04
+#define ALT     0x08
+#define SCRLCK  0x10
+#define NUMLCK  0x20
+#define CAPSLCK 0x40
+#define INSERT  0x80
+
+#ifdef	EDIT_CMDLINE
+# The cmdline can be entered and modifed on hot key.
+# Only characters before the cursor are passed to the kernel.
+	movb	$2, %ah			# get keyboard status
+	int	$0x16
+	testb	$RSHFT|LSHFT|CTRL|ALT|CAPSLCK, %al
+	jz	nocmdline
+	pushw	%si
+	call	puts			# set %ah and %bx
+cmdlp:
+# if 1
+	movb	$32, %al		# clear end of line
+	int	$0x10			#  with Space
+	movb	$8, %al			#   and BackSpace
+	int	$0x10
+# endif
+	decw	%si
+cmdget:
+	cbw				# %ah = 0, get keyboard character
+	int	$0x16
+	cmpb	$8, %al			# BackSpace ?
+	je	cmdbs
+	cbw
+	movw	%ax, (%si)		# store end of string too
+	incw	%si
+	incw	%si
+cmdbs:
+	cmpw	$BUFFER, %si		# lower limit is checked
+	je	cmdget			#   but upper limit not
+	call	putc
+	cmpb	$13, %al		# Enter ?
+	jne	cmdlp
+	popw	%si
+nocmdline:
+#endif

-bugger_off_msg:
-	.ascii	"Direct booting from floppy is no longer supported.\r\n"
-	.ascii	"Please use a boot loader program instead.\r\n"
-	.ascii	"\n"
-	.ascii	"Remove disk and press any key to reboot . . .\r\n"
-	.byte	0
+#if defined(LOAD_CMDLINE) || defined(EDIT_CMDLINE)
+#if 1
+cmd_line_magic	=	0x20
+cmd_line_offset	=	0x22
+	movw	$0xA33F, cmd_line_magic
+	movw	%si, cmd_line_offset
+#else
+# protocol >= 2.02, starting Kernel 2.4.0-test3-pre3
+cmd_line_ptr	=	0x228
+	movzx	%si, %eax
+	addl	$INITSEG*16, %eax
+	movl	%eax, cmd_line_ptr
+#endif
+emptycmdline:
+#endif
+
+# This procedure turns off the floppy drive motor, so
+# that we enter the kernel in a known state, and
+# don't have to worry about it later.
+
+#if 1
+kill_motor:
+	xorw	%ax, %ax		# reset FDC
+	int	$0x13
+#else
+kill_motor:
+	movw	$0x3f2, %dx
+	xorb	%al, %al
+	outb	%al, %dx
+#endif

+	call	print_nl

-	# Kernel attributes; used by setup
+# After that (everything loaded), we jump to the setup-routine
+# loaded directly after the bootblock:
+# Segments are as follows: %ds = %ss = INITSEG
+
+	ljmp	$SETUPSEG, $0
+
+# read_sectors reads %di sectors into %es:0 buffer.
+# %es:0 is updated to the next memory location.
+# First, sectors are read sector by sector until
+# sector per track count is known. Then they are
+# read track by track.
+# Assume no error on first track.
+
+#define TRACK_BY_TRACK	load as fast as possible !
+#define SHOW_REGS	show int13 status & parameters
+
+check_limits:
+        cmpb    %al, %cl		# max sector known ?
+        ja	next_head		#   no -> store it
+        cmpb    %ah, %dh		# max head known ?
+        ja	next_track		#   no -> store it
+	pusha				# save context
+#ifdef SHOW_REGS
+	pushw	%es			# print %es (named EX)
+	pushw	%dx			# print %dx
+	pushw	%cx			# print %cx
+	xorw	%cx, %cx
+	pushw	%cx			# print %bx
+# ifdef TRACK_BY_TRACK
+	movb	$2, %bh
+# endif
+	pushw	%bx			# print %ax
+	movb	$6,%cl
+	jmp	print_all		# print %bp (status)
+print_loop:
+	movb	$0x6 + 'A' - 1, %al
+	subb	%cl, %al
+	movw	$regs, %si		# caller %si is saved
+	call	putcs			# putc(%al) + puts(%si)
+# it will print out all of the registers.
+	popw	%bp			# load word into %bp
+print_all:
+	pushw	%cx			# save count remaining
+	movb	$4, %cl			# 4 hex digits
+print_digit:
+	rolw	$4, %bp			# rotate to use low 4 bits
+	movb	$0x0f, %al
+	andw	%bp, %ax		# %al = mask for nybble
+	addb	$0x90, %al		# convert %al to ascii hex
+	daa				# in only four instructions!
+	adcb	$0x40, %al
+	daa
+	call	putc			# set %ah and %bx
+	loop	print_digit
+	movb	$0x20, %al		# SPACE
+	int	$0x10
+	popw	%cx
+	loop	print_loop
+	xchg	%ax, %cx		# %ah = 0
+#else
+	cbw				# %ah = 0
+#endif
+        int     $0x13			# reset controler
+	popa				# restore context
+read_sectorslp:
+read_first_sector:
+        pushw   %di			# sector count
+        pushw   %ax			# limits
+        pushw   %dx
+        pushw   %cx
+	xorw	%bx, %bx
+#ifdef TRACK_BY_TRACK
+	subb	%cl, %al		# sectors remaining in track
+	ja	tolastsect
+	movb	$1, %al			# 1 sector mini
+tolastsect:
+	cbw
+	cmpw	%di, %ax
+	jb	more1trk
+	movw	%di, %ax		# sectors to read
+more1trk:
+	push	%ax
+	movb	$2, %ah			# cmd: read chs
+#else
+        movw    $0x201, %ax		# sector by sector
+	push	%ax
+#endif
+        int     $0x13
+	xchg	%ax, %bp		# status
+        popw    %bx			# %ax
+        popw    %cx
+        popw    %dx
+        popw    %ax			# limits
+        popw    %di			# sector count
+	jc	check_limits
+next_sector:
+#ifdef TRACK_BY_TRACK
+	subw	%bx,%di			# update sector counter
+	addw	%bx,%cx			# next sector
+	shlw	$5,%bx			# sectors -> paragraghs
+	movw	%es, %bp
+	addw	%bx, %bp
+#else
+	decw	%di			# update sector counter
+	incw	%cx			# next sector
+	movw	%es, %bp
+	addw	$32, %bp		# sector size in paragraghs
+#endif
+	movw	%bp, %es		# next location
+        cmpb    %al,%cl			# reach sector limit ?
+        jne     bdendlp
+next_head:
+        movb    %cl,%al
+        incb    %dh			# next head
+        movb    $1,%cl			# first sector
+        cmpb    %ah,%dh			# reach head limit ?
+        jne     bdendlp
+next_track:
+        movb    %dh,%ah
+        movb    $0,%dh			# first head
+# NOTE : support 256 cylinders max
+        incb    %ch			# next cylinder
+bdendlp:
+curdrive =	_start
+curdx	=	_start
+curcx	=	_start+2
+limits	=	_start+4
+	movw	%dx, curdx		# save disk state
+	movw	%cx, curcx
+	movw	%ax, limits
+read_sectors:
+	movw	curdx, %dx		# restore disk state
+	movw	curcx, %cx
+#   al is last sector+1
+#   ah is last head+1
+	movw	limits, %ax
+	orw	%di,%di
+        jne	read_sectorslp
+	movb	$0x2e, %al 		# loading... message 2e = .
+putc:
+	movb	$0xe, %ah
+	movw	$7, %bx			#   one dot each 64k
+ 	int	$0x10
+return:
+	ret
+
+print_nl:
+
+	movb	$0xd, %al		# CR
+	call	putc
+	movb	$0xa, %al		# LF
+	jmp	putc
+
+puts:
+	call	print_nl		# set %ah and %bx
+putslp:
+	lodsb
+	orb	%al,%al			# end of string is \0
+	jz	return
+putcs:
+	int	$0x10
+	jmp	putslp

-	.org 497
+floppy_table:
+#ifdef EXTRA_DEVICES
+		.byte	16,9			# /dev/fd0u720
+		.byte	12,10			# /dev/fd0u800
+		.byte	80,11			# /dev/fd0u880
+		.byte	125,20			# /dev/fd0u1600
+		.byte	44,21			# /dev/fd0u1680
+		.byte	96,22			# /dev/fd0u1760
+		.byte	116,23			# /dev/fd0u1840
+		.byte	100,24			# /dev/fd0u1920
+		.byte	105,40			# /dev/fd0u3200
+		.byte	109,44			# /dev/fd0u3520
+		.byte	113,48			# /dev/fd0u3840
+#endif
+		.byte	8,15			# /dev/fd0h1200 - /dev/ps0
+		.byte	28,18			# /dev/fd0u1440 - /dev/PS0
+		.byte	32,36			# /dev/fd0u2880 - /dev/fd0H2880
+		.byte	0,128			# /dev/fd0 - default: autodetect
+
+regs:		.asciz	"X:"
+
+#ifndef	DISPLAY_KERNEL_VERSION
+msg1:		.asciz	"Loading"
+#endif
+
+tail:
+		.space	495+start-tail
+
+#.org 495
+sys_sects:	.word SYSSIZE / 32		# size max is now 32Mb
+#.org 497
 setup_sects:	.byte SETUPSECTS
 root_flags:	.word ROOT_RDONLY
-syssize:	.word SYSSIZE
+syssize:	.word SYSSIZE % 0x10000		# size max was 1Mb
 swap_dev:	.word SWAP_DEV
-ram_size:	.word RAMDISK
+ram_size:	.word RAMDISK			# ramdisk size, ramdisk flags and cmdline flag
 vid_mode:	.word SVGA_MODE
 root_dev:	.word ROOT_DEV
 boot_flag:	.word 0xAA55
diff -purN linux-2.6.13/arch/x86_64/boot/tools/build.c linux-2.6.13-bootblock/arch/x86_64/boot/tools/build.c
--- linux-2.6.13/arch/x86_64/boot/tools/build.c	2005-09-12 10:38:57.000000000 +0200
+++ linux-2.6.13-bootblock/arch/x86_64/boot/tools/build.c	2005-09-12 11:00:44.000000000 +0200
@@ -169,10 +169,13 @@ int main(int argc, char ** argv)
 	}
 	close(fd);

-	if (lseek(1, 497, SEEK_SET) != 497)		    /* Write sizes to the bootsector */
+	if (lseek(1, 495, SEEK_SET) != 495)		    /* Write sizes to the bootsector */
 		die("Output: seek failed");
-	buf[0] = setup_sectors;
-	if (write(1, buf, 1) != 1)
+	sz = (sb.st_size + 511) / 512;
+	buf[0] = (sz & 0xff);
+	buf[1] = ((sz >> 8) & 0xff);
+	buf[2] = setup_sectors;
+	if (write(1, buf, 3) != 3)
 		die("Write of setup sector count failed");
 	if (lseek(1, 500, SEEK_SET) != 500)
 		die("Output: seek failed");
diff -purN linux-2.6.13/Documentation/i386/boot.txt linux-2.6.13-bootblock/Documentation/i386/boot.txt
--- linux-2.6.13/Documentation/i386/boot.txt	2005-09-12 10:36:50.000000000 +0200
+++ linux-2.6.13-bootblock/Documentation/i386/boot.txt	2005-09-12 12:22:43.000000000 +0200
@@ -103,6 +103,7 @@ The header looks like:
 Offset	Proto	Name		Meaning
 /Size

+01EF/2	N/A	sys_sects	DO NOT USE - for bootsect.S use only
 01F1/1	ALL	setup_sects	The size of the setup in sectors
 01F2/2	ALL	root_flags	If set, the root is mounted readonly
 01F4/2	ALL	syssize		DO NOT USE - for bootsect.S use only
diff -purN linux-2.6.13/Documentation/ramdisk.txt linux-2.6.13-bootblock/Documentation/ramdisk.txt
--- linux-2.6.13/Documentation/ramdisk.txt	2005-09-12 10:35:39.000000000 +0200
+++ linux-2.6.13-bootblock/Documentation/ramdisk.txt	2005-09-12 10:55:35.000000000 +0200
@@ -63,12 +63,14 @@ to 2 MB (2^11) of where to find the RAM
 14 indicates that a RAM disk is to be loaded, and bit 15 indicates whether a
 prompt/wait sequence is to be given before trying to read the RAM disk. Since
 the RAM disk dynamically grows as data is being written into it, a size field
-is not required. Bits 11 to 13 are not currently used and may as well be zero.
+is not required. Bit 13 indicates that a cmdline is to be loaded by the kernel
+bootblock, Bits 11 to 12 are not currently used and may as well be zero.
 These numbers are no magical secrets, as seen below:

 ./arch/i386/kernel/setup.c:#define RAMDISK_IMAGE_START_MASK     0x07FF
 ./arch/i386/kernel/setup.c:#define RAMDISK_PROMPT_FLAG          0x8000
 ./arch/i386/kernel/setup.c:#define RAMDISK_LOAD_FLAG            0x4000
+./arch/i386/kernel/setup.c:#define CMDLINE_LOAD_FLAG            0x2000

 Consider a typical two floppy disk setup, where you will have the
 kernel on disk one, and have already put a RAM disk image onto disk #2.
@@ -159,6 +161,8 @@ users may wish to combine steps (d) and
 Changelog:
 ----------

+09-05 :		Reserve CMDLINE_LOAD bit.
+
 10-22-04 :	Updated to reflect changes in command line options, remove
 		obsolete references, general cleanup.
 		James Nelson (james4765@gmail.com)

--------------050004020807060004040109--
Re: [i386 BOOT CODE] kernel bootable again
#306740
Author: "H. Peter Anvin"
Date: Wed, 14 Sep 2005 09:38
16 lines
438 bytes
Pascal Bellard wrote:
>
> Now two solutions:
>
> - without this patch = linux kernel are never directly bootable
> - with this patch = linux kernel is directly bootable with some
>   devices.
>
> What is the better idea ?
>

The former, based on the *huge* number of emails of "it doesn't work on
my platform" we kept getting, and getting, and getting.

It would be another matter if it was a high-value feature, but it's not.

	-hpa
Re: [i386 BOOT CODE] kernel bootable again
#306614
Author: "Pascal Bellard"
Date: Wed, 14 Sep 2005 11:42
65 lines
2217 bytes
> Frank Sorenson wrote:
>> -----BEGIN PGP SIGNED MESSAGE-----
>> Hash: SHA1
>>
>> Pascal Bellard wrote:
>>
>>>Hello,
>>>
>>>Please find attached a patch to build i386/x86_64 kernel directly
>>>bootable. It may be usefull for rescue floppies and installation
>>>floppies.
>>
>>
>> Pascal,
>>
>> In commit f8eeaaf4180334a8e5c3582fe62a5f8176a8c124, build.c has already
>> changed, and I don't believe it's very compatible with this change.
>>
>> See
>> http://www.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;høeeaaf4180334a8e5c3582fe62a5f8176a8c124
>>
>> Also, we'll need to see comments from H. Peter Anvin on this patch.
>> CC'ing him.
>>
>
> Geometry detection by looking for error returns is fundamentally broken.
>   Way too many non-traditional floppies (USB, IDE...) do not handle this
> at all, they will return successfully, with the data being the data from
> a sector from another track, and thus you end up with aliasing and a
> corrupt boot.  You can do it with fingerprinting, but that's complex and
> error-prone.
>
The bootblock code is 497 bytes long. It must as simple as possible.
Complex algorithms like fingerprinting can't be used.

Geometry detection works with usual floppies. This patch goal is to
support them like < 2.6 bootblocks did and fix 1M limitation and
special formatting like 1.68M floppies.

Geometry detection may work with non-traditional floppies but is not
designed to.

BTW, if this kind of floppies doesn't handle error, it's a bug in the
firmware, but not in bootblock code !

> In short, this made sense in 1991, but it hasn't made sense for a very
> long time now.  Resurrecting bootsect.S is *NOT* a good idea.
>
1.44M floppies are told dead for more than 10 years. In 2005 most of
computers are sold with these drives. Sometime I have to boot with
a floppy when nothing works (blush).

Kernel code is always growing. The bootblock spares filesystem and
external kernel loader overhead.

While linux kernel has a floppy driver the bootblock is usefull.

Now two solutions:

- without this patch = linux kernel are never directly bootable
- with this patch = linux kernel is directly bootable with some
  devices.

What is the better idea ?

-pascal
Re: [i386 BOOT CODE] kernel bootable again
#306619
Author: "Pascal Bellard"
Date: Wed, 14 Sep 2005 11:52
604 lines
44510 bytes
--MIMEStream=_0+37632_65645089838794_09812299817
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 8bit

Frank,

I have built a new patch based on linux-2.6.13-git12 to avoid build.c
conflict.

Regards,

-pascal

> Pascal Bellard wrote:
>> Hello,
>>
>> Please find attached a patch to build i386/x86_64 kernel directly
>> bootable. It may be usefull for rescue floppies and installation
>> floppies.
>
> Pascal,
>
> In commit f8eeaaf4180334a8e5c3582fe62a5f8176a8c124, build.c has already
> changed, and I don't believe it's very compatible with this change.
>
> See
> http://www.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;høeeaaf4180334a8e5c3582fe62a5f8176a8c124
>
> Also, we'll need to see comments from H. Peter Anvin on this patch.
> CC'ing him.



--MIMEStream=_0+37632_65645089838794_09812299817
Content-Type: application/DEFANGED-14; name="linux-2_6_13-git12-bootblock_u.DEFANGED-14"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="linux-2_6_13-git12-bootblock_u.DEFANGED-14"

ZGlmZiAtcHVyTiBsaW51eC0yLjYuMTMtZ2l0MTIvYXJjaC9pMzg2L2Jvb3QvYm9vdHNlY3QuUyBs
aW51eC0yLjYuMTMtZ2l0MTItYm9vdGJsb2NrL2FyY2gvaTM4Ni9ib290L2Jvb3RzZWN0LlMKLS0t
IGxpbnV4LTIuNi4xMy1naXQxMi9hcmNoL2kzODYvYm9vdC9ib290c2VjdC5TCTIwMDUtMDktMTQg
MTA6MDk6NTMuMDAwMDAwMDAwICswMjAwCisrKyBsaW51eC0yLjYuMTMtZ2l0MTItYm9vdGJsb2Nr
L2FyY2gvaTM4Ni9ib290L2Jvb3RzZWN0LlMJMjAwNS0wOS0xNCAxMDozMzo0MC4wMDAwMDAwMDAg
KzAyMDAKQEAgLTQsMjAgKzQsMzEgQEAKICAqCW1vZGlmaWVkIGJ5IERyZXcgRWNraGFyZHQKICAq
CW1vZGlmaWVkIGJ5IEJydWNlIEV2YW5zIChiZGUpCiAgKgltb2RpZmllZCBieSBDaHJpcyBOb2Ug
KE1heSAxOTk5KSAoYXM4NiAtPiBnYXMpCi0gKglndXR0ZWQgYnkgSC4gUGV0ZXIgQW52aW4gKEph
biAyMDAzKQorICoKKyAqICAgICAgcmV3cml0dGVuIHRvIHN1cHBvcnQgdXAgdG8gMzJNYiBrZXJu
ZWwsIGNtZGxpbmUKKyAqICAgICAgYW5kIGFueSBkaXNrIGdlb21ldHJ5IGJ5IDxwYXNjYWwuYmVs
bGFyZEBhZHMtbHUuY29tPgogICoKICAqIEJJRyBGQVQgTk9URTogV2UncmUgaW4gcmVhbCBtb2Rl
IHVzaW5nIDY0ayBzZWdtZW50cy4gIFRoZXJlZm9yZSBzZWdtZW50CiAgKiBhZGRyZXNzZXMgbXVz
dCBiZSBtdWx0aXBsaWVkIGJ5IDE2IHRvIG9idGFpbiB0aGVpciByZXNwZWN0aXZlIGxpbmVhcgog
ICogYWRkcmVzc2VzLiBUbyBhdm9pZCBjb25mdXNpb24sIGxpbmVhciBhZGRyZXNzZXMgYXJlIHdy
aXR0ZW4gdXNpbmcgbGVhZGluZwogICogaGV4IHdoaWxlIHNlZ21lbnQgYWRkcmVzc2VzIGFyZSB3
cml0dGVuIGFzIHNlZ21lbnQ6b2Zmc2V0LgogICoKKyAqIGJkZSAtIHNob3VsZCBub3QganVtcCBi
bGluZGx5LCB0aGVyZSBtYXkgYmUgc3lzdGVtcyB3aXRoIG9ubHkgNTEySyBsb3cKKyAqIG1lbW9y
eS4gIFVzZSBpbnQgMHgxMiB0byBnZXQgdGhlIHRvcCBvZiBtZW1vcnksIGV0Yy4KKyAqCisgKiBJ
dCB0aGVuIGxvYWRzICdzZXR1cCcgZGlyZWN0bHkgYWZ0ZXIgaXRzZWxmICgweDkwMjAwKSwgYW5k
IHRoZSBzeXN0ZW0KKyAqIGF0IDB4MTAwMDAsIHVzaW5nIEJJT1MgaW50ZXJydXB0cy4gCisgKgor
ICogVGhlIGxvYWRlciBoYXMgYmVlbiBtYWRlIGFzIHNpbXBsZSBhcyBwb3NzaWJsZSwgYW5kIGNv
bnRpbnVvdXMKKyAqIHJlYWQgZXJyb3JzIHdpbGwgcmVzdWx0IGluIGEgdW5icmVha2FibGUgbG9v
cC4gUmVib290IGJ5IGhhbmQuIEl0CisgKiBsb2FkcyBwcmV0dHkgZmFzdCBieSBnZXR0aW5nIHdo
b2xlIHRyYWNrcyBhdCBhIHRpbWUgd2hlbmV2ZXIgcG9zc2libGUuCiAgKi8KIAogI2luY2x1ZGUg
PGFzbS9ib290Lmg+CiAKIFNFVFVQU0VDVFMJPSA0CQkJLyogZGVmYXVsdCBuciBvZiBzZXR1cC1z
ZWN0b3JzICovCiBCT09UU0VHCQk9IDB4MDdDMAkJLyogb3JpZ2luYWwgYWRkcmVzcyBvZiBib290
LXNlY3RvciAqLwotSU5JVFNFRwkJPSBERUZfSU5JVFNFRwkJLyogd2UgbW92ZSBib290IGhlcmUg
LSBvdXQgb2YgdGhlIHdheSAqLworSU5JVFNFRwkJPSBERUZfSU5JVFNFRwkJLyogd2UgbG9hZCBi
b290IGhlcmUgLSBvdXQgb2YgdGhlIHdheSAqLwogU0VUVVBTRUcJPSBERUZfU0VUVVBTRUcJCS8q
IHNldHVwIHN0YXJ0cyBoZXJlICovCiBTWVNTRUcJCT0gREVGX1NZU1NFRwkJLyogc3lzdGVtIGxv
YWRlZCBhdCAweDEwMDAwICg2NTUzNikgKi8KIFNZU1NJWkUJCT0gREVGX1NZU1NJWkUJCS8qIHN5
c3RlbSBzaXplOiAjIG9mIDE2LWJ5dGUgY2xpY2tzICovCkBAIC0yNSw2ICszNiwxMiBAQCBTWVNT
SVpFCQk9IERFRl9TWVNTSVpFCQkvKiBzeXN0ZW0gc2l6ZTogCiBST09UX0RFVgk9IDAgCQkJLyog
Uk9PVF9ERVYgaXMgbm93IHdyaXR0ZW4gYnkgImJ1aWxkIiAqLwogU1dBUF9ERVYJPSAwCQkJLyog
U1dBUF9ERVYgaXMgbm93IHdyaXR0ZW4gYnkgImJ1aWxkIiAqLwogCisvKiBzb21lIGV4dHJhIGZl
YXR1cmVzICovCisjZGVmaW5lIERJU1BMQVlfS0VSTkVMX1ZFUlNJT04JCWFzIHNvb24gYXMgcG9z
c2libGUKKyNkZWZpbmUJRURJVF9DTURMSU5FCQkJb24gaG90a2V5CisjZGVmaW5lCUxPQURfQ01E
TElORQkJCWFjY29yZGluZyB0byBiaXQgcmFtc2l6ZS4xMworI2RlZmluZSBFWFRSQV9ERVZJQ0VT
CQkJdG8gZmlsbCByb290X2RldmljZQorCiAjaWZuZGVmIFNWR0FfTU9ERQogI2RlZmluZSBTVkdB
X01PREUgQVNLX1ZHQQogI2VuZGlmCkBAIC00Miw1NyArNTksNDcyIEBAIFNXQVBfREVWCT0gMAkJ
CS8qIFNXQVBfREVWIGlzIG5vdyB3cml0dGUKIAogLmdsb2JhbCBfc3RhcnQKIF9zdGFydDoKK2N1
cmRyaXZlCT0JX3N0YXJ0CitjdXJkeAkJPQlfc3RhcnQKK2N1cmN4CQk9CV9zdGFydCsyCitsaW1p
dHMJCT0JX3N0YXJ0KzQKKwljbGQJCQkJIyBhc3N1bWUgbm90aGluZworCW1vdncJJElOSVRTRUcs
ICVheAorCW1vdncJJWF4LCAlZXMJCSMgJWF4ID0gJWVzID0gSU5JVFNFRworI2lmIE1PVkVfQk9P
VFNFQ1RPUgorIyBGaXJzdCB0aGluZ3MgZmlyc3QuIE1vdmUgb3Vyc2VsZiBmcm9tIDB4N0MwMCAt
PiAweDkwMDAwIGFuZCBqdW1wIHRoZXJlLgorCW1vdncJJEJPT1RTRUcsICVjeAorCW1vdncJJWN4
LCAlZHMJCSMgJWRzID0gQk9PVFNFRworCW1vdmIJJDEsICVjaAkJCSMgJWN4ID0gMjU2CisJc3Vi
dwklc2ksICVzaQorCXN1YncJJWRpLCAlZGkKKwlyZXAKKwltb3ZzdworCWxqbXAJJElOSVRTRUcs
ICRnbworZ286CQorI2Vsc2UKKwl4b3J3CSVjeCwgJWN4CQkjICVjeCA9IDAKKyNlbmRpZgorCisj
IGJkZSAtIGNoYW5nZWQgMHhmZjAwIHRvIDB4NDAwMCB0byB1c2UgZGVidWdnZXIgYXQgMHg2NDAw
IHVwIChiZGUpLiAgV2UKKyMgd291bGRuJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGlzIGlmIHdl
IGNoZWNrZWQgdGhlIHRvcCBvZiBtZW1vcnkuICBBbHNvCisjIG15IEJJT1MgY2FuIGJlIGNvbmZp
Z3VyZWQgdG8gcHV0IHRoZSB3aW5pIGRyaXZlIHRhYmxlcyBpbiBoaWdoIG1lbW9yeQorIyBpbnN0
ZWFkIG9mIGluIHRoZSB2ZWN0b3IgdGFibGUuICBUaGUgb2xkIHN0YWNrIG1pZ2h0IGhhdmUgY2xv
YmJlcmVkIHRoZQorIyBkcml2ZSB0YWJsZS4KKworCW1vdncJJDB4NDAwMC0xMiwgJWRpCQkjIDB4
NDAwMCBpcyBhbiBhcmJpdHJhcnkgdmFsdWUgPj0KKwkJCQkJIyBsZW5ndGggb2YgYm9vdHNlY3Qg
KyBsZW5ndGggb2YKKwkJCQkJIyBzZXR1cCArIHJvb20gZm9yIHN0YWNrOworCQkJCQkjIDEyIGlz
IGRpc2sgcGFybSBzaXplLgorCQkJCQkjIGdkdCB3aWxsIGhlYXQgNDggbW9yZSBieXRlcy4KKwlt
b3Z3CSVheCwgJXNzCQkjICVheCBhbmQgJWVzIGFscmVhZHkgY29udGFpbiBJTklUU0VHCisJbW92
dwklZGksICVzcAkJIyBwdXQgc3RhY2sgYXQgSU5JVFNFRzoweDQwMDAtMTIuCisKKyMgTWFueSBC
SU9TJ3MgZGVmYXVsdCBkaXNrIHBhcmFtZXRlciB0YWJsZXMgd2lsbCBub3QgcmVjb2duaXplCisj
IG11bHRpLXNlY3RvciByZWFkcyBiZXlvbmQgdGhlIG1heGltdW0gc2VjdG9yIG51bWJlciBzcGVj
aWZpZWQKKyMgaW4gdGhlIGRlZmF1bHQgZGlza2V0dGUgcGFyYW1ldGVyIHRhYmxlcyAtIHRoaXMg
bWF5IG1lYW4gNworIyBzZWN0b3JzIGluIHNvbWUgY2FzZXMuCisjCisjIFNpbmNlIHNpbmdsZSBz
ZWN0b3IgcmVhZHMgYXJlIHNsb3cgYW5kIG91dCBvZiB0aGUgcXVlc3Rpb24sCisjIHdlIG11c3Qg
dGFrZSBjYXJlIG9mIHRoaXMgYnkgY3JlYXRpbmcgbmV3IHBhcmFtZXRlciB0YWJsZXMKKyMgKGZv
ciB0aGUgZmlyc3QgZGlzaykgaW4gUkFNLiAgV2UgY2FuIHNldCB0aGUgbWF4aW11bSBzZWN0b3IK
KyMgY291bnQgdG8gMzYgLSB0aGUgbW9zdCB3ZSB3aWxsIGVuY291bnRlciBvbiBhbiBFRCAyLjg4
LiAgCisjCisjIEhpZ2ggZG9lc24ndCBodXJ0LiAgTG93IGRvZXMuICBMZXQncyB1c2UgdGhlIG1h
eDogNjMKKyMKKyMgU2VnbWVudHMgYXJlIGFzIGZvbGxvd3M6ICVlcyA9ICVzcyA9IElOSVRTRUcs
CisjICVmcyBhbmQgJWdzIGFyZSB1bnVzZWQuCisKKwltb3Z3CSQweDc4LCAlYngJCSMgJWRzOiVi
eCBpcyBwYXJhbWV0ZXIgdGFibGUgYWRkcmVzcworCW1vdncJJWN4LCAlZHMJCSMgJWRzID0gMAor
CWxkc3cJKCVieCksICVzaQkJIyAlZHM6JXNpIGlzIHNvdXJjZQorCW1vdmIJJDYsICVjbAkJCSMg
Y29weSAxMiBieXRlcworCXJlcAkJCQkjIGRvbid0IHdvcnJ5IGFib3V0IGNsZAorCW1vdnN3CQkJ
CSMgYWxyZWFkeSBkb25lIGFib3ZlCisJbW92dwklY3gsICVkcwkJIyAlZHMgPSAwCisJbW92dwkl
c3AsICglYngpCQkjICVzcCA9IDB4NDAwMC0xMgorCW1vdncJJWVzLCAyKCVieCkKKwlwdXNodwkl
ZXMKKwlwb3B3CSVkcwkJCSMgbm93ICVkcyA9ICVlcyA9ICVzcyA9IElOSVRTRUcKKwltb3ZiCSQ2
MywgMHg0LTEyKCVkaSkJIyBwYXRjaCBzZWN0b3IgY291bnQsICVkaSA9IDB4NDAwMAorCisJY2xp
CisJY2J3CQkJCSMgJWF4ID0gMCA6IGdlb21ldHJ5IHVua25vd24geWV0CisJeG9yYgklZGgsICVk
aAkJIyBoZWFkIDAsIGN1cnJlbnQgZHJpdmUKKwlpbmN3CSVjeAkJCSMgY3lsaW5kZXIgMCwgc2Vj
dG9yIDEKKwltb3Z3CSVjeCwgJWRpCQkjIHJlYWQgMSBzZWN0b3IKKwljYWxsCXJlYWRfZmlyc3Rf
c2VjdG9yCSMgcmVhZCBib290c2VjdG9yIGFnYWluIHRvIGhhdmUKKwkJCQkJIyBhY2Nlc3MgdG8g
ZGF0YSBzZWdtZW50CisKKyNpZm5kZWYJRElTUExBWV9LRVJORUxfVkVSU0lPTgorCW1vdncJJG1z
ZzEsICVzaQorCWNhbGwJcHV0cworI2VuZGlmCiAKLQkjIE5vcm1hbGl6ZSB0aGUgc3RhcnQgYWRk
cmVzcwotCWptcGwJJEJPT1RTRUcsICRzdGFydDIKKyMgTG9hZCB0aGUgc2V0dXAtc2VjdG9ycyBk
aXJlY3RseSBhZnRlciB0aGUgbW92ZWQgYm9vdGJsb2NrIChhdCAweDkwMjAwKS4KIAotc3RhcnQy
OgotCW1vdncJJWNzLCAlYXgKLQltb3Z3CSVheCwgJWRzCisJbW92YglzZXR1cF9zZWN0cywgJWFs
CisjaWZkZWYgQ0hFQ0tfU0VUVVBfU0laRQorCW9yYgklYWwsICVhbAorCWpuZQlzZXR1cF9zaXpl
X29rCisJbW92YgkkU0VUVVBTRUNUUywgJWFsCitzZXR1cF9zaXplX29rOgkKKyNlbmRpZgorCWNi
dworCXhjaGcJJWF4LCAlZGkKKwljYWxsCXJlYWRfc2VjdG9ycwkJIyByZWFkIHNldHVwCisKKyNp
ZmRlZglESVNQTEFZX0tFUk5FTF9WRVJTSU9OCisjZGVmaW5lIGtlcm5lbF92ZXJzaW9uCTB4RQor
CW1vdncJJDB4MjAwLCVzaQorCWFkZHcJa2VybmVsX3ZlcnNpb24oJXNpKSwlc2kJIyBzdGFydGlu
ZyBwcm90b2NvbCAyLjAwLCBLZXJuZWwgMS4zLjczCisJY2FsbAlwdXRzCQkJIyBzaG93IHdoaWNo
IGtlcm5lbCB3ZSBhcmUgbG9hZGluZworI2VuZGlmCisKKyMgVGhpcyByb3V0aW5lIGxvYWRzIHRo
ZSBzeXN0ZW0gYXQgYWRkcmVzcyBTWVNTRUcsIG1ha2luZyBzdXJlCisjIG5vIDY0a0IgYm91bmRh
cmllcyBhcmUgY3Jvc3NlZC4gV2UgdHJ5IHRvIGxvYWQgaXQgYXMgZmFzdCBhcworIyBwb3NzaWJs
ZSwgbG9hZGluZyB3aG9sZSB0cmFja3Mgd2hlbmV2ZXIgd2UgY2FuLgorCisjaWZkZWYgX19CSUdf
S0VSTkVMX18KK3R5cGVfb2ZfbG9hZGVyCT0JNTI4CisJbW92dwkkMjQsICVjeAkJIyBhbGxvY2F0
ZSA0OCBieXRlcyBpbiBzdGFjaworaW5pdF9nZHQ6CisJcHVzaAkkMAkJCSMgICBpbml0aWFsaXpl
ZCB3aXRoIDAKKwlsb29wCWluaXRfZ2R0CisJbW92dwklc3AsICVzaQkJIyBmb3IgYm9vdHNlY3Rf
Z2R0CisJbW92dwkkMHg5MzAwKyhTWVNTRUcvNDA5NiksICVheAkjIHNvdXJjZSA9IFNZU1NFRwor
CWN3ZAorCW1vdncJJWF4LCAyMCglc2kpCQkjIGJvb3RzZWN0X3NyY19iYXNlKzIKKwltb3ZiCSQw
eDEwLTEsICVhbAkJIyBkZXN0aW5hdGlvbiA9IDB4MTAwMDAwCisJbW92dwklYXgsIDI4KCVzaSkJ
CSMgYm9vdHNlY3RfZHN0X2Jhc2UrMgorCW1vdncJJWR4LCAxNiglc2kpCQkjIGJvb3RzZWN0X3Ny
YyA9IDY0S2IKKwltb3Z3CSVkeCwgMjQoJXNpKQkJIyBib290c2VjdF9kc3QgPSA2NEtiCisJbW92
YgklZGwsIHR5cGVfb2ZfbG9hZGVyCSMgbG9hZGVyIHR5cGUgPSAweEZGCisJbW92bAkkMHgxRiwg
JWVheAorCWFkZGwJc3lzc2l6ZSwgJWVheAkJIyBnZXQgc3lzdGVtIHNpemUKKwlzaHJsCSQ1LCAl
ZWF4CQkjIGNvbnZlcnQgdG8gc2VjdG9yIGNvdW50CitzeXNscDoKKwlwdXNodwklYXgKKwltb3Z3
CSRTWVNTRUcsICVkaQorCW1vdncJJWRpLCAlZXMKKwltb3Z3CSQxMjgsJWRpCQkjIDY0S2IgaW4g
c2VjdG9ycworCXN1YncJJWRpLCAlYXgKKwlwdXNoZgorCWpuYwlub3RfbGFzdAorCWFkZHcJJWF4
LCAlZGkKK25vdF9sYXN0OgorCWNhbGwJcmVhZF9zZWN0b3JzCisJaW5jdwkyOCglc2kpCQkJIyBi
b290c2VjdF9kc3RfYmFzZSsyCisJbW92dwkkMHg4MDAwLCAlY3gJCSMgZnVsbCA2NEsKKwltb3Zi
CSQweDg3LCAlYWgKKwlwdXNoCSVzcworCXBvcAklZXMJCQkjIGdkdCBpbiBlczpzaQorCWludAkk
MHgxNQorCXBvcGYKKwlwb3B3CSVheAkJCSMgZ2V0IHJlbWFpbmluZyBzZWN0b3IgY291bnQKKwlq
YQlzeXNscAorI2Vsc2UKKwltb3Z3CSRTWVNTRUcsICVheAogCW1vdncJJWF4LCAlZXMKLQltb3Z3
CSVheCwgJXNzCi0JbW92dwkkMHg3YzAwLCAlc3AKLQlzdGkKLQljbGQKK3N5c2xwOgorCW1vdncJ
JDEyOCozMiwlYXgJCSMgNjRLYiBpbiBwYXJhZ3JhcGhzCisJc3VidwklYXgsIHN5c3NpemUKKwlw
dXNoZgorCWpuYwlub3RfbGFzdAorCWFkZHcJc3lzc2l6ZSwgJWF4Citub3RfbGFzdDoKKwltb3Zi
CSQ1LCAlY2wJCQkjIHBhcmFncmFwaHMgLT4gc2VjdG9ycworCXNocncJJWNsLCAlYXgKKwl4Y2hn
CSVheCwgJWRpCisJY2FsbAlyZWFkX3NlY3RvcnMKKwlwb3BmCisJamEJc3lzbHAKKyNlbmRpZgog
Ci0JbW92dwkkYnVnZ2VyX29mZl9tc2csICVzaQorIyBBZnRlciB0aGF0IHdlIGNoZWNrIHdoaWNo
IHJvb3QtZGV2aWNlIHRvIHVzZS4gSWYgdGhlIGRldmljZSBpcworIyBkZWZpbmVkICghPSAwKSwg
bm90aGluZyBpcyBkb25lIGFuZCB0aGUgZ2l2ZW4gZGV2aWNlIGlzIHVzZWQuCisjIE90aGVyd2lz
ZSwgb25lIG9mIC9kZXYvZmQwSDI4ODAgKDIsMzIpIG9yIC9kZXYvUFMwICgyLDI4KSBvciAvZGV2
L2F0MCAoMiw4KQorIyBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBzZWN0b3JzIHdlIHByZXRl
bmQgdG8ga25vdyB3ZSBoYXZlLgorCisKKwltb3Z3CXJvb3RfZGV2LCAlYXgKKwlvcncJJWF4LCAl
YXgKKwlqbnoJcm9vdF9kZWZpbmVkCisKKwltb3Z3CSRmbG9wcHlfdGFibGUsJXNpCitzY2FuX2Zs
b3BweV90YWJsZToKKwlsb2RzdworCWNtcGIJbGltaXRzLCAlYWgKKwlqZQlzZXRfcm9vdAorCWpu
bwlzY2FuX2Zsb3BweV90YWJsZQorc2V0X3Jvb3Q6CisJbW92YgkkMiwgJWFoCisJYWRkYgklZGws
ICVhbAkJIyBhZGQgY3VycmVudCAoZmxvcHB5KSBkcml2ZQorCW1vdncJJWF4LCByb290X2Rldgor
cm9vdF9kZWZpbmVkOgorCisjaWYgZGVmaW5lZChMT0FEX0NNRExJTkUpIHx8IGRlZmluZWQoRURJ
VF9DTURMSU5FKQorI2RlZmluZSBCVUZGRVIJMHg3RjAwCisJbW92dwkkQlVGRkVSLCAlc2kKKwlt
b3Z3CSVzaSwgKCVzaSkJCSMgZGVmYXVsdCA6IG5vIGNtZGxpbmUKKyNlbmRpZgogCi1tc2dfbG9v
cDoKLQlsb2RzYgotCWFuZGIJJWFsLCAlYWwKLQlqeglkaWUKLQltb3ZiCSQweGUsICVhaAotCW1v
dncJJDcsICVieAotCWludAkkMHgxMAotCWptcAltc2dfbG9vcAorI2lmZGVmCUxPQURfQ01ETElO
RQorCXRlc3RiCSQweDIwLHJhbV9zaXplKzEJIyBiaXQgMTEgdG8gMTMgd2hlcmUgdW51c2VkCisJ
CQkJCSMgbm93IGJpdCAxMyBtZWFuczogbG9hZCBjbWRsaW5lCisJanoJbm9jbWQKKwltb3Z3CSRC
VUZGRVIvMTYrSU5JVFNFRywgJWF4CisJbW92dwklYXgsICVlcworCW1vdncJJDEsICVkaQkJCSMg
Y21kbGluZSA9IDUxMiBieXRlcyBtYXgKKwljYWxsCXJlYWRfc2VjdG9ycworbm9jbWQ6CisjZW5k
aWYKIAotZGllOgotCSMgQWxsb3cgdGhlIHVzZXIgdG8gcHJlc3MgYSBrZXksIHRoZW4gcmVib290
Ci0JeG9ydwklYXgsICVheAorI2RlZmluZSBSU0hGVCAgIDB4MDEKKyNkZWZpbmUgTFNIRlQgICAw
eDAyCisjZGVmaW5lIENUUkwgICAgMHgwNAorI2RlZmluZSBBTFQgICAgIDB4MDgKKyNkZWZpbmUg
U0NSTENLICAweDEwCisjZGVmaW5lIE5VTUxDSyAgMHgyMAorI2RlZmluZSBDQVBTTENLIDB4NDAK
KyNkZWZpbmUgSU5TRVJUICAweDgwCisKKyNpZmRlZglFRElUX0NNRExJTkUKKyMgVGhlIGNtZGxp
bmUgY2FuIGJlIGVudGVyZWQgYW5kIG1vZGlmZWQgb24gaG90IGtleS4KKyMgT25seSBjaGFyYWN0
ZXJzIGJlZm9yZSB0aGUgY3Vyc29yIGFyZSBwYXNzZWQgdG8gdGhlIGtlcm5lbC4KKwltb3ZiCSQy
LCAlYWgJCQkjIGdldCBrZXlib2FyZCBzdGF0dXMKKwlpbnQJJDB4MTYKKwl0ZXN0YgkkUlNIRlR8
TFNIRlR8Q1RSTHxBTFR8Q0FQU0xDSywgJWFsCisJanoJbm9jbWRsaW5lCisJcHVzaHcJJXNpCisJ
Y2FsbAlwdXRzCQkJIyBzZXQgJWFoIGFuZCAlYngKK2NtZGxwOgorIyBpZiAxCisJbW92YgkkMzIs
ICVhbAkJIyBjbGVhciBlbmQgb2YgbGluZQorCWludAkkMHgxMAkJCSMgIHdpdGggU3BhY2UKKwlt
b3ZiCSQ4LCAlYWwJCQkjICAgYW5kIEJhY2tTcGFjZQorCWludAkkMHgxMAorIyBlbmRpZgorCWRl
Y3cJJXNpCitjbWRnZXQ6CisJY2J3CQkJCSMgJWFoID0gMCwgZ2V0IGtleWJvYXJkIGNoYXJhY3Rl
cgogCWludAkkMHgxNgotCWludAkkMHgxOQorCWNtcGIJJDgsICVhbAkJCSMgQmFja1NwYWNlID8K
KwlqZQljbWRicworCWNidworCW1vdncJJWF4LCAoJXNpKQkJIyBzdG9yZSBlbmQgb2Ygc3RyaW5n
IHRvbworCWluY3cJJXNpCisJaW5jdwklc2kKK2NtZGJzOgorCWNtcHcJJEJVRkZFUiwgJXNpCQkj
IGxvd2VyIGxpbWl0IGlzIGNoZWNrZWQKKwlqZQljbWRnZXQJCQkjICAgYnV0IHVwcGVyIGxpbWl0
IG5vdAorCWNhbGwJcHV0YworCWNtcGIJJDEzLCAlYWwJCSMgRW50ZXIgPworCWpuZQljbWRscAor
CXBvcHcJJXNpCitub2NtZGxpbmU6CisjZW5kaWYKIAotCSMgaW50IDB4MTkgc2hvdWxkIG5ldmVy
IHJldHVybi4gIEluIGNhc2UgaXQgZG9lcyBhbnl3YXksCi0JIyBpbnZva2UgdGhlIEJJT1MgcmVz
ZXQgY29kZS4uLgotCWxqbXAJJDB4ZjAwMCwkMHhmZmYwCisjaWYgZGVmaW5lZChMT0FEX0NNRExJ
TkUpIHx8IGRlZmluZWQoRURJVF9DTURMSU5FKQorI2lmIDEKK2NtZF9saW5lX21hZ2ljCT0JMHgy
MAorY21kX2xpbmVfb2Zmc2V0CT0JMHgyMgorCW1vdncJJDB4QTMzRiwgY21kX2xpbmVfbWFnaWMK
Kwltb3Z3CSVzaSwgY21kX2xpbmVfb2Zmc2V0CisjZWxzZQorIyBwcm90b2NvbCA+PSAyLjAyLCBz
dGFydGluZyBLZXJuZWwgMi40LjAtdGVzdDMtcHJlMworY21kX2xpbmVfcHRyCT0JMHgyMjgKKwlt
b3Z6eAklc2ksICVlYXgKKwlhZGRsCSRJTklUU0VHKjE2LCAlZWF4CisJbW92bAklZWF4LCBjbWRf
bGluZV9wdHIKKyNlbmRpZgorZW1wdHljbWRsaW5lOgorI2VuZGlmCisJCisjIFRoaXMgcHJvY2Vk
dXJlIHR1cm5zIG9mZiB0aGUgZmxvcHB5IGRyaXZlIG1vdG9yLCBzbworIyB0aGF0IHdlIGVudGVy
IHRoZSBrZXJuZWwgaW4gYSBrbm93biBzdGF0ZSwgYW5kCisjIGRvbid0IGhhdmUgdG8gd29ycnkg
YWJvdXQgaXQgbGF0ZXIuCisKKyNpZiAxCitraWxsX21vdG9yOgorCXhvcncJJWF4LCAlYXgJCSMg
cmVzZXQgRkRDCisJaW50CSQweDEzCisjZWxzZQora2lsbF9tb3RvcjoKKwltb3Z3CSQweDNmMiwg
JWR4CisJeG9yYgklYWwsICVhbAorCW91dGIJJWFsLCAlZHgKKyNlbmRpZgogCisJY2FsbAlwcmlu
dF9ubAogCi1idWdnZXJfb2ZmX21zZzoKLQkuYXNjaWkJIkRpcmVjdCBib290aW5nIGZyb20gZmxv
cHB5IGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuXHJcbiIKLQkuYXNjaWkJIlBsZWFzZSB1c2UgYSBi
b290IGxvYWRlciBwcm9ncmFtIGluc3RlYWQuXHJcbiIKLQkuYXNjaWkJIlxuIgotCS5hc2NpaQki
UmVtb3ZlIGRpc2sgYW5kIHByZXNzIGFueSBrZXkgdG8gcmVib290IC4gLiAuXHJcbiIKLQkuYnl0
ZQkwCisjIEFmdGVyIHRoYXQgKGV2ZXJ5dGhpbmcgbG9hZGVkKSwgd2UganVtcCB0byB0aGUgc2V0
dXAtcm91dGluZQorIyBsb2FkZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIGJvb3RibG9jazoKKyMgU2Vn
bWVudHMgYXJlIGFzIGZvbGxvd3M6ICVkcyA9ICVzcyA9IElOSVRTRUcKKworCWxqbXAJJFNFVFVQ
U0VHLCAkMAorCisjIHJlYWRfc2VjdG9ycyByZWFkcyAlZGkgc2VjdG9ycyBpbnRvICVlczowIGJ1
ZmZlci4KKyMgJWVzOjAgaXMgdXBkYXRlZCB0byB0aGUgbmV4dCBtZW1vcnkgbG9jYXRpb24uCisj
IEZpcnN0LCBzZWN0b3JzIGFyZSByZWFkIHNlY3RvciBieSBzZWN0b3IgdW50aWwKKyMgc2VjdG9y
IHBlciB0cmFjayBjb3VudCBpcyBrbm93bi4gVGhlbiB0aGV5IGFyZQorIyByZWFkIHRyYWNrIGJ5
IHRyYWNrLgorIyBBc3N1bWUgbm8gZXJyb3Igb24gZmlyc3QgdHJhY2suCisKKyNkZWZpbmUgVFJB
Q0tfQllfVFJBQ0sJbG9hZCBhcyBmYXN0IGFzIHBvc3NpYmxlICEKKyNkZWZpbmUgU0hPV19SRUdT
CXNob3cgaW50MTMgc3RhdHVzICYgcGFyYW1ldGVycworCitjaGVja19saW1pdHM6CisgICAgICAg
IGNtcGIgICAgJWFsLCAlY2wJCSMgbWF4IHNlY3RvciBrbm93biA/CisgICAgICAgIGphCW5leHRf
aGVhZAkJIyAgIG5vIC0+IHN0b3JlIGl0CisgICAgICAgIGNtcGIgICAgJWFoLCAlZGgJCSMgbWF4
IGhlYWQga25vd24gPworICAgICAgICBqYQluZXh0X3RyYWNrCQkjICAgbm8gLT4gc3RvcmUgaXQK
KwlwdXNoYQkJCQkjIHNhdmUgY29udGV4dAorI2lmZGVmIFNIT1dfUkVHUworCXB1c2h3CSVlcwkJ
CSMgcHJpbnQgJWVzIChuYW1lZCBFWCkKKwlwdXNodwklZHgJCQkjIHByaW50ICVkeAorCXB1c2h3
CSVjeAkJCSMgcHJpbnQgJWN4CisJeG9ydwklY3gsICVjeAorCXB1c2h3CSVjeAkJCSMgcHJpbnQg
JWJ4CisjIGlmZGVmIFRSQUNLX0JZX1RSQUNLCisJbW92YgkkMiwgJWJoCisjIGVuZGlmCisJcHVz
aHcJJWJ4CQkJIyBwcmludCAlYXgKKwltb3ZiCSQ2LCVjbAorCWptcAlwcmludF9hbGwJCSMgcHJp
bnQgJWJwIChzdGF0dXMpCitwcmludF9sb29wOgorCW1vdmIJJDB4NiArICdBJyAtIDEsICVhbAor
CXN1YmIJJWNsLCAlYWwKKwltb3Z3CSRyZWdzLCAlc2kJCSMgY2FsbGVyICVzaSBpcyBzYXZlZAor
CWNhbGwJcHV0Y3MJCQkjIHB1dGMoJWFsKSArIHB1dHMoJXNpKQorIyBpdCB3aWxsIHByaW50IG91
dCBhbGwgb2YgdGhlIHJlZ2lzdGVycy4KKwlwb3B3CSVicAkJCSMgbG9hZCB3b3JkIGludG8gJWJw
CitwcmludF9hbGw6CisJcHVzaHcJJWN4CQkJIyBzYXZlIGNvdW50IHJlbWFpbmluZworCW1vdmIJ
JDQsICVjbAkJCSMgNCBoZXggZGlnaXRzCitwcmludF9kaWdpdDoKKwlyb2x3CSQ0LCAlYnAJCQkj
IHJvdGF0ZSB0byB1c2UgbG93IDQgYml0cworCW1vdmIJJDB4MGYsICVhbAorCWFuZHcJJWJwLCAl
YXgJCSMgJWFsID0gbWFzayBmb3IgbnliYmxlCisJYWRkYgkkMHg5MCwgJWFsCQkjIGNvbnZlcnQg
JWFsIHRvIGFzY2lpIGhleAorCWRhYQkJCQkjIGluIG9ubHkgZm91ciBpbnN0cnVjdGlvbnMhCisJ
YWRjYgkkMHg0MCwgJWFsCisJZGFhCisJY2FsbAlwdXRjCQkJIyBzZXQgJWFoIGFuZCAlYngKKwls
b29wCXByaW50X2RpZ2l0CisJbW92YgkkMHgyMCwgJWFsCQkjIFNQQUNFCisJaW50CSQweDEwCisJ
cG9wdwklY3gKKwlsb29wCXByaW50X2xvb3AKKwl4Y2hnCSVheCwgJWN4CQkjICVhaCA9IDAKKyNl
bHNlCisJY2J3CQkJCSMgJWFoID0gMAorI2VuZGlmCisgICAgICAgIGludCAgICAgJDB4MTMJCQkj
IHJlc2V0IGNvbnRyb2xlcgorCXBvcGEJCQkJIyByZXN0b3JlIGNvbnRleHQKK3JlYWRfc2VjdG9y
c2xwOgorcmVhZF9maXJzdF9zZWN0b3I6CisgICAgICAgIHB1c2h3ICAgJWRpCQkJIyBzZWN0b3Ig
Y291bnQKKyAgICAgICAgcHVzaHcgICAlYXgJCQkjIGxpbWl0cworICAgICAgICBwdXNodyAgICVk
eAorICAgICAgICBwdXNodyAgICVjeAorCXhvcncJJWJ4LCAlYngKKyNpZmRlZiBUUkFDS19CWV9U
UkFDSworCXN1YmIJJWNsLCAlYWwJCSMgc2VjdG9ycyByZW1haW5pbmcgaW4gdHJhY2sKKwlqYQl0
b2xhc3RzZWN0CisJbW92YgkkMSwgJWFsCQkJIyAxIHNlY3RvciBtaW5pCit0b2xhc3RzZWN0Ogor
CWNidworCWNtcHcJJWRpLCAlYXgKKwlqYgltb3JlMXRyaworCW1vdncJJWRpLCAlYXgJCSMgc2Vj
dG9ycyB0byByZWFkCittb3JlMXRyazoKKwlwdXNoCSVheAorCW1vdmIJJDIsICVhaAkJCSMgY21k
OiByZWFkIGNocworI2Vsc2UKKyAgICAgICAgbW92dyAgICAkMHgyMDEsICVheAkJIyBzZWN0b3Ig
Ynkgc2VjdG9yCisJcHVzaAklYXgKKyNlbmRpZgorICAgICAgICBpbnQgICAgICQweDEzCisJeGNo
ZwklYXgsICVicAkJIyBzdGF0dXMKKyAgICAgICAgcG9wdyAgICAlYngJCQkjICVheCAKKyAgICAg
ICAgcG9wdyAgICAlY3gKKyAgICAgICAgcG9wdyAgICAlZHgKKyAgICAgICAgcG9wdyAgICAlYXgJ
CQkjIGxpbWl0cworICAgICAgICBwb3B3ICAgICVkaQkJCSMgc2VjdG9yIGNvdW50CisJamMJY2hl
Y2tfbGltaXRzCituZXh0X3NlY3RvcjoKKyNpZmRlZiBUUkFDS19CWV9UUkFDSworCXN1YncJJWJ4
LCVkaQkJCSMgdXBkYXRlIHNlY3RvciBjb3VudGVyCisJYWRkdwklYngsJWN4CQkJIyBuZXh0IHNl
Y3RvcgorCXNobHcJJDUsJWJ4CQkJIyBzZWN0b3JzIC0+IHBhcmFncmFnaHMKKwltb3Z3CSVlcywg
JWJwCisJYWRkdwklYngsICVicAorI2Vsc2UKKwlkZWN3CSVkaQkJCSMgdXBkYXRlIHNlY3RvciBj
b3VudGVyCisJaW5jdwklY3gJCQkjIG5leHQgc2VjdG9yCisJbW92dwklZXMsICVicAorCWFkZHcJ
JDMyLCAlYnAJCSMgc2VjdG9yIHNpemUgaW4gcGFyYWdyYWdocworI2VuZGlmCisJbW92dwklYnAs
ICVlcwkJIyBuZXh0IGxvY2F0aW9uCisgICAgICAgIGNtcGIgICAgJWFsLCVjbAkJCSMgcmVhY2gg
c2VjdG9yIGxpbWl0ID8KKyAgICAgICAgam5lICAgICBiZGVuZGxwCituZXh0X2hlYWQ6CisgICAg
ICAgIG1vdmIgICAgJWNsLCVhbAorICAgICAgICBpbmNiICAgICVkaAkJCSMgbmV4dCBoZWFkCisg
ICAgICAgIG1vdmIgICAgJDEsJWNsCQkJIyBmaXJzdCBzZWN0b3IKKyAgICAgICAgY21wYiAgICAl
YWgsJWRoCQkJIyByZWFjaCBoZWFkIGxpbWl0ID8KKyAgICAgICAgam5lICAgICBiZGVuZGxwCitu
ZXh0X3RyYWNrOgorICAgICAgICBtb3ZiICAgICVkaCwlYWgKKyAgICAgICAgbW92YiAgICAkMCwl
ZGgJCQkjIGZpcnN0IGhlYWQKKyMgTk9URSA6IHN1cHBvcnQgMjU2IGN5bGluZGVycyBtYXgKKyAg
ICAgICAgaW5jYiAgICAlY2gJCQkjIG5leHQgY3lsaW5kZXIKK2JkZW5kbHA6CisJbW92dwklZHgs
IGN1cmR4CQkjIHNhdmUgZGlzayBzdGF0ZQorCW1vdncJJWN4LCBjdXJjeAorCW1vdncJJWF4LCBs
aW1pdHMKK3JlYWRfc2VjdG9yczoKKwltb3Z3CWN1cmR4LCAlZHgJCSMgcmVzdG9yZSBkaXNrIHN0
YXRlCisJbW92dwljdXJjeCwgJWN4CisjICAgYWwgaXMgbGFzdCBzZWN0b3IrMQorIyAgIGFoIGlz
IGxhc3QgaGVhZCsxCisJbW92dwlsaW1pdHMsICVheAorCW9ydwklZGksJWRpCisgICAgICAgIGpu
ZQlyZWFkX3NlY3RvcnNscAorCW1vdmIJJDB4MmUsICVhbCAJCSMgbG9hZGluZy4uLiBtZXNzYWdl
IDJlID0gLgorcHV0YzoKKwltb3ZiCSQweGUsICVhaAorCW1vdncJJDcsICVieAkJCSMgICBvbmUg
ZG90IGVhY2ggNjRrCisgCWludAkkMHgxMAorcmV0dXJuOgorCXJldAorCitwcmludF9ubDoKKwkK
Kwltb3ZiCSQweGQsICVhbAkJIyBDUgorCWNhbGwJcHV0YworCW1vdmIJJDB4YSwgJWFsCQkjIExG
CisJam1wCXB1dGMKKworcHV0czoKKwljYWxsCXByaW50X25sCQkjIHNldCAlYWggYW5kICVieAor
cHV0c2xwOgorCWxvZHNiCisJb3JiCSVhbCwlYWwJCQkjIGVuZCBvZiBzdHJpbmcgaXMgXDAKKwlq
eglyZXR1cm4KK3B1dGNzOgorCWludAkkMHgxMAorCWptcAlwdXRzbHAKIAorZmxvcHB5X3RhYmxl
OgorI2lmZGVmIEVYVFJBX0RFVklDRVMJCQorCQkuYnl0ZQkxNiw5CQkJIyAvZGV2L2ZkMHU3MjAK
KwkJLmJ5dGUJMTIsMTAJCQkjIC9kZXYvZmQwdTgwMAorCQkuYnl0ZQk4MCwxMQkJCSMgL2Rldi9m
ZDB1ODgwCisJCS5ieXRlCTEyNSwyMAkJCSMgL2Rldi9mZDB1MTYwMAorCQkuYnl0ZQk0NCwyMQkJ
CSMgL2Rldi9mZDB1MTY4MAorCQkuYnl0ZQk5NiwyMgkJCSMgL2Rldi9mZDB1MTc2MAorCQkuYnl0
ZQkxMTYsMjMJCQkjIC9kZXYvZmQwdTE4NDAKKwkJLmJ5dGUJMTAwLDI0CQkJIyAvZGV2L2ZkMHUx
OTIwCisJCS5ieXRlCTEwNSw0MAkJCSMgL2Rldi9mZDB1MzIwMAorCQkuYnl0ZQkxMDksNDQJCQkj
IC9kZXYvZmQwdTM1MjAKKwkJLmJ5dGUJMTEzLDQ4CQkJIyAvZGV2L2ZkMHUzODQwCisjZW5kaWYJ
CQorCQkuYnl0ZQk4LDE1CQkJIyAvZGV2L2ZkMGgxMjAwIC0gL2Rldi9wczAKKwkJLmJ5dGUJMjgs
MTgJCQkjIC9kZXYvZmQwdTE0NDAgLSAvZGV2L1BTMAorCQkuYnl0ZQkzMiwzNgkJCSMgL2Rldi9m
ZDB1Mjg4MCAtIC9kZXYvZmQwSDI4ODAKKwkJLmJ5dGUJMCwxMjgJCQkjIC9kZXYvZmQwIC0gZGVm
YXVsdDogYXV0b2RldGVjdAorCityZWdzOgkJLmFzY2l6CSJYOiIKKworI2lmbmRlZglESVNQTEFZ
X0tFUk5FTF9WRVJTSU9OCittc2cxOgkJLmFzY2l6CSJMb2FkaW5nIgorI2VuZGlmCQkKIAotCSMg
S2VybmVsIGF0dHJpYnV0ZXM7IHVzZWQgYnkgc2V0dXAKK3RhaWw6CisJCS5zcGFjZQk0OTcrc3Rh
cnQtdGFpbAkJCiAKLQkub3JnIDQ5NworIy5vcmcgNDk3CiBzZXR1cF9zZWN0czoJLmJ5dGUgU0VU
VVBTRUNUUwogcm9vdF9mbGFnczoJLndvcmQgUk9PVF9SRE9OTFkKLXN5c3NpemU6CS53b3JkIFNZ
U1NJWkUKLXN3YXBfZGV2Ogkud29yZCBTV0FQX0RFVgotcmFtX3NpemU6CS53b3JkIFJBTURJU0sK
K3N5c3NpemU6CS5sb25nIFNZU1NJWkUKK3JhbV9zaXplOgkud29yZCBSQU1ESVNLCQkJIyByYW1k
aXNrIHNpemUsIHJhbWRpc2sgZmxhZ3MgYW5kIGNtZGxpbmUgZmxhZwogdmlkX21vZGU6CS53b3Jk
IFNWR0FfTU9ERQogcm9vdF9kZXY6CS53b3JkIFJPT1RfREVWCiBib290X2ZsYWc6CS53b3JkIDB4
QUE1NQpkaWZmIC1wdXJOIGxpbnV4LTIuNi4xMy1naXQxMi9hcmNoL2kzODYva2VybmVsL3NldHVw
LmMgbGludXgtMi42LjEzLWdpdDEyLWJvb3RibG9jay9hcmNoL2kzODYva2VybmVsL3NldHVwLmMK
LS0tIGxpbnV4LTIuNi4xMy1naXQxMi9hcmNoL2kzODYva2VybmVsL3NldHVwLmMJMjAwNS0wOS0x
NCAxMDoyMToxMS4wMDAwMDAwMDAgKzAyMDAKKysrIGxpbnV4LTIuNi4xMy1naXQxMi1ib290Ymxv
Y2svYXJjaC9pMzg2L2tlcm5lbC9zZXR1cC5jCTIwMDUtMDktMTQgMTA6MjU6MjUuMDAwMDAwMDAw
ICswMjAwCkBAIC0xNTcsNiArMTU3LDcgQEAgdW5zaWduZWQgbG9uZyBzYXZlZF92aWRlb21vZGU7
CiAjZGVmaW5lIFJBTURJU0tfSU1BR0VfU1RBUlRfTUFTSyAgCTB4MDdGRgogI2RlZmluZSBSQU1E
SVNLX1BST01QVF9GTEFHCQkweDgwMDAKICNkZWZpbmUgUkFNRElTS19MT0FEX0ZMQUcJCTB4NDAw
MAkKKyNkZWZpbmUgQ01ETElORV9MT0FEX0ZMQUcJCTB4MjAwMAkKIAogc3RhdGljIGNoYXIgY29t
bWFuZF9saW5lW0NPTU1BTkRfTElORV9TSVpFXTsKIApkaWZmIC1wdXJOIGxpbnV4LTIuNi4xMy1n
aXQxMi9hcmNoL3g4Nl82NC9ib290L2Jvb3RzZWN0LlMgbGludXgtMi42LjEzLWdpdDEyLWJvb3Ri
bG9jay9hcmNoL3g4Nl82NC9ib290L2Jvb3RzZWN0LlMKLS0tIGxpbnV4LTIuNi4xMy1naXQxMi9h
cmNoL3g4Nl82NC9ib290L2Jvb3RzZWN0LlMJMjAwNS0wOS0xNCAxMDoxMDowMC4wMDAwMDAwMDAg
KzAyMDAKKysrIGxpbnV4LTIuNi4xMy1naXQxMi1ib290YmxvY2svYXJjaC94ODZfNjQvYm9vdC9i
b290c2VjdC5TCTIwMDUtMDktMTQgMTA6MzY6MTMuMDAwMDAwMDAwICswMjAwCkBAIC00LDIwICs0
LDMxIEBACiAgKgltb2RpZmllZCBieSBEcmV3IEVja2hhcmR0CiAgKgltb2RpZmllZCBieSBCcnVj
ZSBFdmFucyAoYmRlKQogICoJbW9kaWZpZWQgYnkgQ2hyaXMgTm9lIChNYXkgMTk5OSkgKGFzODYg
LT4gZ2FzKQotICoJZ3V0dGVkIGJ5IEguIFBldGVyIEFudmluIChKYW4gMjAwMykKKyAqCisgKiAg
ICAgIHJld3JpdHRlbiB0byBzdXBwb3J0IHVwIHRvIDMyTWIga2VybmVsLCBjbWRsaW5lCisgKiAg
ICAgIGFuZCBhbnkgZGlzayBnZW9tZXRyeSBieSA8cGFzY2FsLmJlbGxhcmRAYWRzLWx1LmNvbT4K
ICAqCiAgKiBCSUcgRkFUIE5PVEU6IFdlJ3JlIGluIHJlYWwgbW9kZSB1c2luZyA2NGsgc2VnbWVu
dHMuICBUaGVyZWZvcmUgc2VnbWVudAogICogYWRkcmVzc2VzIG11c3QgYmUgbXVsdGlwbGllZCBi
eSAxNiB0byBvYnRhaW4gdGhlaXIgcmVzcGVjdGl2ZSBsaW5lYXIKICAqIGFkZHJlc3Nlcy4gVG8g
YXZvaWQgY29uZnVzaW9uLCBsaW5lYXIgYWRkcmVzc2VzIGFyZSB3cml0dGVuIHVzaW5nIGxlYWRp
bmcKICAqIGhleCB3aGlsZSBzZWdtZW50IGFkZHJlc3NlcyBhcmUgd3JpdHRlbiBhcyBzZWdtZW50
Om9mZnNldC4KICAqCisgKiBiZGUgLSBzaG91bGQgbm90IGp1bXAgYmxpbmRseSwgdGhlcmUgbWF5
IGJlIHN5c3RlbXMgd2l0aCBvbmx5IDUxMksgbG93CisgKiBtZW1vcnkuICBVc2UgaW50IDB4MTIg
dG8gZ2V0IHRoZSB0b3Agb2YgbWVtb3J5LCBldGMuCisgKgorICogSXQgdGhlbiBsb2FkcyAnc2V0
dXAnIGRpcmVjdGx5IGFmdGVyIGl0c2VsZiAoMHg5MDIwMCksIGFuZCB0aGUgc3lzdGVtCisgKiBh
dCAweDEwMDAwLCB1c2luZyBCSU9TIGludGVycnVwdHMuIAorICoKKyAqIFRoZSBsb2FkZXIgaGFz
IGJlZW4gbWFkZSBhcyBzaW1wbGUgYXMgcG9zc2libGUsIGFuZCBjb250aW51b3VzCisgKiByZWFk
IGVycm9ycyB3aWxsIHJlc3VsdCBpbiBhIHVuYnJlYWthYmxlIGxvb3AuIFJlYm9vdCBieSBoYW5k
LiBJdAorICogbG9hZHMgcHJldHR5IGZhc3QgYnkgZ2V0dGluZyB3aG9sZSB0cmFja3MgYXQgYSB0
aW1lIHdoZW5ldmVyIHBvc3NpYmxlLgogICovCiAKICNpbmNsdWRlIDxhc20vYm9vdC5oPgogCiBT
RVRVUFNFQ1RTCT0gNAkJCS8qIGRlZmF1bHQgbnIgb2Ygc2V0dXAtc2VjdG9ycyAqLwogQk9PVFNF
RwkJPSAweDA3QzAJCS8qIG9yaWdpbmFsIGFkZHJlc3Mgb2YgYm9vdC1zZWN0b3IgKi8KLUlOSVRT
RUcJCT0gREVGX0lOSVRTRUcJCS8qIHdlIG1vdmUgYm9vdCBoZXJlIC0gb3V0IG9mIHRoZSB3YXkg
Ki8KK0lOSVRTRUcJCT0gREVGX0lOSVRTRUcJCS8qIHdlIGxvYWQgYm9vdCBoZXJlIC0gb3V0IG9m
IHRoZSB3YXkgKi8KIFNFVFVQU0VHCT0gREVGX1NFVFVQU0VHCQkvKiBzZXR1cCBzdGFydHMgaGVy
ZSAqLwogU1lTU0VHCQk9IERFRl9TWVNTRUcJCS8qIHN5c3RlbSBsb2FkZWQgYXQgMHgxMDAwMCAo
NjU1MzYpICovCiBTWVNTSVpFCQk9IERFRl9TWVNTSVpFCQkvKiBzeXN0ZW0gc2l6ZTogIyBvZiAx
Ni1ieXRlIGNsaWNrcyAqLwpAQCAtMjUsNiArMzYsMTIgQEAgU1lTU0laRQkJPSBERUZfU1lTU0la
RQkJLyogc3lzdGVtIHNpemU6IAogUk9PVF9ERVYJPSAwIAkJCS8qIFJPT1RfREVWIGlzIG5vdyB3
cml0dGVuIGJ5ICJidWlsZCIgKi8KIFNXQVBfREVWCT0gMAkJCS8qIFNXQVBfREVWIGlzIG5vdyB3
cml0dGVuIGJ5ICJidWlsZCIgKi8KIAorLyogc29tZSBleHRyYSBmZWF0dXJlcyAqLworI2RlZmlu
ZSBESVNQTEFZX0tFUk5FTF9WRVJTSU9OCQlhcyBzb29uIGFzIHBvc3NpYmxlCisjZGVmaW5lCUVE
SVRfQ01ETElORQkJCW9uIGhvdGtleQorI2RlZmluZQlMT0FEX0NNRExJTkUJCQlhY2NvcmRpbmcg
dG8gYml0IHJhbXNpemUuMTMKKyNkZWZpbmUgRVhUUkFfREVWSUNFUwkJCXRvIGZpbGwgcm9vdF9k
ZXZpY2UKKwogI2lmbmRlZiBTVkdBX01PREUKICNkZWZpbmUgU1ZHQV9NT0RFIEFTS19WR0EKICNl
bmRpZgpAQCAtNDIsNTcgKzU5LDQ3MiBAQCBTV0FQX0RFVgk9IDAJCQkvKiBTV0FQX0RFViBpcyBu
b3cgd3JpdHRlCiAKIC5nbG9iYWwgX3N0YXJ0CiBfc3RhcnQ6CitjdXJkcml2ZQk9CV9zdGFydAor
Y3VyZHgJCT0JX3N0YXJ0CitjdXJjeAkJPQlfc3RhcnQrMgorbGltaXRzCQk9CV9zdGFydCs0CisJ
Y2xkCQkJCSMgYXNzdW1lIG5vdGhpbmcKKwltb3Z3CSRJTklUU0VHLCAlYXgKKwltb3Z3CSVheCwg
JWVzCQkjICVheCA9ICVlcyA9IElOSVRTRUcKKyNpZiBNT1ZFX0JPT1RTRUNUT1IKKyMgRmlyc3Qg
dGhpbmdzIGZpcnN0LiBNb3ZlIG91cnNlbGYgZnJvbSAweDdDMDAgLT4gMHg5MDAwMCBhbmQganVt
cCB0aGVyZS4KKwltb3Z3CSRCT09UU0VHLCAlY3gKKwltb3Z3CSVjeCwgJWRzCQkjICVkcyA9IEJP
T1RTRUcKKwltb3ZiCSQxLCAlY2gJCQkjICVjeCA9IDI1NgorCXN1YncJJXNpLCAlc2kKKwlzdWJ3
CSVkaSwgJWRpCisJcmVwCisJbW92c3cKKwlsam1wCSRJTklUU0VHLCAkZ28KK2dvOgkKKyNlbHNl
CisJeG9ydwklY3gsICVjeAkJIyAlY3ggPSAwCisjZW5kaWYKKworIyBiZGUgLSBjaGFuZ2VkIDB4
ZmYwMCB0byAweDQwMDAgdG8gdXNlIGRlYnVnZ2VyIGF0IDB4NjQwMCB1cCAoYmRlKS4gIFdlCisj
IHdvdWxkbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhpcyBpZiB3ZSBjaGVja2VkIHRoZSB0b3Ag
b2YgbWVtb3J5LiAgQWxzbworIyBteSBCSU9TIGNhbiBiZSBjb25maWd1cmVkIHRvIHB1dCB0aGUg
d2luaSBkcml2ZSB0YWJsZXMgaW4gaGlnaCBtZW1vcnkKKyMgaW5zdGVhZCBvZiBpbiB0aGUgdmVj
dG9yIHRhYmxlLiAgVGhlIG9sZCBzdGFjayBtaWdodCBoYXZlIGNsb2JiZXJlZCB0aGUKKyMgZHJp
dmUgdGFibGUuCisKKwltb3Z3CSQweDQwMDAtMTIsICVkaQkJIyAweDQwMDAgaXMgYW4gYXJiaXRy
YXJ5IHZhbHVlID49CisJCQkJCSMgbGVuZ3RoIG9mIGJvb3RzZWN0ICsgbGVuZ3RoIG9mCisJCQkJ
CSMgc2V0dXAgKyByb29tIGZvciBzdGFjazsKKwkJCQkJIyAxMiBpcyBkaXNrIHBhcm0gc2l6ZS4K
KwkJCQkJIyBnZHQgd2lsbCBoZWF0IDQ4IG1vcmUgYnl0ZXMuCisJbW92dwklYXgsICVzcwkJIyAl
YXggYW5kICVlcyBhbHJlYWR5IGNvbnRhaW4gSU5JVFNFRworCW1vdncJJWRpLCAlc3AJCSMgcHV0
IHN0YWNrIGF0IElOSVRTRUc6MHg0MDAwLTEyLgorCisjIE1hbnkgQklPUydzIGRlZmF1bHQgZGlz
ayBwYXJhbWV0ZXIgdGFibGVzIHdpbGwgbm90IHJlY29nbml6ZQorIyBtdWx0aS1zZWN0b3IgcmVh
ZHMgYmV5b25kIHRoZSBtYXhpbXVtIHNlY3RvciBudW1iZXIgc3BlY2lmaWVkCisjIGluIHRoZSBk
ZWZhdWx0IGRpc2tldHRlIHBhcmFtZXRlciB0YWJsZXMgLSB0aGlzIG1heSBtZWFuIDcKKyMgc2Vj
dG9ycyBpbiBzb21lIGNhc2VzLgorIworIyBTaW5jZSBzaW5nbGUgc2VjdG9yIHJlYWRzIGFyZSBz
bG93IGFuZCBvdXQgb2YgdGhlIHF1ZXN0aW9uLAorIyB3ZSBtdXN0IHRha2UgY2FyZSBvZiB0aGlz
IGJ5IGNyZWF0aW5nIG5ldyBwYXJhbWV0ZXIgdGFibGVzCisjIChmb3IgdGhlIGZpcnN0IGRpc2sp
IGluIFJBTS4gIFdlIGNhbiBzZXQgdGhlIG1heGltdW0gc2VjdG9yCisjIGNvdW50IHRvIDM2IC0g
dGhlIG1vc3Qgd2Ugd2lsbCBlbmNvdW50ZXIgb24gYW4gRUQgMi44OC4gIAorIworIyBIaWdoIGRv
ZXNuJ3QgaHVydC4gIExvdyBkb2VzLiAgTGV0J3MgdXNlIHRoZSBtYXg6IDYzCisjCisjIFNlZ21l
bnRzIGFyZSBhcyBmb2xsb3dzOiAlZXMgPSAlc3MgPSBJTklUU0VHLAorIyAlZnMgYW5kICVncyBh
cmUgdW51c2VkLgorCisJbW92dwkkMHg3OCwgJWJ4CQkjICVkczolYnggaXMgcGFyYW1ldGVyIHRh
YmxlIGFkZHJlc3MKKwltb3Z3CSVjeCwgJWRzCQkjICVkcyA9IDAKKwlsZHN3CSglYngpLCAlc2kJ
CSMgJWRzOiVzaSBpcyBzb3VyY2UKKwltb3ZiCSQ2LCAlY2wJCQkjIGNvcHkgMTIgYnl0ZXMKKwly
ZXAJCQkJIyBkb24ndCB3b3JyeSBhYm91dCBjbGQKKwltb3ZzdwkJCQkjIGFscmVhZHkgZG9uZSBh
Ym92ZQorCW1vdncJJWN4LCAlZHMJCSMgJWRzID0gMAorCW1vdncJJXNwLCAoJWJ4KQkJIyAlc3Ag
PSAweDQwMDAtMTIKKwltb3Z3CSVlcywgMiglYngpCisJcHVzaHcJJWVzCisJcG9wdwklZHMJCQkj
IG5vdyAlZHMgPSAlZXMgPSAlc3MgPSBJTklUU0VHCisJbW92YgkkNjMsIDB4NC0xMiglZGkpCSMg
cGF0Y2ggc2VjdG9yIGNvdW50LCAlZGkgPSAweDQwMDAKKworCWNsaQorCWNidwkJCQkjICVheCA9
IDAgOiBnZW9tZXRyeSB1bmtub3duIHlldAorCXhvcmIJJWRoLCAlZGgJCSMgaGVhZCAwLCBjdXJy
ZW50IGRyaXZlCisJaW5jdwklY3gJCQkjIGN5bGluZGVyIDAsIHNlY3RvciAxCisJbW92dwklY3gs
ICVkaQkJIyByZWFkIDEgc2VjdG9yCisJY2FsbAlyZWFkX2ZpcnN0X3NlY3RvcgkjIHJlYWQgYm9v
dHNlY3RvciBhZ2FpbiB0byBoYXZlCisJCQkJCSMgYWNjZXNzIHRvIGRhdGEgc2VnbWVudAorCisj
aWZuZGVmCURJU1BMQVlfS0VSTkVMX1ZFUlNJT04KKwltb3Z3CSRtc2cxLCAlc2kKKwljYWxsCXB1
dHMKKyNlbmRpZgogCi0JIyBOb3JtYWxpemUgdGhlIHN0YXJ0IGFkZHJlc3MKLQlqbXBsCSRCT09U
U0VHLCAkc3RhcnQyCisjIExvYWQgdGhlIHNldHVwLXNlY3RvcnMgZGlyZWN0bHkgYWZ0ZXIgdGhl
IG1vdmVkIGJvb3RibG9jayAoYXQgMHg5MDIwMCkuCiAKLXN0YXJ0MjoKLQltb3Z3CSVjcywgJWF4
Ci0JbW92dwklYXgsICVkcworCW1vdmIJc2V0dXBfc2VjdHMsICVhbAorI2lmZGVmIENIRUNLX1NF
VFVQX1NJWkUKKwlvcmIJJWFsLCAlYWwKKwlqbmUJc2V0dXBfc2l6ZV9vaworCW1vdmIJJFNFVFVQ
U0VDVFMsICVhbAorc2V0dXBfc2l6ZV9vazoJCisjZW5kaWYKKwljYncKKwl4Y2hnCSVheCwgJWRp
CisJY2FsbAlyZWFkX3NlY3RvcnMJCSMgcmVhZCBzZXR1cAorCisjaWZkZWYJRElTUExBWV9LRVJO
RUxfVkVSU0lPTgorI2RlZmluZSBrZXJuZWxfdmVyc2lvbgkweEUKKwltb3Z3CSQweDIwMCwlc2kK
KwlhZGR3CWtlcm5lbF92ZXJzaW9uKCVzaSksJXNpCSMgc3RhcnRpbmcgcHJvdG9jb2wgMi4wMCwg
S2VybmVsIDEuMy43MworCWNhbGwJcHV0cwkJCSMgc2hvdyB3aGljaCBrZXJuZWwgd2UgYXJlIGxv
YWRpbmcKKyNlbmRpZgorCisjIFRoaXMgcm91dGluZSBsb2FkcyB0aGUgc3lzdGVtIGF0IGFkZHJl
c3MgU1lTU0VHLCBtYWtpbmcgc3VyZQorIyBubyA2NGtCIGJvdW5kYXJpZXMgYXJlIGNyb3NzZWQu
IFdlIHRyeSB0byBsb2FkIGl0IGFzIGZhc3QgYXMKKyMgcG9zc2libGUsIGxvYWRpbmcgd2hvbGUg
dHJhY2tzIHdoZW5ldmVyIHdlIGNhbi4KKworI2lmZGVmIF9fQklHX0tFUk5FTF9fCit0eXBlX29m
X2xvYWRlcgk9CTUyOAorCW1vdncJJDI0LCAlY3gJCSMgYWxsb2NhdGUgNDggYnl0ZXMgaW4gc3Rh
Y2sKK2luaXRfZ2R0OgorCXB1c2gJJDAJCQkjICAgaW5pdGlhbGl6ZWQgd2l0aCAwCisJbG9vcAlp
bml0X2dkdAorCW1vdncJJXNwLCAlc2kJCSMgZm9yIGJvb3RzZWN0X2dkdAorCW1vdncJJDB4OTMw
MCsoU1lTU0VHLzQwOTYpLCAlYXgJIyBzb3VyY2UgPSBTWVNTRUcKKwljd2QKKwltb3Z3CSVheCwg
MjAoJXNpKQkJIyBib290c2VjdF9zcmNfYmFzZSsyCisJbW92YgkkMHgxMC0xLCAlYWwJCSMgZGVz
dGluYXRpb24gPSAweDEwMDAwMAorCW1vdncJJWF4LCAyOCglc2kpCQkjIGJvb3RzZWN0X2RzdF9i
YXNlKzIKKwltb3Z3CSVkeCwgMTYoJXNpKQkJIyBib290c2VjdF9zcmMgPSA2NEtiCisJbW92dwkl
ZHgsIDI0KCVzaSkJCSMgYm9vdHNlY3RfZHN0ID0gNjRLYgorCW1vdmIJJWRsLCB0eXBlX29mX2xv
YWRlcgkjIGxvYWRlciB0eXBlID0gMHhGRgorCW1vdmwJJDB4MUYsICVlYXgKKwlhZGRsCXN5c3Np
emUsICVlYXgJCSMgZ2V0IHN5c3RlbSBzaXplCisJc2hybAkkNSwgJWVheAkJIyBjb252ZXJ0IHRv
IHNlY3RvciBjb3VudAorc3lzbHA6CisJcHVzaHcJJWF4CisJbW92dwkkU1lTU0VHLCAlZGkKKwlt
b3Z3CSVkaSwgJWVzCisJbW92dwkkMTI4LCVkaQkJIyA2NEtiIGluIHNlY3RvcnMKKwlzdWJ3CSVk
aSwgJWF4CisJcHVzaGYKKwlqbmMJbm90X2xhc3QKKwlhZGR3CSVheCwgJWRpCitub3RfbGFzdDoK
KwljYWxsCXJlYWRfc2VjdG9ycworCWluY3cJMjgoJXNpKQkJCSMgYm9vdHNlY3RfZHN0X2Jhc2Ur
MgorCW1vdncJJDB4ODAwMCwgJWN4CQkjIGZ1bGwgNjRLCisJbW92YgkkMHg4NywgJWFoCisJcHVz
aAklc3MKKwlwb3AJJWVzCQkJIyBnZHQgaW4gZXM6c2kKKwlpbnQJJDB4MTUKKwlwb3BmCisJcG9w
dwklYXgJCQkjIGdldCByZW1haW5pbmcgc2VjdG9yIGNvdW50CisJamEJc3lzbHAKKyNlbHNlCisJ
bW92dwkkU1lTU0VHLCAlYXgKIAltb3Z3CSVheCwgJWVzCi0JbW92dwklYXgsICVzcwotCW1vdncJ
JDB4N2MwMCwgJXNwCi0Jc3RpCi0JY2xkCitzeXNscDoKKwltb3Z3CSQxMjgqMzIsJWF4CQkjIDY0
S2IgaW4gcGFyYWdyYXBocworCXN1YncJJWF4LCBzeXNzaXplCisJcHVzaGYKKwlqbmMJbm90X2xh
c3QKKwlhZGR3CXN5c3NpemUsICVheAorbm90X2xhc3Q6CisJbW92YgkkNSwgJWNsCQkJIyBwYXJh
Z3JhcGhzIC0+IHNlY3RvcnMKKwlzaHJ3CSVjbCwgJWF4CisJeGNoZwklYXgsICVkaQorCWNhbGwJ
cmVhZF9zZWN0b3JzCisJcG9wZgorCWphCXN5c2xwCisjZW5kaWYKIAotCW1vdncJJGJ1Z2dlcl9v
ZmZfbXNnLCAlc2kKKyMgQWZ0ZXIgdGhhdCB3ZSBjaGVjayB3aGljaCByb290LWRldmljZSB0byB1
c2UuIElmIHRoZSBkZXZpY2UgaXMKKyMgZGVmaW5lZCAoIT0gMCksIG5vdGhpbmcgaXMgZG9uZSBh
bmQgdGhlIGdpdmVuIGRldmljZSBpcyB1c2VkLgorIyBPdGhlcndpc2UsIG9uZSBvZiAvZGV2L2Zk
MEgyODgwICgyLDMyKSBvciAvZGV2L1BTMCAoMiwyOCkgb3IgL2Rldi9hdDAgKDIsOCkKKyMgZGVw
ZW5kaW5nIG9uIHRoZSBudW1iZXIgb2Ygc2VjdG9ycyB3ZSBwcmV0ZW5kIHRvIGtub3cgd2UgaGF2
ZS4KKworCisJbW92dwlyb290X2RldiwgJWF4CisJb3J3CSVheCwgJWF4CisJam56CXJvb3RfZGVm
aW5lZAorCisJbW92dwkkZmxvcHB5X3RhYmxlLCVzaQorc2Nhbl9mbG9wcHlfdGFibGU6CisJbG9k
c3cKKwljbXBiCWxpbWl0cywgJWFoCisJamUJc2V0X3Jvb3QKKwlqbm8Jc2Nhbl9mbG9wcHlfdGFi
bGUKK3NldF9yb290OgorCW1vdmIJJDIsICVhaAorCWFkZGIJJWRsLCAlYWwJCSMgYWRkIGN1cnJl
bnQgKGZsb3BweSkgZHJpdmUKKwltb3Z3CSVheCwgcm9vdF9kZXYKK3Jvb3RfZGVmaW5lZDoKKwor
I2lmIGRlZmluZWQoTE9BRF9DTURMSU5FKSB8fCBkZWZpbmVkKEVESVRfQ01ETElORSkKKyNkZWZp
bmUgQlVGRkVSCTB4N0YwMAorCW1vdncJJEJVRkZFUiwgJXNpCisJbW92dwklc2ksICglc2kpCQkj
IGRlZmF1bHQgOiBubyBjbWRsaW5lCisjZW5kaWYKIAotbXNnX2xvb3A6Ci0JbG9kc2IKLQlhbmRi
CSVhbCwgJWFsCi0JanoJZGllCi0JbW92YgkkMHhlLCAlYWgKLQltb3Z3CSQ3LCAlYngKLQlpbnQJ
JDB4MTAKLQlqbXAJbXNnX2xvb3AKKyNpZmRlZglMT0FEX0NNRExJTkUKKwl0ZXN0YgkkMHgyMCxy
YW1fc2l6ZSsxCSMgYml0IDExIHRvIDEzIHdoZXJlIHVudXNlZAorCQkJCQkjIG5vdyBiaXQgMTMg
bWVhbnM6IGxvYWQgY21kbGluZQorCWp6CW5vY21kCisJbW92dwkkQlVGRkVSLzE2K0lOSVRTRUcs
ICVheAorCW1vdncJJWF4LCAlZXMKKwltb3Z3CSQxLCAlZGkJCQkjIGNtZGxpbmUgPSA1MTIgYnl0
ZXMgbWF4CisJY2FsbAlyZWFkX3NlY3RvcnMKK25vY21kOgorI2VuZGlmCiAKLWRpZToKLQkjIEFs
bG93IHRoZSB1c2VyIHRvIHByZXNzIGEga2V5LCB0aGVuIHJlYm9vdAotCXhvcncJJWF4LCAlYXgK
KyNkZWZpbmUgUlNIRlQgICAweDAxCisjZGVmaW5lIExTSEZUICAgMHgwMgorI2RlZmluZSBDVFJM
ICAgIDB4MDQKKyNkZWZpbmUgQUxUICAgICAweDA4CisjZGVmaW5lIFNDUkxDSyAgMHgxMAorI2Rl
ZmluZSBOVU1MQ0sgIDB4MjAKKyNkZWZpbmUgQ0FQU0xDSyAweDQwCisjZGVmaW5lIElOU0VSVCAg
MHg4MAorCisjaWZkZWYJRURJVF9DTURMSU5FCisjIFRoZSBjbWRsaW5lIGNhbiBiZSBlbnRlcmVk
IGFuZCBtb2RpZmVkIG9uIGhvdCBrZXkuCisjIE9ubHkgY2hhcmFjdGVycyBiZWZvcmUgdGhlIGN1
cnNvciBhcmUgcGFzc2VkIHRvIHRoZSBrZXJuZWwuCisJbW92YgkkMiwgJWFoCQkJIyBnZXQga2V5
Ym9hcmQgc3RhdHVzCisJaW50CSQweDE2CisJdGVzdGIJJFJTSEZUfExTSEZUfENUUkx8QUxUfENB
UFNMQ0ssICVhbAorCWp6CW5vY21kbGluZQorCXB1c2h3CSVzaQorCWNhbGwJcHV0cwkJCSMgc2V0
ICVhaCBhbmQgJWJ4CitjbWRscDoKKyMgaWYgMQorCW1vdmIJJDMyLCAlYWwJCSMgY2xlYXIgZW5k
IG9mIGxpbmUKKwlpbnQJJDB4MTAJCQkjICB3aXRoIFNwYWNlCisJbW92YgkkOCwgJWFsCQkJIyAg
IGFuZCBCYWNrU3BhY2UKKwlpbnQJJDB4MTAKKyMgZW5kaWYKKwlkZWN3CSVzaQorY21kZ2V0Ogor
CWNidwkJCQkjICVhaCA9IDAsIGdldCBrZXlib2FyZCBjaGFyYWN0ZXIKIAlpbnQJJDB4MTYKLQlp
bnQJJDB4MTkKKwljbXBiCSQ4LCAlYWwJCQkjIEJhY2tTcGFjZSA/CisJamUJY21kYnMKKwljYncK
Kwltb3Z3CSVheCwgKCVzaSkJCSMgc3RvcmUgZW5kIG9mIHN0cmluZyB0b28KKwlpbmN3CSVzaQor
CWluY3cJJXNpCitjbWRiczoKKwljbXB3CSRCVUZGRVIsICVzaQkJIyBsb3dlciBsaW1pdCBpcyBj
aGVja2VkCisJamUJY21kZ2V0CQkJIyAgIGJ1dCB1cHBlciBsaW1pdCBub3QKKwljYWxsCXB1dGMK
KwljbXBiCSQxMywgJWFsCQkjIEVudGVyID8KKwlqbmUJY21kbHAKKwlwb3B3CSVzaQorbm9jbWRs
aW5lOgorI2VuZGlmCiAKLQkjIGludCAweDE5IHNob3VsZCBuZXZlciByZXR1cm4uICBJbiBjYXNl
IGl0IGRvZXMgYW55d2F5LAotCSMgaW52b2tlIHRoZSBCSU9TIHJlc2V0IGNvZGUuLi4KLQlsam1w
CSQweGYwMDAsJDB4ZmZmMAorI2lmIGRlZmluZWQoTE9BRF9DTURMSU5FKSB8fCBkZWZpbmVkKEVE
SVRfQ01ETElORSkKKyNpZiAxCitjbWRfbGluZV9tYWdpYwk9CTB4MjAKK2NtZF9saW5lX29mZnNl
dAk9CTB4MjIKKwltb3Z3CSQweEEzM0YsIGNtZF9saW5lX21hZ2ljCisJbW92dwklc2ksIGNtZF9s
aW5lX29mZnNldAorI2Vsc2UKKyMgcHJvdG9jb2wgPj0gMi4wMiwgc3RhcnRpbmcgS2VybmVsIDIu
NC4wLXRlc3QzLXByZTMKK2NtZF9saW5lX3B0cgk9CTB4MjI4CisJbW92engJJXNpLCAlZWF4CisJ
YWRkbAkkSU5JVFNFRyoxNiwgJWVheAorCW1vdmwJJWVheCwgY21kX2xpbmVfcHRyCisjZW5kaWYK
K2VtcHR5Y21kbGluZToKKyNlbmRpZgorCQorIyBUaGlzIHByb2NlZHVyZSB0dXJucyBvZmYgdGhl
IGZsb3BweSBkcml2ZSBtb3Rvciwgc28KKyMgdGhhdCB3ZSBlbnRlciB0aGUga2VybmVsIGluIGEg
a25vd24gc3RhdGUsIGFuZAorIyBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGl0IGxhdGVyLgor
CisjaWYgMQora2lsbF9tb3RvcjoKKwl4b3J3CSVheCwgJWF4CQkjIHJlc2V0IEZEQworCWludAkk
MHgxMworI2Vsc2UKK2tpbGxfbW90b3I6CisJbW92dwkkMHgzZjIsICVkeAorCXhvcmIJJWFsLCAl
YWwKKwlvdXRiCSVhbCwgJWR4CisjZW5kaWYKIAorCWNhbGwJcHJpbnRfbmwKIAotYnVnZ2VyX29m
Zl9tc2c6Ci0JLmFzY2lpCSJEaXJlY3QgYm9vdGluZyBmcm9tIGZsb3BweSBpcyBubyBsb25nZXIg
c3VwcG9ydGVkLlxyXG4iCi0JLmFzY2lpCSJQbGVhc2UgdXNlIGEgYm9vdCBsb2FkZXIgcHJvZ3Jh
bSBpbnN0ZWFkLlxyXG4iCi0JLmFzY2lpCSJcbiIKLQkuYXNjaWkJIlJlbW92ZSBkaXNrIGFuZCBw
cmVzcyBhbnkga2V5IHRvIHJlYm9vdCAuIC4gLlxyXG4iCi0JLmJ5dGUJMAorIyBBZnRlciB0aGF0
IChldmVyeXRoaW5nIGxvYWRlZCksIHdlIGp1bXAgdG8gdGhlIHNldHVwLXJvdXRpbmUKKyMgbG9h
ZGVkIGRpcmVjdGx5IGFmdGVyIHRoZSBib290YmxvY2s6CisjIFNlZ21lbnRzIGFyZSBhcyBmb2xs
b3dzOiAlZHMgPSAlc3MgPSBJTklUU0VHCisKKwlsam1wCSRTRVRVUFNFRywgJDAKKworIyByZWFk
X3NlY3RvcnMgcmVhZHMgJWRpIHNlY3RvcnMgaW50byAlZXM6MCBidWZmZXIuCisjICVlczowIGlz
IHVwZGF0ZWQgdG8gdGhlIG5leHQgbWVtb3J5IGxvY2F0aW9uLgorIyBGaXJzdCwgc2VjdG9ycyBh
cmUgcmVhZCBzZWN0b3IgYnkgc2VjdG9yIHVudGlsCisjIHNlY3RvciBwZXIgdHJhY2sgY291bnQg
aXMga25vd24uIFRoZW4gdGhleSBhcmUKKyMgcmVhZCB0cmFjayBieSB0cmFjay4KKyMgQXNzdW1l
IG5vIGVycm9yIG9uIGZpcnN0IHRyYWNrLgorCisjZGVmaW5lIFRSQUNLX0JZX1RSQUNLCWxvYWQg
YXMgZmFzdCBhcyBwb3NzaWJsZSAhCisjZGVmaW5lIFNIT1dfUkVHUwlzaG93IGludDEzIHN0YXR1
cyAmIHBhcmFtZXRlcnMKKworY2hlY2tfbGltaXRzOgorICAgICAgICBjbXBiICAgICVhbCwgJWNs
CQkjIG1heCBzZWN0b3Iga25vd24gPworICAgICAgICBqYQluZXh0X2hlYWQJCSMgICBubyAtPiBz
dG9yZSBpdAorICAgICAgICBjbXBiICAgICVhaCwgJWRoCQkjIG1heCBoZWFkIGtub3duID8KKyAg
ICAgICAgamEJbmV4dF90cmFjawkJIyAgIG5vIC0+IHN0b3JlIGl0CisJcHVzaGEJCQkJIyBzYXZl
IGNvbnRleHQKKyNpZmRlZiBTSE9XX1JFR1MKKwlwdXNodwklZXMJCQkjIHByaW50ICVlcyAobmFt
ZWQgRVgpCisJcHVzaHcJJWR4CQkJIyBwcmludCAlZHgKKwlwdXNodwklY3gJCQkjIHByaW50ICVj
eAorCXhvcncJJWN4LCAlY3gKKwlwdXNodwklY3gJCQkjIHByaW50ICVieAorIyBpZmRlZiBUUkFD
S19CWV9UUkFDSworCW1vdmIJJDIsICViaAorIyBlbmRpZgorCXB1c2h3CSVieAkJCSMgcHJpbnQg
JWF4CisJbW92YgkkNiwlY2wKKwlqbXAJcHJpbnRfYWxsCQkjIHByaW50ICVicCAoc3RhdHVzKQor
cHJpbnRfbG9vcDoKKwltb3ZiCSQweDYgKyAnQScgLSAxLCAlYWwKKwlzdWJiCSVjbCwgJWFsCisJ
bW92dwkkcmVncywgJXNpCQkjIGNhbGxlciAlc2kgaXMgc2F2ZWQKKwljYWxsCXB1dGNzCQkJIyBw
dXRjKCVhbCkgKyBwdXRzKCVzaSkKKyMgaXQgd2lsbCBwcmludCBvdXQgYWxsIG9mIHRoZSByZWdp
c3RlcnMuCisJcG9wdwklYnAJCQkjIGxvYWQgd29yZCBpbnRvICVicAorcHJpbnRfYWxsOgorCXB1
c2h3CSVjeAkJCSMgc2F2ZSBjb3VudCByZW1haW5pbmcKKwltb3ZiCSQ0LCAlY2wJCQkjIDQgaGV4
IGRpZ2l0cworcHJpbnRfZGlnaXQ6CisJcm9sdwkkNCwgJWJwCQkJIyByb3RhdGUgdG8gdXNlIGxv
dyA0IGJpdHMKKwltb3ZiCSQweDBmLCAlYWwKKwlhbmR3CSVicCwgJWF4CQkjICVhbCA9IG1hc2sg
Zm9yIG55YmJsZQorCWFkZGIJJDB4OTAsICVhbAkJIyBjb252ZXJ0ICVhbCB0byBhc2NpaSBoZXgK
KwlkYWEJCQkJIyBpbiBvbmx5IGZvdXIgaW5zdHJ1Y3Rpb25zIQorCWFkY2IJJDB4NDAsICVhbAor
CWRhYQorCWNhbGwJcHV0YwkJCSMgc2V0ICVhaCBhbmQgJWJ4CisJbG9vcAlwcmludF9kaWdpdAor
CW1vdmIJJDB4MjAsICVhbAkJIyBTUEFDRQorCWludAkkMHgxMAorCXBvcHcJJWN4CisJbG9vcAlw
cmludF9sb29wCisJeGNoZwklYXgsICVjeAkJIyAlYWggPSAwCisjZWxzZQorCWNidwkJCQkjICVh
aCA9IDAKKyNlbmRpZgorICAgICAgICBpbnQgICAgICQweDEzCQkJIyByZXNldCBjb250cm9sZXIK
Kwlwb3BhCQkJCSMgcmVzdG9yZSBjb250ZXh0CityZWFkX3NlY3RvcnNscDoKK3JlYWRfZmlyc3Rf
c2VjdG9yOgorICAgICAgICBwdXNodyAgICVkaQkJCSMgc2VjdG9yIGNvdW50CisgICAgICAgIHB1
c2h3ICAgJWF4CQkJIyBsaW1pdHMKKyAgICAgICAgcHVzaHcgICAlZHgKKyAgICAgICAgcHVzaHcg
ICAlY3gKKwl4b3J3CSVieCwgJWJ4CisjaWZkZWYgVFJBQ0tfQllfVFJBQ0sKKwlzdWJiCSVjbCwg
JWFsCQkjIHNlY3RvcnMgcmVtYWluaW5nIGluIHRyYWNrCisJamEJdG9sYXN0c2VjdAorCW1vdmIJ
JDEsICVhbAkJCSMgMSBzZWN0b3IgbWluaQordG9sYXN0c2VjdDoKKwljYncKKwljbXB3CSVkaSwg
JWF4CisJamIJbW9yZTF0cmsKKwltb3Z3CSVkaSwgJWF4CQkjIHNlY3RvcnMgdG8gcmVhZAorbW9y
ZTF0cms6CisJcHVzaAklYXgKKwltb3ZiCSQyLCAlYWgJCQkjIGNtZDogcmVhZCBjaHMKKyNlbHNl
CisgICAgICAgIG1vdncgICAgJDB4MjAxLCAlYXgJCSMgc2VjdG9yIGJ5IHNlY3RvcgorCXB1c2gJ
JWF4CisjZW5kaWYKKyAgICAgICAgaW50ICAgICAkMHgxMworCXhjaGcJJWF4LCAlYnAJCSMgc3Rh
dHVzCisgICAgICAgIHBvcHcgICAgJWJ4CQkJIyAlYXggCisgICAgICAgIHBvcHcgICAgJWN4Cisg
ICAgICAgIHBvcHcgICAgJWR4CisgICAgICAgIHBvcHcgICAgJWF4CQkJIyBsaW1pdHMKKyAgICAg
ICAgcG9wdyAgICAlZGkJCQkjIHNlY3RvciBjb3VudAorCWpjCWNoZWNrX2xpbWl0cworbmV4dF9z
ZWN0b3I6CisjaWZkZWYgVFJBQ0tfQllfVFJBQ0sKKwlzdWJ3CSVieCwlZGkJCQkjIHVwZGF0ZSBz
ZWN0b3IgY291bnRlcgorCWFkZHcJJWJ4LCVjeAkJCSMgbmV4dCBzZWN0b3IKKwlzaGx3CSQ1LCVi
eAkJCSMgc2VjdG9ycyAtPiBwYXJhZ3JhZ2hzCisJbW92dwklZXMsICVicAorCWFkZHcJJWJ4LCAl
YnAKKyNlbHNlCisJZGVjdwklZGkJCQkjIHVwZGF0ZSBzZWN0b3IgY291bnRlcgorCWluY3cJJWN4
CQkJIyBuZXh0IHNlY3RvcgorCW1vdncJJWVzLCAlYnAKKwlhZGR3CSQzMiwgJWJwCQkjIHNlY3Rv
ciBzaXplIGluIHBhcmFncmFnaHMKKyNlbmRpZgorCW1vdncJJWJwLCAlZXMJCSMgbmV4dCBsb2Nh
dGlvbgorICAgICAgICBjbXBiICAgICVhbCwlY2wJCQkjIHJlYWNoIHNlY3RvciBsaW1pdCA/Cisg
ICAgICAgIGpuZSAgICAgYmRlbmRscAorbmV4dF9oZWFkOgorICAgICAgICBtb3ZiICAgICVjbCwl
YWwKKyAgICAgICAgaW5jYiAgICAlZGgJCQkjIG5leHQgaGVhZAorICAgICAgICBtb3ZiICAgICQx
LCVjbAkJCSMgZmlyc3Qgc2VjdG9yCisgICAgICAgIGNtcGIgICAgJWFoLCVkaAkJCSMgcmVhY2gg
aGVhZCBsaW1pdCA/CisgICAgICAgIGpuZSAgICAgYmRlbmRscAorbmV4dF90cmFjazoKKyAgICAg
ICAgbW92YiAgICAlZGgsJWFoCisgICAgICAgIG1vdmIgICAgJDAsJWRoCQkJIyBmaXJzdCBoZWFk
CisjIE5PVEUgOiBzdXBwb3J0IDI1NiBjeWxpbmRlcnMgbWF4CisgICAgICAgIGluY2IgICAgJWNo
CQkJIyBuZXh0IGN5bGluZGVyCitiZGVuZGxwOgorCW1vdncJJWR4LCBjdXJkeAkJIyBzYXZlIGRp
c2sgc3RhdGUKKwltb3Z3CSVjeCwgY3VyY3gKKwltb3Z3CSVheCwgbGltaXRzCityZWFkX3NlY3Rv
cnM6CisJbW92dwljdXJkeCwgJWR4CQkjIHJlc3RvcmUgZGlzayBzdGF0ZQorCW1vdncJY3VyY3gs
ICVjeAorIyAgIGFsIGlzIGxhc3Qgc2VjdG9yKzEKKyMgICBhaCBpcyBsYXN0IGhlYWQrMQorCW1v
dncJbGltaXRzLCAlYXgKKwlvcncJJWRpLCVkaQorICAgICAgICBqbmUJcmVhZF9zZWN0b3JzbHAK
Kwltb3ZiCSQweDJlLCAlYWwgCQkjIGxvYWRpbmcuLi4gbWVzc2FnZSAyZSA9IC4KK3B1dGM6CisJ
bW92YgkkMHhlLCAlYWgKKwltb3Z3CSQ3LCAlYngJCQkjICAgb25lIGRvdCBlYWNoIDY0aworIAlp
bnQJJDB4MTAKK3JldHVybjoKKwlyZXQKKworcHJpbnRfbmw6CisJCisJbW92YgkkMHhkLCAlYWwJ
CSMgQ1IKKwljYWxsCXB1dGMKKwltb3ZiCSQweGEsICVhbAkJIyBMRgorCWptcAlwdXRjCisKK3B1
dHM6CisJY2FsbAlwcmludF9ubAkJIyBzZXQgJWFoIGFuZCAlYngKK3B1dHNscDoKKwlsb2RzYgor
CW9yYgklYWwsJWFsCQkJIyBlbmQgb2Ygc3RyaW5nIGlzIFwwCisJanoJcmV0dXJuCitwdXRjczoK
KwlpbnQJJDB4MTAKKwlqbXAJcHV0c2xwCiAKK2Zsb3BweV90YWJsZToKKyNpZmRlZiBFWFRSQV9E
RVZJQ0VTCQkKKwkJLmJ5dGUJMTYsOQkJCSMgL2Rldi9mZDB1NzIwCisJCS5ieXRlCTEyLDEwCQkJ
IyAvZGV2L2ZkMHU4MDAKKwkJLmJ5dGUJODAsMTEJCQkjIC9kZXYvZmQwdTg4MAorCQkuYnl0ZQkx
MjUsMjAJCQkjIC9kZXYvZmQwdTE2MDAKKwkJLmJ5dGUJNDQsMjEJCQkjIC9kZXYvZmQwdTE2ODAK
KwkJLmJ5dGUJOTYsMjIJCQkjIC9kZXYvZmQwdTE3NjAKKwkJLmJ5dGUJMTE2LDIzCQkJIyAvZGV2
L2ZkMHUxODQwCisJCS5ieXRlCTEwMCwyNAkJCSMgL2Rldi9mZDB1MTkyMAorCQkuYnl0ZQkxMDUs
NDAJCQkjIC9kZXYvZmQwdTMyMDAKKwkJLmJ5dGUJMTA5LDQ0CQkJIyAvZGV2L2ZkMHUzNTIwCisJ
CS5ieXRlCTExMyw0OAkJCSMgL2Rldi9mZDB1Mzg0MAorI2VuZGlmCQkKKwkJLmJ5dGUJOCwxNQkJ
CSMgL2Rldi9mZDBoMTIwMCAtIC9kZXYvcHMwCisJCS5ieXRlCTI4LDE4CQkJIyAvZGV2L2ZkMHUx
NDQwIC0gL2Rldi9QUzAKKwkJLmJ5dGUJMzIsMzYJCQkjIC9kZXYvZmQwdTI4ODAgLSAvZGV2L2Zk
MEgyODgwCisJCS5ieXRlCTAsMTI4CQkJIyAvZGV2L2ZkMCAtIGRlZmF1bHQ6IGF1dG9kZXRlY3QK
KworcmVnczoJCS5hc2NpegkiWDoiCisKKyNpZm5kZWYJRElTUExBWV9LRVJORUxfVkVSU0lPTgor
bXNnMToJCS5hc2NpegkiTG9hZGluZyIKKyNlbmRpZgkJCiAKLQkjIEtlcm5lbCBhdHRyaWJ1dGVz
OyB1c2VkIGJ5IHNldHVwCit0YWlsOgorCQkuc3BhY2UJNDk3K3N0YXJ0LXRhaWwJCQogCi0JLm9y
ZyA0OTcKKyMub3JnIDQ5Nwogc2V0dXBfc2VjdHM6CS5ieXRlIFNFVFVQU0VDVFMKIHJvb3RfZmxh
Z3M6CS53b3JkIFJPT1RfUkRPTkxZCi1zeXNzaXplOgkud29yZCBTWVNTSVpFCi1zd2FwX2RldjoJ
LndvcmQgU1dBUF9ERVYKLXJhbV9zaXplOgkud29yZCBSQU1ESVNLCitzeXNzaXplOgkubG9uZyBT
WVNTSVpFCityYW1fc2l6ZToJLndvcmQgUkFNRElTSwkJCSMgcmFtZGlzayBzaXplLCByYW1kaXNr
IGZsYWdzIGFuZCBjbWRsaW5lIGZsYWcKIHZpZF9tb2RlOgkud29yZCBTVkdBX01PREUKIHJvb3Rf
ZGV2Ogkud29yZCBST09UX0RFVgogYm9vdF9mbGFnOgkud29yZCAweEFBNTUKZGlmZiAtcHVyTiBs
aW51eC0yLjYuMTMtZ2l0MTIvRG9jdW1lbnRhdGlvbi9yYW1kaXNrLnR4dCBsaW51eC0yLjYuMTMt
Z2l0MTItYm9vdGJsb2NrL0RvY3VtZW50YXRpb24vcmFtZGlzay50eHQKLS0tIGxpbnV4LTIuNi4x
My1naXQxMi9Eb2N1bWVudGF0aW9uL3JhbWRpc2sudHh0CTIwMDUtMDktMTQgMTA6MDc6MzguMDAw
MDAwMDAwICswMjAwCisrKyBsaW51eC0yLjYuMTMtZ2l0MTItYm9vdGJsb2NrL0RvY3VtZW50YXRp
b24vcmFtZGlzay50eHQJMjAwNS0wOS0xNCAxMDoyNToyNS4wMDAwMDAwMDAgKzAyMDAKQEAgLTYz
LDEyICs2MywxNCBAQCB0byAyIE1CICgyXjExKSBvZiB3aGVyZSB0byBmaW5kIHRoZSBSQU0gCiAx
NCBpbmRpY2F0ZXMgdGhhdCBhIFJBTSBkaXNrIGlzIHRvIGJlIGxvYWRlZCwgYW5kIGJpdCAxNSBp
bmRpY2F0ZXMgd2hldGhlciBhCiBwcm9tcHQvd2FpdCBzZXF1ZW5jZSBpcyB0byBiZSBnaXZlbiBi
ZWZvcmUgdHJ5aW5nIHRvIHJlYWQgdGhlIFJBTSBkaXNrLiBTaW5jZQogdGhlIFJBTSBkaXNrIGR5
bmFtaWNhbGx5IGdyb3dzIGFzIGRhdGEgaXMgYmVpbmcgd3JpdHRlbiBpbnRvIGl0LCBhIHNpemUg
ZmllbGQKLWlzIG5vdCByZXF1aXJlZC4gQml0cyAxMSB0byAxMyBhcmUgbm90IGN1cnJlbnRseSB1
c2VkIGFuZCBtYXkgYXMgd2VsbCBiZSB6ZXJvLgoraXMgbm90IHJlcXVpcmVkLiBCaXQgMTMgaW5k
aWNhdGVzIHRoYXQgYSBjbWRsaW5lIGlzIHRvIGJlIGxvYWRlZCBieSB0aGUga2VybmVsCitib290
YmxvY2ssIEJpdHMgMTEgdG8gMTIgYXJlIG5vdCBjdXJyZW50bHkgdXNlZCBhbmQgbWF5IGFzIHdl
bGwgYmUgemVyby4KIFRoZXNlIG51bWJlcnMgYXJlIG5vIG1hZ2ljYWwgc2VjcmV0cywgYXMgc2Vl
biBiZWxvdzoKIAogLi9hcmNoL2kzODYva2VybmVsL3NldHVwLmM6I2RlZmluZSBSQU1ESVNLX0lN
QUdFX1NUQVJUX01BU0sgICAgIDB4MDdGRgogLi9hcmNoL2kzODYva2VybmVsL3NldHVwLmM6I2Rl
ZmluZSBSQU1ESVNLX1BST01QVF9GTEFHICAgICAgICAgIDB4ODAwMAogLi9hcmNoL2kzODYva2Vy
bmVsL3NldHVwLmM6I2RlZmluZSBSQU1ESVNLX0xPQURfRkxBRyAgICAgICAgICAgIDB4NDAwMAor
Li9hcmNoL2kzODYva2VybmVsL3NldHVwLmM6I2RlZmluZSBDTURMSU5FX0xPQURfRkxBRyAgICAg
ICAgICAgIDB4MjAwMAogCiBDb25zaWRlciBhIHR5cGljYWwgdHdvIGZsb3BweSBkaXNrIHNldHVw
LCB3aGVyZSB5b3Ugd2lsbCBoYXZlIHRoZSAKIGtlcm5lbCBvbiBkaXNrIG9uZSwgYW5kIGhhdmUg
YWxyZWFkeSBwdXQgYSBSQU0gZGlzayBpbWFnZSBvbnRvIGRpc2sgIzIuCkBAIC0xNTksNiArMTYx
LDggQEAgdXNlcnMgbWF5IHdpc2ggdG8gY29tYmluZSBzdGVwcyAoZCkgYW5kIAogQ2hhbmdlbG9n
OgogLS0tLS0tLS0tLQogCiswOS0wNSA6CQlSZXNlcnZlIENNRExJTkVfTE9BRCBiaXQuCisKIDEw
LTIyLTA0IDoJVXBkYXRlZCB0byByZWZsZWN0IGNoYW5nZXMgaW4gY29tbWFuZCBsaW5lIG9wdGlv
bnMsIHJlbW92ZQogCQlvYnNvbGV0ZSByZWZlcmVuY2VzLCBnZW5lcmFsIGNsZWFudXAuCiAJCUph
bWVzIE5lbHNvbiAoamFtZXM0NzY1QGdtYWlsLmNvbSkK

--MIMEStream=_0+37632_65645089838794_09812299817--
Re: [i386 BOOT CODE] kernel bootable again
#307696
Author: Giuseppe Bilotta
Date: Sat, 17 Sep 2005 17:26
33 lines
1282 bytes
On Wed, 14 Sep 2005 11:42:12 +0200 (CEST), Pascal Bellard wrote:

> The bootblock code is 497 bytes long. It must as simple as possible.
> Complex algorithms like fingerprinting can't be used.
> 
> Geometry detection works with usual floppies. This patch goal is to
> support them like < 2.6 bootblocks did and fix 1M limitation and
> special formatting like 1.68M floppies.
> 
> Geometry detection may work with non-traditional floppies but is not
> designed to.

This is probably a stupid suggestion, but here it goes anyway: the
kernel has to be written on disk by something, right?

So if the "something" knows (or can get to know) the sector/tracks
layout of the disk it's writing the kernel onto, it could store this
information in the bootblock (is there space for that?). The bootblock
code would then just read this info and use it.

Of course, this would mean that making a kernel-bootable floppy
wouldn't be as simple as cp'ing the kernel image to /dev/fdwhatever,
but if a script/program designed to do this was included with the
kernel source (it wouldn't be too big ...) ...

-- 
Giuseppe "Oblomov" Bilotta

"Da grande lotterò per la pace"
"A me me la compra il mio babbo"
(Altan)
("When I grow up, I will fight for peace"
 "I'll have my daddy buy it for me")
Re: [i386 BOOT CODE] kernel bootable again
#307701
Author: Jesper Juhl
Date: Sat, 17 Sep 2005 17:56
32 lines
1505 bytes
On 9/17/05, Giuseppe Bilotta <bilotta78@hotpop.com> wrote:
> On Wed, 14 Sep 2005 11:42:12 +0200 (CEST), Pascal Bellard wrote:
>
> > The bootblock code is 497 bytes long. It must as simple as possible.
> > Complex algorithms like fingerprinting can't be used.
> >
> > Geometry detection works with usual floppies. This patch goal is to
> > support them like < 2.6 bootblocks did and fix 1M limitation and
> > special formatting like 1.68M floppies.
> >
> > Geometry detection may work with non-traditional floppies but is not
> > designed to.
>
> This is probably a stupid suggestion, but here it goes anyway: the
> kernel has to be written on disk by something, right?
>
> So if the "something" knows (or can get to know) the sector/tracks
> layout of the disk it's writing the kernel onto, it could store this
> information in the bootblock (is there space for that?). The bootblock
> code would then just read this info and use it.
>
> Of course, this would mean that making a kernel-bootable floppy
> wouldn't be as simple as cp'ing the kernel image to /dev/fdwhatever,
> but if a script/program designed to do this was included with the
> kernel source (it wouldn't be too big ...) ...
>
I may be missing something here, but if you are going to do something
like that, then why not just use a real bootloader instead?

--
Jesper Juhl <jesper.juhl@gmail.com>
Don't top-post  http://www.catb.org/~esr/jargon/html/T/top-post.html
Plain text mails only, please      http://www.expita.com/nomime.html
Re: [i386 BOOT CODE] kernel bootable again
#307703
Author: Giuseppe Bilotta
Date: Sat, 17 Sep 2005 18:19
32 lines
1349 bytes
On Sat, 17 Sep 2005 17:56:08 +0200, Jesper Juhl wrote:

>> This is probably a stupid suggestion, but here it goes anyway: the
>> kernel has to be written on disk by something, right?
>>
>> So if the "something" knows (or can get to know) the sector/tracks
>> layout of the disk it's writing the kernel onto, it could store this
>> information in the bootblock (is there space for that?). The bootblock
>> code would then just read this info and use it.
>>
>> Of course, this would mean that making a kernel-bootable floppy
>> wouldn't be as simple as cp'ing the kernel image to /dev/fdwhatever,
>> but if a script/program designed to do this was included with the
>> kernel source (it wouldn't be too big ...) ...
>>
> I may be missing something here, but if you are going to do something
> like that, then why not just use a real bootloader instead?

I'm not too much into this stuff, I don't even know the technical
differences betwen booting from kernel-on-floppy or from a bootloader.
My proposal was just to work around the "what's the track layout"
issue in the kernel-on-floppy direct boot. Maybe you could see it like
a delayed bootloader process ... don't know.

But as I mentioned, it was probably just a stupid suggestion :)

--
Giuseppe "Oblomov" Bilotta

Axiom I of the Giuseppe Bilotta
theory of IT:
Anything is better than MS
Re: [i386 BOOT CODE] kernel bootable again
#307910
Author: Coywolf Qi Hunt
Date: Mon, 19 Sep 2005 10:13
34 lines
1577 bytes
On 9/18/05, Giuseppe Bilotta <bilotta78@hotpop.com> wrote:
> On Sat, 17 Sep 2005 17:56:08 +0200, Jesper Juhl wrote:
>
> >> This is probably a stupid suggestion, but here it goes anyway: the
> >> kernel has to be written on disk by something, right?
> >>
> >> So if the "something" knows (or can get to know) the sector/tracks
> >> layout of the disk it's writing the kernel onto, it could store this
> >> information in the bootblock (is there space for that?). The bootblock
> >> code would then just read this info and use it.
> >>
> >> Of course, this would mean that making a kernel-bootable floppy
> >> wouldn't be as simple as cp'ing the kernel image to /dev/fdwhatever,
> >> but if a script/program designed to do this was included with the
> >> kernel source (it wouldn't be too big ...) ...
> >>
> > I may be missing something here, but if you are going to do something
> > like that, then why not just use a real bootloader instead?
>
> I'm not too much into this stuff, I don't even know the technical
> differences betwen booting from kernel-on-floppy or from a bootloader.
> My proposal was just to work around the "what's the track layout"
> issue in the kernel-on-floppy direct boot. Maybe you could see it like

Actually, DOS/Windows works that way. FAT filesystem stores the number
of sectors per track in its boot sector.

> a delayed bootloader process ... don't know.
>
> But as I mentioned, it was probably just a stupid suggestion :)

You are too humble. It's not you, but linux bootsect.S stupid IMHO. ;)
--
Coywolf Qi Hunt
http://sosdg.org/~coywolf/
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads