From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Jh0Dl-0007Vl-6Q for qemu-devel@nongnu.org; Wed, 02 Apr 2008 06:29:33 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Jh0Di-0007Tl-0r for qemu-devel@nongnu.org; Wed, 02 Apr 2008 06:29:31 -0400 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Jh0Dh-0007TP-Cf for qemu-devel@nongnu.org; Wed, 02 Apr 2008 06:29:29 -0400 Received: from smtp7-g19.free.fr ([212.27.42.64]) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1Jh0Dg-0000Wy-3P for qemu-devel@nongnu.org; Wed, 02 Apr 2008 06:29:29 -0400 Received: from smtp7-g19.free.fr (localhost [127.0.0.1]) by smtp7-g19.free.fr (Postfix) with ESMTP id 7C24D322899 for ; Wed, 2 Apr 2008 12:29:27 +0200 (CEST) Received: from [127.0.0.1] (rob92-4-82-225-201-66.fbx.proxad.net [82.225.201.66]) by smtp7-g19.free.fr (Postfix) with ESMTP id A8F9F3227FA for ; Wed, 2 Apr 2008 12:29:26 +0200 (CEST) Message-ID: <47F36004.4020701@reactos.org> Date: Wed, 02 Apr 2008 12:29:24 +0200 From: =?ISO-8859-1?Q?Herv=E9_Poussineau?= MIME-Version: 1.0 Subject: Re: [Qemu-devel] [PATCH] FDC: simplify code References: <47F354BF.3000801@reactos.org> In-Reply-To: <47F354BF.3000801@reactos.org> Content-Type: multipart/mixed; boundary="------------030405040503060400030808" Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org This is a multi-part message in MIME format. --------------030405040503060400030808 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: quoted-printable Herv=E9 Poussineau a =E9crit : > Hi, >=20 > This patch follows a patch I sent on 2008-03-31: > http://lists.gnu.org/archive/html/qemu-devel/2008-03/msg00510.html > Previous patch is required before applying this one. >=20 > This patch prevents duplication of quite similar code, and so, removes=20 > 300 lines and 8KB of code. >=20 > Herv=E9 >=20 One part of the patch was missing, here is the complete one. To summarize: 1) Apply fdc_functions.diff (it is the same as sent on 2008-03-31) 2) Apply fdc_remove_duplicate.diff. fdc.c file will get smaller Sorry for the noise. Herv=E9 --------------030405040503060400030808 Content-Type: text/plain; name="fdc_functions.diff" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="fdc_functions.diff" SW5kZXg6IGZkYy5jDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gZmRjLmMJKHJldmlzaW9uIDQxNTQp DQorKysgZmRjLmMJKHdvcmtpbmcgY29weSkNCkBAIC0xNDQxLDYgKzE0NDEsMjgyIEBADQog ICAgIH0KIH0KIAorc3RhdGljIHZvaWQgZmRjdHJsX2hhbmRsZV9sb2NrIChmZGN0cmxfdCAq ZmRjdHJsLCBpbnQgZGlyZWN0aW9uKQoreworICAgIGZkY3RybC0+bG9jayA9IDE7CisgICAg ZmRjdHJsLT5maWZvWzBdID0gMHgxMDsKKyAgICBmZGN0cmxfc2V0X2ZpZm8oZmRjdHJsLCAx LCAxKTsKK30KKworc3RhdGljIHZvaWQgZmRjdHJsX2hhbmRsZV91bmxvY2sgKGZkY3RybF90 ICpmZGN0cmwsIGludCBkaXJlY3Rpb24pCit7CisgICAgZmRjdHJsLT5sb2NrID0gMDsKKyAg ICBmZGN0cmwtPmZpZm9bMF0gPSAwOworICAgIGZkY3RybF9zZXRfZmlmbyhmZGN0cmwsIDEs IDApOworfQorCitzdGF0aWMgdm9pZCBmZGN0cmxfaGFuZGxlX2R1bXByZWcgKGZkY3RybF90 ICpmZGN0cmwsIGludCBkaXJlY3Rpb24pCit7CisgICAgZmRyaXZlX3QgKmN1cl9kcnYgPSBn ZXRfY3VyX2RydihmZGN0cmwpOw0KKw0KKyAgICAvKiBEcml2ZXMgcG9zaXRpb24gKi8KKyAg ICBmZGN0cmwtPmZpZm9bMF0gPSBkcnYwKGZkY3RybCktPnRyYWNrOworICAgIGZkY3RybC0+ Zmlmb1sxXSA9IGRydjEoZmRjdHJsKS0+dHJhY2s7CisgICAgZmRjdHJsLT5maWZvWzJdID0g MDsKKyAgICBmZGN0cmwtPmZpZm9bM10gPSAwOworICAgIC8qIHRpbWVycyAqLworICAgIGZk Y3RybC0+Zmlmb1s0XSA9IGZkY3RybC0+dGltZXIwOworICAgIGZkY3RybC0+Zmlmb1s1XSA9 IChmZGN0cmwtPnRpbWVyMSA8PCAxKSB8IGZkY3RybC0+ZG1hX2VuOworICAgIGZkY3RybC0+ Zmlmb1s2XSA9IGN1cl9kcnYtPmxhc3Rfc2VjdDsKKyAgICBmZGN0cmwtPmZpZm9bN10gPSAo ZmRjdHJsLT5sb2NrIDw8IDcpIHwKKyAgICAgICAgKGN1cl9kcnYtPnBlcnBlbmRpY3VsYXIg PDwgMik7CisgICAgZmRjdHJsLT5maWZvWzhdID0gZmRjdHJsLT5jb25maWc7CisgICAgZmRj dHJsLT5maWZvWzldID0gZmRjdHJsLT5wcmVjb21wX3RyazsKKyAgICBmZGN0cmxfc2V0X2Zp Zm8oZmRjdHJsLCAxMCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGZkY3RybF9oYW5kbGVfdmVy c2lvbiAoZmRjdHJsX3QgKmZkY3RybCwgaW50IGRpcmVjdGlvbikNCit7CisgICAgLyogQ29u dHJvbGxlcidzIHZlcnNpb24gKi8KKyAgICBmZGN0cmwtPmZpZm9bMF0gPSBmZGN0cmwtPnZl cnNpb247CisgICAgZmRjdHJsX3NldF9maWZvKGZkY3RybCwgMSwgMSk7Cit9DQorDQorc3Rh dGljIHZvaWQgZmRjdHJsX2hhbmRsZV9wYXJ0aWQgKGZkY3RybF90ICpmZGN0cmwsIGludCBk aXJlY3Rpb24pDQoreworICAgIGZkY3RybC0+Zmlmb1swXSA9IDB4NDE7IC8qIFN0ZXBwaW5n IDEgKi8KKyAgICBmZGN0cmxfc2V0X2ZpZm8oZmRjdHJsLCAxLCAwKTsKK30NCisNCitzdGF0 aWMgdm9pZCBmZGN0cmxfaGFuZGxlX3Jlc3RvcmUgKGZkY3RybF90ICpmZGN0cmwsIGludCBk aXJlY3Rpb24pDQoreworICAgIGZkcml2ZV90ICpjdXJfZHJ2ID0gZ2V0X2N1cl9kcnYoZmRj dHJsKTsNCisNCisgICAgLyogRHJpdmVzIHBvc2l0aW9uICovCisgICAgZHJ2MChmZGN0cmwp LT50cmFjayA9IGZkY3RybC0+Zmlmb1szXTsKKyAgICBkcnYxKGZkY3RybCktPnRyYWNrID0g ZmRjdHJsLT5maWZvWzRdOworICAgIC8qIHRpbWVycyAqLworICAgIGZkY3RybC0+dGltZXIw ID0gZmRjdHJsLT5maWZvWzddOworICAgIGZkY3RybC0+dGltZXIxID0gZmRjdHJsLT5maWZv WzhdOworICAgIGN1cl9kcnYtPmxhc3Rfc2VjdCA9IGZkY3RybC0+Zmlmb1s5XTsKKyAgICBm ZGN0cmwtPmxvY2sgPSBmZGN0cmwtPmZpZm9bMTBdID4+IDc7CisgICAgY3VyX2Rydi0+cGVy cGVuZGljdWxhciA9IChmZGN0cmwtPmZpZm9bMTBdID4+IDIpICYgMHhGOworICAgIGZkY3Ry bC0+Y29uZmlnID0gZmRjdHJsLT5maWZvWzExXTsKKyAgICBmZGN0cmwtPnByZWNvbXBfdHJr ID0gZmRjdHJsLT5maWZvWzEyXTsKKyAgICBmZGN0cmwtPnB3cmQgPSBmZGN0cmwtPmZpZm9b MTNdOworICAgIGZkY3RybF9yZXNldF9maWZvKGZkY3RybCk7Cit9DQorDQorc3RhdGljIHZv aWQgZmRjdHJsX2hhbmRsZV9zYXZlIChmZGN0cmxfdCAqZmRjdHJsLCBpbnQgZGlyZWN0aW9u KQ0KK3sKKyAgICBmZHJpdmVfdCAqY3VyX2RydiA9IGdldF9jdXJfZHJ2KGZkY3RybCk7DQor DQorICAgIGZkY3RybC0+Zmlmb1swXSA9IDA7CisgICAgZmRjdHJsLT5maWZvWzFdID0gMDsK KyAgICAvKiBEcml2ZXMgcG9zaXRpb24gKi8KKyAgICBmZGN0cmwtPmZpZm9bMl0gPSBkcnYw KGZkY3RybCktPnRyYWNrOworICAgIGZkY3RybC0+Zmlmb1szXSA9IGRydjEoZmRjdHJsKS0+ dHJhY2s7CisgICAgZmRjdHJsLT5maWZvWzRdID0gMDsKKyAgICBmZGN0cmwtPmZpZm9bNV0g PSAwOworICAgIC8qIHRpbWVycyAqLworICAgIGZkY3RybC0+Zmlmb1s2XSA9IGZkY3RybC0+ dGltZXIwOworICAgIGZkY3RybC0+Zmlmb1s3XSA9IGZkY3RybC0+dGltZXIxOworICAgIGZk Y3RybC0+Zmlmb1s4XSA9IGN1cl9kcnYtPmxhc3Rfc2VjdDsKKyAgICBmZGN0cmwtPmZpZm9b OV0gPSAoZmRjdHJsLT5sb2NrIDw8IDcpIHwKKyAgICAgICAgKGN1cl9kcnYtPnBlcnBlbmRp Y3VsYXIgPDwgMik7CisgICAgZmRjdHJsLT5maWZvWzEwXSA9IGZkY3RybC0+Y29uZmlnOwor ICAgIGZkY3RybC0+Zmlmb1sxMV0gPSBmZGN0cmwtPnByZWNvbXBfdHJrOworICAgIGZkY3Ry bC0+Zmlmb1sxMl0gPSBmZGN0cmwtPnB3cmQ7CisgICAgZmRjdHJsLT5maWZvWzEzXSA9IDA7 CisgICAgZmRjdHJsLT5maWZvWzE0XSA9IDA7CisgICAgZmRjdHJsX3NldF9maWZvKGZkY3Ry bCwgMTUsIDEpOworfQ0KKw0KK3N0YXRpYyB2b2lkIGZkY3RybF9oYW5kbGVfcmVhZGlkIChm ZGN0cmxfdCAqZmRjdHJsLCBpbnQgZGlyZWN0aW9uKQ0KK3sKKyAgICBmZHJpdmVfdCAqY3Vy X2RydiA9IGdldF9jdXJfZHJ2KGZkY3RybCk7DQorDQorICAgIC8qIFhYWDogc2hvdWxkIHNl dCBtYWluIHN0YXR1cyByZWdpc3RlciB0byBidXN5ICovCisgICAgY3VyX2Rydi0+aGVhZCA9 IChmZGN0cmwtPmZpZm9bMV0gPj4gMikgJiAxOworICAgIHFlbXVfbW9kX3RpbWVyKGZkY3Ry bC0+cmVzdWx0X3RpbWVyLAorICAgICAgICAgICAgICAgICAgIHFlbXVfZ2V0X2Nsb2NrKHZt X2Nsb2NrKSArICh0aWNrc19wZXJfc2VjIC8gNTApKTsKK30NCisNCitzdGF0aWMgdm9pZCBm ZGN0cmxfaGFuZGxlX2Zvcm1hdF90cmFjayAoZmRjdHJsX3QgKmZkY3RybCwgaW50IGRpcmVj dGlvbikNCit7CisgICAgZmRyaXZlX3QgKmN1cl9kcnY7DQorDQorICAgIGZkY3RybC0+Y3Vy X2RydiA9IGZkY3RybC0+Zmlmb1sxXSAmIEZEX0RPUl9TRUxNQVNLOworICAgIGN1cl9kcnYg PSBnZXRfY3VyX2RydihmZGN0cmwpOworICAgIGZkY3RybC0+ZGF0YV9zdGF0ZSB8PSBGRF9T VEFURV9GT1JNQVQ7CisgICAgaWYgKGZkY3RybC0+Zmlmb1swXSAmIDB4ODApCisgICAgICAg IGZkY3RybC0+ZGF0YV9zdGF0ZSB8PSBGRF9TVEFURV9NVUxUSTsKKyAgICBlbHNlCisgICAg ICAgIGZkY3RybC0+ZGF0YV9zdGF0ZSAmPSB+RkRfU1RBVEVfTVVMVEk7CisgICAgZmRjdHJs LT5kYXRhX3N0YXRlICY9IH5GRF9TVEFURV9TRUVLOworICAgIGN1cl9kcnYtPmJwcyA9Cisg ICAgICAgIGZkY3RybC0+Zmlmb1syXSA+IDcgPyAxNjM4NCA6IDEyOCA8PCBmZGN0cmwtPmZp Zm9bMl07CisjaWYgMAorICAgIGN1cl9kcnYtPmxhc3Rfc2VjdCA9CisgICAgICAgIGN1cl9k cnYtPmZsYWdzICYgRkRJU0tfREJMX1NJREVTID8gZmRjdHJsLT5maWZvWzNdIDoKKyAgICAg ICAgZmRjdHJsLT5maWZvWzNdIC8gMjsKKyNlbHNlCisgICAgY3VyX2Rydi0+bGFzdF9zZWN0 ID0gZmRjdHJsLT5maWZvWzNdOworI2VuZGlmCisgICAgLyogVE9ETzogaW1wbGVtZW50IGZv cm1hdCB1c2luZyBETUEgZXhwZWN0ZWQgYnkgdGhlIEJvY2hzIEJJT1MKKyAgICAgKiBhbmQg TGludXggZmRmb3JtYXQgKHJlYWQgMyBieXRlcyBwZXIgc2VjdG9yIHZpYSBETUEgYW5kIGZp bGwKKyAgICAgKiB0aGUgc2VjdG9yIHdpdGggdGhlIHNwZWNpZmllZCBmaWxsIGJ5dGUKKyAg ICAgKi8KKyAgICBmZGN0cmwtPmRhdGFfc3RhdGUgJj0gfkZEX1NUQVRFX0ZPUk1BVDsKKyAg ICBmZGN0cmxfc3RvcF90cmFuc2ZlcihmZGN0cmwsIDB4MDAsIDB4MDAsIDB4MDApOworfQ0K Kw0KK3N0YXRpYyB2b2lkIGZkY3RybF9oYW5kbGVfc3BlY2lmeSAoZmRjdHJsX3QgKmZkY3Ry bCwgaW50IGRpcmVjdGlvbikNCit7CisgICAgZmRjdHJsLT50aW1lcjAgPSAoZmRjdHJsLT5m aWZvWzFdID4+IDQpICYgMHhGOworICAgIGZkY3RybC0+dGltZXIxID0gZmRjdHJsLT5maWZv WzJdID4+IDE7CisgICAgZmRjdHJsLT5kbWFfZW4gPSAxIC0gKGZkY3RybC0+Zmlmb1syXSAm IDEpIDsKKyAgICAvKiBObyByZXN1bHQgYmFjayAqLworICAgIGZkY3RybF9yZXNldF9maWZv KGZkY3RybCk7Cit9DQorDQorc3RhdGljIHZvaWQgZmRjdHJsX2hhbmRsZV9zZW5zZV9kcml2 ZV9zdGF0dXMgKGZkY3RybF90ICpmZGN0cmwsIGludCBkaXJlY3Rpb24pDQoreworICAgIGZk cml2ZV90ICpjdXJfZHJ2Ow0KKw0KKyAgICBmZGN0cmwtPmN1cl9kcnYgPSBmZGN0cmwtPmZp Zm9bMV0gJiBGRF9ET1JfU0VMTUFTSzsKKyAgICBjdXJfZHJ2ID0gZ2V0X2N1cl9kcnYoZmRj dHJsKTsKKyAgICBjdXJfZHJ2LT5oZWFkID0gKGZkY3RybC0+Zmlmb1sxXSA+PiAyKSAmIDE7 CisgICAgLyogMSBCeXRlIHN0YXR1cyBiYWNrICovCisgICAgZmRjdHJsLT5maWZvWzBdID0g KGN1cl9kcnYtPnJvIDw8IDYpIHwKKyAgICAgICAgKGN1cl9kcnYtPnRyYWNrID09IDAgPyAw eDEwIDogMHgwMCkgfAorICAgICAgICAoY3VyX2Rydi0+aGVhZCA8PCAyKSB8CisgICAgICAg IGZkY3RybC0+Y3VyX2RydiB8CisgICAgICAgIDB4Mjg7CisgICAgZmRjdHJsX3NldF9maWZv KGZkY3RybCwgMSwgMCk7Cit9DQorDQorc3RhdGljIHZvaWQgZmRjdHJsX2hhbmRsZV9yZWNh bGlicmF0ZSAoZmRjdHJsX3QgKmZkY3RybCwgaW50IGRpcmVjdGlvbikNCit7CisgICAgZmRy aXZlX3QgKmN1cl9kcnY7DQorDQorICAgIGZkY3RybC0+Y3VyX2RydiA9IGZkY3RybC0+Zmlm b1sxXSAmIEZEX0RPUl9TRUxNQVNLOworICAgIGN1cl9kcnYgPSBnZXRfY3VyX2RydihmZGN0 cmwpOworICAgIGZkX3JlY2FsaWJyYXRlKGN1cl9kcnYpOworICAgIGZkY3RybF9yZXNldF9m aWZvKGZkY3RybCk7CisgICAgLyogUmFpc2UgSW50ZXJydXB0ICovCisgICAgZmRjdHJsX3Jh aXNlX2lycShmZGN0cmwsIEZEX1NSMF9TRUVLKTsKK30NCisNCitzdGF0aWMgdm9pZCBmZGN0 cmxfaGFuZGxlX3NlZWsgKGZkY3RybF90ICpmZGN0cmwsIGludCBkaXJlY3Rpb24pDQorewor ICAgIGZkcml2ZV90ICpjdXJfZHJ2Ow0KKw0KKyAgICBmZGN0cmwtPmN1cl9kcnYgPSBmZGN0 cmwtPmZpZm9bMV0gJiBGRF9ET1JfU0VMTUFTSzsKKyAgICBjdXJfZHJ2ID0gZ2V0X2N1cl9k cnYoZmRjdHJsKTsKKyAgICBmZF9zdGFydChjdXJfZHJ2KTsKKyAgICBpZiAoZmRjdHJsLT5m aWZvWzJdIDw9IGN1cl9kcnYtPnRyYWNrKQorICAgICAgICBjdXJfZHJ2LT5kaXIgPSAxOwor ICAgIGVsc2UKKyAgICAgICAgY3VyX2Rydi0+ZGlyID0gMDsKKyAgICBmZGN0cmxfcmVzZXRf ZmlmbyhmZGN0cmwpOworICAgIGlmIChmZGN0cmwtPmZpZm9bMl0gPiBjdXJfZHJ2LT5tYXhf dHJhY2spIHsKKyAgICAgICAgZmRjdHJsX3JhaXNlX2lycShmZGN0cmwsIEZEX1NSMF9BQk5U RVJNIHwgRkRfU1IwX1NFRUspOworICAgIH0gZWxzZSB7CisgICAgICAgIGN1cl9kcnYtPnRy YWNrID0gZmRjdHJsLT5maWZvWzJdOworICAgICAgICAvKiBSYWlzZSBJbnRlcnJ1cHQgKi8K KyAgICAgICAgZmRjdHJsX3JhaXNlX2lycShmZGN0cmwsIEZEX1NSMF9TRUVLKTsKKyAgICB9 Cit9DQorDQorc3RhdGljIHZvaWQgZmRjdHJsX2hhbmRsZV9wZXJwZW5kaWN1bGFyX21vZGUg KGZkY3RybF90ICpmZGN0cmwsIGludCBkaXJlY3Rpb24pDQoreworICAgIGZkcml2ZV90ICpj dXJfZHJ2ID0gZ2V0X2N1cl9kcnYoZmRjdHJsKTsNCisNCisgICAgaWYgKGZkY3RybC0+Zmlm b1sxXSAmIDB4ODApCisgICAgICAgIGN1cl9kcnYtPnBlcnBlbmRpY3VsYXIgPSBmZGN0cmwt PmZpZm9bMV0gJiAweDc7CisgICAgLyogTm8gcmVzdWx0IGJhY2sgKi8KKyAgICBmZGN0cmxf cmVzZXRfZmlmbyhmZGN0cmwpOworfQ0KKw0KK3N0YXRpYyB2b2lkIGZkY3RybF9oYW5kbGVf Y29uZmlndXJlIChmZGN0cmxfdCAqZmRjdHJsLCBpbnQgZGlyZWN0aW9uKQ0KK3sKKyAgICBm ZGN0cmwtPmNvbmZpZyA9IGZkY3RybC0+Zmlmb1syXTsKKyAgICBmZGN0cmwtPnByZWNvbXBf dHJrID0gIGZkY3RybC0+Zmlmb1szXTsKKyAgICAvKiBObyByZXN1bHQgYmFjayAqLworICAg IGZkY3RybF9yZXNldF9maWZvKGZkY3RybCk7Cit9DQorDQorc3RhdGljIHZvaWQgZmRjdHJs X2hhbmRsZV9wb3dlcmRvd25fbW9kZSAoZmRjdHJsX3QgKmZkY3RybCwgaW50IGRpcmVjdGlv bikNCit7CisgICAgZmRjdHJsLT5wd3JkID0gZmRjdHJsLT5maWZvWzFdOworICAgIGZkY3Ry bC0+Zmlmb1swXSA9IGZkY3RybC0+Zmlmb1sxXTsKKyAgICBmZGN0cmxfc2V0X2ZpZm8oZmRj dHJsLCAxLCAxKTsKK30NCisNCitzdGF0aWMgdm9pZCBmZGN0cmxfaGFuZGxlX29wdGlvbiAo ZmRjdHJsX3QgKmZkY3RybCwgaW50IGRpcmVjdGlvbikNCit7CisgICAgLyogTm8gcmVzdWx0 IGJhY2sgKi8KKyAgICBmZGN0cmxfcmVzZXRfZmlmbyhmZGN0cmwpOworfQ0KKw0KK3N0YXRp YyB2b2lkIGZkY3RybF9oYW5kbGVfZHJpdmVfc3BlY2lmaWNhdGlvbl9jb21tYW5kIChmZGN0 cmxfdCAqZmRjdHJsLCBpbnQgZGlyZWN0aW9uKQ0KK3sKKyAgICBmZHJpdmVfdCAqY3VyX2Ry diA9IGdldF9jdXJfZHJ2KGZkY3RybCk7DQorDQorICAgIGlmIChmZGN0cmwtPmZpZm9bZmRj dHJsLT5kYXRhX3BvcyAtIDFdICYgMHg4MCkgeworICAgICAgICAvKiBDb21tYW5kIHBhcmFt ZXRlcnMgZG9uZSAqLworICAgICAgICBpZiAoZmRjdHJsLT5maWZvW2ZkY3RybC0+ZGF0YV9w b3MgLSAxXSAmIDB4NDApIHsKKyAgICAgICAgICAgIGZkY3RybC0+Zmlmb1swXSA9IGZkY3Ry bC0+Zmlmb1sxXTsKKyAgICAgICAgICAgIGZkY3RybC0+Zmlmb1syXSA9IDA7CisgICAgICAg ICAgICBmZGN0cmwtPmZpZm9bM10gPSAwOworICAgICAgICAgICAgZmRjdHJsX3NldF9maWZv KGZkY3RybCwgNCwgMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmZGN0cmxf cmVzZXRfZmlmbyhmZGN0cmwpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChmZGN0cmwt PmRhdGFfbGVuID4gNykgeworICAgICAgICAvKiBFUlJPUiAqLworICAgICAgICBmZGN0cmwt PmZpZm9bMF0gPSAweDgwIHwKKyAgICAgICAgICAgIChjdXJfZHJ2LT5oZWFkIDw8IDIpIHwg ZmRjdHJsLT5jdXJfZHJ2OworICAgICAgICBmZGN0cmxfc2V0X2ZpZm8oZmRjdHJsLCAxLCAx KTsKKyAgICB9Cit9DQorDQorc3RhdGljIHZvaWQgZmRjdHJsX2hhbmRsZV9yZWxhdGl2ZV9z ZWVrX291dCAoZmRjdHJsX3QgKmZkY3RybCwgaW50IGRpcmVjdGlvbikNCit7CisgICAgZmRy aXZlX3QgKmN1cl9kcnYgPSBnZXRfY3VyX2RydihmZGN0cmwpOw0KKw0KKyAgICBmZGN0cmwt PmN1cl9kcnYgPSBmZGN0cmwtPmZpZm9bMV0gJiBGRF9ET1JfU0VMTUFTSzsKKyAgICBjdXJf ZHJ2ID0gZ2V0X2N1cl9kcnYoZmRjdHJsKTsKKyAgICBmZF9zdGFydChjdXJfZHJ2KTsKKyAg ICBjdXJfZHJ2LT5kaXIgPSAwOworICAgIGlmIChmZGN0cmwtPmZpZm9bMl0gKyBjdXJfZHJ2 LT50cmFjayA+PSBjdXJfZHJ2LT5tYXhfdHJhY2spIHsKKyAgICAgICAgY3VyX2Rydi0+dHJh Y2sgPSBjdXJfZHJ2LT5tYXhfdHJhY2sgLSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGN1 cl9kcnYtPnRyYWNrICs9IGZkY3RybC0+Zmlmb1syXTsKKyAgICB9CisgICAgZmRjdHJsX3Jl c2V0X2ZpZm8oZmRjdHJsKTsKKyAgICBmZGN0cmxfcmFpc2VfaXJxKGZkY3RybCwgRkRfU1Iw X1NFRUspOworfQ0KKw0KK3N0YXRpYyB2b2lkIGZkY3RybF9oYW5kbGVfcmVsYXRpdmVfc2Vl a19pbiAoZmRjdHJsX3QgKmZkY3RybCwgaW50IGRpcmVjdGlvbikNCit7CisgICAgZmRyaXZl X3QgKmN1cl9kcnYgPSBnZXRfY3VyX2RydihmZGN0cmwpOw0KKw0KKyAgICBmZGN0cmwtPmN1 cl9kcnYgPSBmZGN0cmwtPmZpZm9bMV0gJiBGRF9ET1JfU0VMTUFTSzsKKyAgICBjdXJfZHJ2 ID0gZ2V0X2N1cl9kcnYoZmRjdHJsKTsKKyAgICBmZF9zdGFydChjdXJfZHJ2KTsKKyAgICBj dXJfZHJ2LT5kaXIgPSAxOworICAgIGlmIChmZGN0cmwtPmZpZm9bMl0gPiBjdXJfZHJ2LT50 cmFjaykgeworICAgICAgICBjdXJfZHJ2LT50cmFjayA9IDA7CisgICAgfSBlbHNlIHsKKyAg ICAgICAgY3VyX2Rydi0+dHJhY2sgLT0gZmRjdHJsLT5maWZvWzJdOworICAgIH0KKyAgICBm ZGN0cmxfcmVzZXRfZmlmbyhmZGN0cmwpOworICAgIC8qIFJhaXNlIEludGVycnVwdCAqLwor ICAgIGZkY3RybF9yYWlzZV9pcnEoZmRjdHJsLCBGRF9TUjBfU0VFSyk7Cit9CisKIHN0YXRp YyB2b2lkIGZkY3RybF93cml0ZV9kYXRhIChmZGN0cmxfdCAqZmRjdHJsLCB1aW50MzJfdCB2 YWx1ZSkKIHsKICAgICBmZHJpdmVfdCAqY3VyX2RydjsKQEAgLTE1NzEsMjAgKzE4NDcsNyBA QA0KICAgICAgICAgY2FzZSBGRF9DTURfRFVNUFJFRzoKICAgICAgICAgICAgIC8qIERVTVBS RUcgKi8KICAgICAgICAgICAgIEZMT1BQWV9EUFJJTlRGKCJEVU1QUkVHIGNvbW1hbmRcbiIp OwotICAgICAgICAgICAgLyogRHJpdmVzIHBvc2l0aW9uICovCi0gICAgICAgICAgICBmZGN0 cmwtPmZpZm9bMF0gPSBkcnYwKGZkY3RybCktPnRyYWNrOwotICAgICAgICAgICAgZmRjdHJs LT5maWZvWzFdID0gZHJ2MShmZGN0cmwpLT50cmFjazsKLSAgICAgICAgICAgIGZkY3RybC0+ Zmlmb1syXSA9IDA7Ci0gICAgICAgICAgICBmZGN0cmwtPmZpZm9bM10gPSAwOwotICAgICAg ICAgICAgLyogdGltZXJzICovCi0gICAgICAgICAgICBmZGN0cmwtPmZpZm9bNF0gPSBmZGN0 cmwtPnRpbWVyMDsKLSAgICAgICAgICAgIGZkY3RybC0+Zmlmb1s1XSA9IChmZGN0cmwtPnRp bWVyMSA8PCAxKSB8IGZkY3RybC0+ZG1hX2VuOwotICAgICAgICAgICAgZmRjdHJsLT5maWZv WzZdID0gY3VyX2Rydi0+bGFzdF9zZWN0OwotICAgICAgICAgICAgZmRjdHJsLT5maWZvWzdd ID0gKGZkY3RybC0+bG9jayA8PCA3KSB8Ci0gICAgICAgICAgICAgICAgKGN1cl9kcnYtPnBl cnBlbmRpY3VsYXIgPDwgMik7Ci0gICAgICAgICAgICBmZGN0cmwtPmZpZm9bOF0gPSBmZGN0 cmwtPmNvbmZpZzsKLSAgICAgICAgICAgIGZkY3RybC0+Zmlmb1s5XSA9IGZkY3RybC0+cHJl Y29tcF90cms7Ci0gICAgICAgICAgICBmZGN0cmxfc2V0X2ZpZm8oZmRjdHJsLCAxMCwgMCk7 CisgICAgICAgICAgICBmZGN0cmxfaGFuZGxlX2R1bXByZWcoZmRjdHJsLCAwKTsKICAgICAg ICAgICAgIHJldHVybjsKICAgICAgICAgY2FzZSBGRF9DTURfU0VFSzoKICAgICAgICAgICAg IC8qIFNFRUsgKi8KQEAgLTE1OTUsMTAgKzE4NTgsNyBAQA0KICAgICAgICAgY2FzZSBGRF9D TURfVkVSU0lPTjoKICAgICAgICAgICAgIC8qIFZFUlNJT04gKi8KICAgICAgICAgICAgIEZM T1BQWV9EUFJJTlRGKCJWRVJTSU9OIGNvbW1hbmRcbiIpOwotICAgICAgICAgICAgLyogTm8g cGFyYW1ldGVycyBjbWQgKi8KLSAgICAgICAgICAgIC8qIENvbnRyb2xsZXIncyB2ZXJzaW9u ICovCi0gICAgICAgICAgICBmZGN0cmwtPmZpZm9bMF0gPSBmZGN0cmwtPnZlcnNpb247Ci0g ICAgICAgICAgICBmZGN0cmxfc2V0X2ZpZm8oZmRjdHJsLCAxLCAxKTsKKyAgICAgICAgICAg IGZkY3RybF9oYW5kbGVfdmVyc2lvbihmZGN0cmwsIDApOwogICAgICAgICAgICAgcmV0dXJu OwogICAgICAgICBjYXNlIEZEX0NNRF9QRVJQRU5ESUNVTEFSX01PREU6CiAgICAgICAgICAg ICAvKiBQRVJQRU5ESUNVTEFSX01PREUgKi8KQEAgLTE2MTUsMTAgKzE4NzUsNyBAQA0KICAg ICAgICAgY2FzZSBGRF9DTURfVU5MT0NLOgogICAgICAgICAgICAgLyogVU5MT0NLICovCiAg ICAgICAgICAgICBGTE9QUFlfRFBSSU5URigiVU5MT0NLIGNvbW1hbmRcbiIpOwotICAgICAg ICAgICAgLyogTm8gcGFyYW1ldGVycyBjbWQgKi8KLSAgICAgICAgICAgIGZkY3RybC0+bG9j ayA9IDA7Ci0gICAgICAgICAgICBmZGN0cmwtPmZpZm9bMF0gPSAwOwotICAgICAgICAgICAg ZmRjdHJsX3NldF9maWZvKGZkY3RybCwgMSwgMCk7CisgICAgICAgICAgICBmZGN0cmxfaGFu ZGxlX3VubG9jayhmZGN0cmwsIDApOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICBj YXNlIEZEX0NNRF9QT1dFUkRPV05fTU9ERToKICAgICAgICAgICAgIC8qIFBPV0VSRE9XTl9N T0RFICovCkBAIC0xNjI5LDMzICsxODg2LDEyIEBADQogICAgICAgICBjYXNlIEZEX0NNRF9Q QVJUX0lEOgogICAgICAgICAgICAgLyogUEFSVF9JRCAqLwogICAgICAgICAgICAgRkxPUFBZ X0RQUklOVEYoIlBBUlRfSUQgY29tbWFuZFxuIik7Ci0gICAgICAgICAgICAvKiBObyBwYXJh bWV0ZXJzIGNtZCAqLwotICAgICAgICAgICAgZmRjdHJsLT5maWZvWzBdID0gMHg0MTsgLyog U3RlcHBpbmcgMSAqLwotICAgICAgICAgICAgZmRjdHJsX3NldF9maWZvKGZkY3RybCwgMSwg MCk7CisgICAgICAgICAgICBmZGN0cmxfaGFuZGxlX3BhcnRpZChmZGN0cmwsIDApOwogICAg ICAgICAgICAgcmV0dXJuOwogICAgICAgICBjYXNlIEZEX0NNRF9TQVZFOgogICAgICAgICAg ICAgLyogU0FWRSAqLwogICAgICAgICAgICAgRkxPUFBZX0RQUklOVEYoIlNBVkUgY29tbWFu ZFxuIik7Ci0gICAgICAgICAgICAvKiBObyBwYXJhbWV0ZXJzIGNtZCAqLwotICAgICAgICAg ICAgZmRjdHJsLT5maWZvWzBdID0gMDsKLSAgICAgICAgICAgIGZkY3RybC0+Zmlmb1sxXSA9 IDA7Ci0gICAgICAgICAgICAvKiBEcml2ZXMgcG9zaXRpb24gKi8KLSAgICAgICAgICAgIGZk Y3RybC0+Zmlmb1syXSA9IGRydjAoZmRjdHJsKS0+dHJhY2s7Ci0gICAgICAgICAgICBmZGN0 cmwtPmZpZm9bM10gPSBkcnYxKGZkY3RybCktPnRyYWNrOwotICAgICAgICAgICAgZmRjdHJs LT5maWZvWzRdID0gMDsKLSAgICAgICAgICAgIGZkY3RybC0+Zmlmb1s1XSA9IDA7Ci0gICAg ICAgICAgICAvKiB0aW1lcnMgKi8KLSAgICAgICAgICAgIGZkY3RybC0+Zmlmb1s2XSA9IGZk Y3RybC0+dGltZXIwOwotICAgICAgICAgICAgZmRjdHJsLT5maWZvWzddID0gZmRjdHJsLT50 aW1lcjE7Ci0gICAgICAgICAgICBmZGN0cmwtPmZpZm9bOF0gPSBjdXJfZHJ2LT5sYXN0X3Nl Y3Q7Ci0gICAgICAgICAgICBmZGN0cmwtPmZpZm9bOV0gPSAoZmRjdHJsLT5sb2NrIDw8IDcp IHwKLSAgICAgICAgICAgICAgICAoY3VyX2Rydi0+cGVycGVuZGljdWxhciA8PCAyKTsKLSAg ICAgICAgICAgIGZkY3RybC0+Zmlmb1sxMF0gPSBmZGN0cmwtPmNvbmZpZzsKLSAgICAgICAg ICAgIGZkY3RybC0+Zmlmb1sxMV0gPSBmZGN0cmwtPnByZWNvbXBfdHJrOwotICAgICAgICAg ICAgZmRjdHJsLT5maWZvWzEyXSA9IGZkY3RybC0+cHdyZDsKLSAgICAgICAgICAgIGZkY3Ry bC0+Zmlmb1sxM10gPSAwOwotICAgICAgICAgICAgZmRjdHJsLT5maWZvWzE0XSA9IDA7Ci0g ICAgICAgICAgICBmZGN0cmxfc2V0X2ZpZm8oZmRjdHJsLCAxNSwgMSk7CisgICAgICAgICAg ICBmZGN0cmxfaGFuZGxlX3NhdmUoZmRjdHJsLCAwKTsKICAgICAgICAgICAgIHJldHVybjsK ICAgICAgICAgY2FzZSBGRF9DTURfT1BUSU9OOgogICAgICAgICAgICAgLyogT1BUSU9OICov CkBAIC0xNzAyLDEwICsxOTM4LDcgQEANCiAgICAgICAgIGNhc2UgRkRfQ01EX0xPQ0s6CiAg ICAgICAgICAgICAvKiBMT0NLICovCiAgICAgICAgICAgICBGTE9QUFlfRFBSSU5URigiTE9D SyBjb21tYW5kXG4iKTsKLSAgICAgICAgICAgIC8qIE5vIHBhcmFtZXRlcnMgY21kICovCi0g ICAgICAgICAgICBmZGN0cmwtPmxvY2sgPSAxOwotICAgICAgICAgICAgZmRjdHJsLT5maWZv WzBdID0gMHgxMDsKLSAgICAgICAgICAgIGZkY3RybF9zZXRfZmlmbyhmZGN0cmwsIDEsIDEp OworICAgICAgICAgICAgZmRjdHJsX2hhbmRsZV9sb2NrKGZkY3RybCwgMCk7CiAgICAgICAg ICAgICByZXR1cm47CiAgICAgICAgIGNhc2UgRkRfQ01EX0ZPUk1BVF9BTkRfV1JJVEU6CiAg ICAgICAgICAgICAvKiBGT1JNQVRfQU5EX1dSSVRFICovCkBAIC0xNzk3LDgzICsyMDMwLDQy IEBADQogICAgICAgICBjYXNlIEZEX0NNRF9TUEVDSUZZOgogICAgICAgICAgICAgLyogU1BF Q0lGWSAqLwogICAgICAgICAgICAgRkxPUFBZX0RQUklOVEYoInRyZWF0IFNQRUNJRlkgY29t bWFuZFxuIik7Ci0gICAgICAgICAgICBmZGN0cmwtPnRpbWVyMCA9IChmZGN0cmwtPmZpZm9b MV0gPj4gNCkgJiAweEY7Ci0gICAgICAgICAgICBmZGN0cmwtPnRpbWVyMSA9IGZkY3RybC0+ Zmlmb1syXSA+PiAxOwotICAgICAgICAgICAgZmRjdHJsLT5kbWFfZW4gPSAxIC0gKGZkY3Ry bC0+Zmlmb1syXSAmIDEpIDsKLSAgICAgICAgICAgIC8qIE5vIHJlc3VsdCBiYWNrICovCi0g ICAgICAgICAgICBmZGN0cmxfcmVzZXRfZmlmbyhmZGN0cmwpOworICAgICAgICAgICAgZmRj dHJsX2hhbmRsZV9zcGVjaWZ5KGZkY3RybCwgMCk7CiAgICAgICAgICAgICBicmVhazsKICAg ICAgICAgY2FzZSBGRF9DTURfU0VOU0VfRFJJVkVfU1RBVFVTOgogICAgICAgICAgICAgLyog U0VOU0VfRFJJVkVfU1RBVFVTICovCiAgICAgICAgICAgICBGTE9QUFlfRFBSSU5URigidHJl YXQgU0VOU0VfRFJJVkVfU1RBVFVTIGNvbW1hbmRcbiIpOwotICAgICAgICAgICAgZmRjdHJs LT5jdXJfZHJ2ID0gZmRjdHJsLT5maWZvWzFdICYgRkRfRE9SX1NFTE1BU0s7Ci0gICAgICAg ICAgICBjdXJfZHJ2ID0gZ2V0X2N1cl9kcnYoZmRjdHJsKTsKLSAgICAgICAgICAgIGN1cl9k cnYtPmhlYWQgPSAoZmRjdHJsLT5maWZvWzFdID4+IDIpICYgMTsKLSAgICAgICAgICAgIC8q IDEgQnl0ZSBzdGF0dXMgYmFjayAqLwotICAgICAgICAgICAgZmRjdHJsLT5maWZvWzBdID0g KGN1cl9kcnYtPnJvIDw8IDYpIHwKLSAgICAgICAgICAgICAgICAoY3VyX2Rydi0+dHJhY2sg PT0gMCA/IDB4MTAgOiAweDAwKSB8Ci0gICAgICAgICAgICAgICAgKGN1cl9kcnYtPmhlYWQg PDwgMikgfAotICAgICAgICAgICAgICAgIGZkY3RybC0+Y3VyX2RydiB8Ci0gICAgICAgICAg ICAgICAgMHgyODsKLSAgICAgICAgICAgIGZkY3RybF9zZXRfZmlmbyhmZGN0cmwsIDEsIDAp OworICAgICAgICAgICAgZmRjdHJsX2hhbmRsZV9zZW5zZV9kcml2ZV9zdGF0dXMoZmRjdHJs LCAwKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEZEX0NNRF9SRUNBTElC UkFURToKICAgICAgICAgICAgIC8qIFJFQ0FMSUJSQVRFICovCiAgICAgICAgICAgICBGTE9Q UFlfRFBSSU5URigidHJlYXQgUkVDQUxJQlJBVEUgY29tbWFuZFxuIik7Ci0gICAgICAgICAg ICBmZGN0cmwtPmN1cl9kcnYgPSBmZGN0cmwtPmZpZm9bMV0gJiBGRF9ET1JfU0VMTUFTSzsK LSAgICAgICAgICAgIGN1cl9kcnYgPSBnZXRfY3VyX2RydihmZGN0cmwpOwotICAgICAgICAg ICAgZmRfcmVjYWxpYnJhdGUoY3VyX2Rydik7Ci0gICAgICAgICAgICBmZGN0cmxfcmVzZXRf ZmlmbyhmZGN0cmwpOwotICAgICAgICAgICAgLyogUmFpc2UgSW50ZXJydXB0ICovCi0gICAg ICAgICAgICBmZGN0cmxfcmFpc2VfaXJxKGZkY3RybCwgRkRfU1IwX1NFRUspOworICAgICAg ICAgICAgZmRjdHJsX2hhbmRsZV9yZWNhbGlicmF0ZShmZGN0cmwsIDApOyAgICAgICAgICAg IAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgRkRfQ01EX1NFRUs6CiAgICAg ICAgICAgICAvKiBTRUVLICovCiAgICAgICAgICAgICBGTE9QUFlfRFBSSU5URigidHJlYXQg U0VFSyBjb21tYW5kXG4iKTsKLSAgICAgICAgICAgIGZkY3RybC0+Y3VyX2RydiA9IGZkY3Ry bC0+Zmlmb1sxXSAmIEZEX0RPUl9TRUxNQVNLOwotICAgICAgICAgICAgY3VyX2RydiA9IGdl dF9jdXJfZHJ2KGZkY3RybCk7Ci0gICAgICAgICAgICBmZF9zdGFydChjdXJfZHJ2KTsKLSAg ICAgICAgICAgIGlmIChmZGN0cmwtPmZpZm9bMl0gPD0gY3VyX2Rydi0+dHJhY2spCi0gICAg ICAgICAgICAgICAgY3VyX2Rydi0+ZGlyID0gMTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAg ICAgICAgICAgICBjdXJfZHJ2LT5kaXIgPSAwOwotICAgICAgICAgICAgZmRjdHJsX3Jlc2V0 X2ZpZm8oZmRjdHJsKTsKLSAgICAgICAgICAgIGlmIChmZGN0cmwtPmZpZm9bMl0gPiBjdXJf ZHJ2LT5tYXhfdHJhY2spIHsKLSAgICAgICAgICAgICAgICBmZGN0cmxfcmFpc2VfaXJxKGZk Y3RybCwgRkRfU1IwX0FCTlRFUk0gfCBGRF9TUjBfU0VFSyk7Ci0gICAgICAgICAgICB9IGVs c2UgewotICAgICAgICAgICAgICAgIGN1cl9kcnYtPnRyYWNrID0gZmRjdHJsLT5maWZvWzJd OwotICAgICAgICAgICAgICAgIC8qIFJhaXNlIEludGVycnVwdCAqLwotICAgICAgICAgICAg ICAgIGZkY3RybF9yYWlzZV9pcnEoZmRjdHJsLCBGRF9TUjBfU0VFSyk7Ci0gICAgICAgICAg ICB9CisgICAgICAgICAgICBmZGN0cmxfaGFuZGxlX3NlZWsoZmRjdHJsLCAwKTsKICAgICAg ICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEZEX0NNRF9QRVJQRU5ESUNVTEFSX01PREU6 CiAgICAgICAgICAgICAvKiBQRVJQRU5ESUNVTEFSX01PREUgKi8KICAgICAgICAgICAgIEZM T1BQWV9EUFJJTlRGKCJ0cmVhdCBQRVJQRU5ESUNVTEFSX01PREUgY29tbWFuZFxuIik7Ci0g ICAgICAgICAgICBpZiAoZmRjdHJsLT5maWZvWzFdICYgMHg4MCkKLSAgICAgICAgICAgICAg ICBjdXJfZHJ2LT5wZXJwZW5kaWN1bGFyID0gZmRjdHJsLT5maWZvWzFdICYgMHg3OwotICAg ICAgICAgICAgLyogTm8gcmVzdWx0IGJhY2sgKi8KLSAgICAgICAgICAgIGZkY3RybF9yZXNl dF9maWZvKGZkY3RybCk7CisgICAgICAgICAgICBmZGN0cmxfaGFuZGxlX3BlcnBlbmRpY3Vs YXJfbW9kZShmZGN0cmwsIDApOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2Ug RkRfQ01EX0NPTkZJR1VSRToKICAgICAgICAgICAgIC8qIENPTkZJR1VSRSAqLwogICAgICAg ICAgICAgRkxPUFBZX0RQUklOVEYoInRyZWF0IENPTkZJR1VSRSBjb21tYW5kXG4iKTsKLSAg ICAgICAgICAgIGZkY3RybC0+Y29uZmlnID0gZmRjdHJsLT5maWZvWzJdOwotICAgICAgICAg ICAgZmRjdHJsLT5wcmVjb21wX3RyayA9ICBmZGN0cmwtPmZpZm9bM107Ci0gICAgICAgICAg ICAvKiBObyByZXN1bHQgYmFjayAqLwotICAgICAgICAgICAgZmRjdHJsX3Jlc2V0X2ZpZm8o ZmRjdHJsKTsKKyAgICAgICAgICAgIGZkY3RybF9oYW5kbGVfY29uZmlndXJlKGZkY3RybCwg MCk7ICAgICAgICAgICAgCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBGRF9D TURfUE9XRVJET1dOX01PREU6CiAgICAgICAgICAgICAvKiBQT1dFUkRPV05fTU9ERSAqLwog ICAgICAgICAgICAgRkxPUFBZX0RQUklOVEYoInRyZWF0IFBPV0VSRE9XTl9NT0RFIGNvbW1h bmRcbiIpOwotICAgICAgICAgICAgZmRjdHJsLT5wd3JkID0gZmRjdHJsLT5maWZvWzFdOwot ICAgICAgICAgICAgZmRjdHJsLT5maWZvWzBdID0gZmRjdHJsLT5maWZvWzFdOwotICAgICAg ICAgICAgZmRjdHJsX3NldF9maWZvKGZkY3RybCwgMSwgMSk7CisgICAgICAgICAgICBmZGN0 cmxfaGFuZGxlX3Bvd2VyZG93bl9tb2RlKGZkY3RybCwgMCk7ICAgICAgICAgICAgCiAgICAg ICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBGRF9DTURfT1BUSU9OOgogICAgICAgICAg ICAgLyogT1BUSU9OICovCiAgICAgICAgICAgICBGTE9QUFlfRFBSSU5URigidHJlYXQgT1BU SU9OIGNvbW1hbmRcbiIpOwotICAgICAgICAgICAgLyogTm8gcmVzdWx0IGJhY2sgKi8KLSAg ICAgICAgICAgIGZkY3RybF9yZXNldF9maWZvKGZkY3RybCk7CisgICAgICAgICAgICBmZGN0 cmxfaGFuZGxlX29wdGlvbihmZGN0cmwsIDApOwogICAgICAgICAgICAgYnJlYWs7CiAgICAg ICAgIGNhc2UgRkRfQ01EX1JFQURfVFJBQ0s6CiAgICAgICAgICAgICAvKiBSRUFEX1RSQUNL ICovCkBAIC0xODg0LDg5ICsyMDc2LDI3IEBADQogICAgICAgICBjYXNlIEZEX0NNRF9SRUFE X0lEOgogICAgICAgICAgICAgLyogUkVBRF9JRCAqLwogICAgICAgICAgICAgRkxPUFBZX0RQ UklOVEYoInRyZWF0IFJFQURfSUQgY29tbWFuZFxuIik7Ci0gICAgICAgICAgICAvKiBYWFg6 IHNob3VsZCBzZXQgbWFpbiBzdGF0dXMgcmVnaXN0ZXIgdG8gYnVzeSAqLwotICAgICAgICAg ICAgY3VyX2Rydi0+aGVhZCA9IChmZGN0cmwtPmZpZm9bMV0gPj4gMikgJiAxOwotICAgICAg ICAgICAgcWVtdV9tb2RfdGltZXIoZmRjdHJsLT5yZXN1bHRfdGltZXIsCi0gICAgICAgICAg ICAgICAgICAgICAgICAgICBxZW11X2dldF9jbG9jayh2bV9jbG9jaykgKyAodGlja3NfcGVy X3NlYyAvIDUwKSk7CisgICAgICAgICAgICBmZGN0cmxfaGFuZGxlX3JlYWRpZChmZGN0cmws IDApOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgRkRfQ01EX1JFU1RPUkU6 CiAgICAgICAgICAgICAvKiBSRVNUT1JFICovCiAgICAgICAgICAgICBGTE9QUFlfRFBSSU5U RigidHJlYXQgUkVTVE9SRSBjb21tYW5kXG4iKTsKLSAgICAgICAgICAgIC8qIERyaXZlcyBw b3NpdGlvbiAqLwotICAgICAgICAgICAgZHJ2MChmZGN0cmwpLT50cmFjayA9IGZkY3RybC0+ Zmlmb1szXTsKLSAgICAgICAgICAgIGRydjEoZmRjdHJsKS0+dHJhY2sgPSBmZGN0cmwtPmZp Zm9bNF07Ci0gICAgICAgICAgICAvKiB0aW1lcnMgKi8KLSAgICAgICAgICAgIGZkY3RybC0+ dGltZXIwID0gZmRjdHJsLT5maWZvWzddOwotICAgICAgICAgICAgZmRjdHJsLT50aW1lcjEg PSBmZGN0cmwtPmZpZm9bOF07Ci0gICAgICAgICAgICBjdXJfZHJ2LT5sYXN0X3NlY3QgPSBm ZGN0cmwtPmZpZm9bOV07Ci0gICAgICAgICAgICBmZGN0cmwtPmxvY2sgPSBmZGN0cmwtPmZp Zm9bMTBdID4+IDc7Ci0gICAgICAgICAgICBjdXJfZHJ2LT5wZXJwZW5kaWN1bGFyID0gKGZk Y3RybC0+Zmlmb1sxMF0gPj4gMikgJiAweEY7Ci0gICAgICAgICAgICBmZGN0cmwtPmNvbmZp ZyA9IGZkY3RybC0+Zmlmb1sxMV07Ci0gICAgICAgICAgICBmZGN0cmwtPnByZWNvbXBfdHJr ID0gZmRjdHJsLT5maWZvWzEyXTsKLSAgICAgICAgICAgIGZkY3RybC0+cHdyZCA9IGZkY3Ry bC0+Zmlmb1sxM107Ci0gICAgICAgICAgICBmZGN0cmxfcmVzZXRfZmlmbyhmZGN0cmwpOwor ICAgICAgICAgICAgZmRjdHJsX2hhbmRsZV9yZXN0b3JlKGZkY3RybCwgMCk7CiAgICAgICAg ICAgICBicmVhazsKICAgICAgICAgY2FzZSBGRF9DTURfRk9STUFUX1RSQUNLOgogICAgICAg ICAgICAgLyogRk9STUFUX1RSQUNLICovCiAgICAgICAgICAgICBGTE9QUFlfRFBSSU5URigi dHJlYXQgRk9STUFUX1RSQUNLIGNvbW1hbmRcbiIpOwotICAgICAgICAgICAgZmRjdHJsLT5j dXJfZHJ2ID0gZmRjdHJsLT5maWZvWzFdICYgRkRfRE9SX1NFTE1BU0s7Ci0gICAgICAgICAg ICBjdXJfZHJ2ID0gZ2V0X2N1cl9kcnYoZmRjdHJsKTsKLSAgICAgICAgICAgIGZkY3RybC0+ ZGF0YV9zdGF0ZSB8PSBGRF9TVEFURV9GT1JNQVQ7Ci0gICAgICAgICAgICBpZiAoZmRjdHJs LT5maWZvWzBdICYgMHg4MCkKLSAgICAgICAgICAgICAgICBmZGN0cmwtPmRhdGFfc3RhdGUg fD0gRkRfU1RBVEVfTVVMVEk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAg ZmRjdHJsLT5kYXRhX3N0YXRlICY9IH5GRF9TVEFURV9NVUxUSTsKLSAgICAgICAgICAgIGZk Y3RybC0+ZGF0YV9zdGF0ZSAmPSB+RkRfU1RBVEVfU0VFSzsKLSAgICAgICAgICAgIGN1cl9k cnYtPmJwcyA9Ci0gICAgICAgICAgICAgICAgZmRjdHJsLT5maWZvWzJdID4gNyA/IDE2Mzg0 IDogMTI4IDw8IGZkY3RybC0+Zmlmb1syXTsKLSNpZiAwCi0gICAgICAgICAgICBjdXJfZHJ2 LT5sYXN0X3NlY3QgPQotICAgICAgICAgICAgICAgIGN1cl9kcnYtPmZsYWdzICYgRkRJU0tf REJMX1NJREVTID8gZmRjdHJsLT5maWZvWzNdIDoKLSAgICAgICAgICAgICAgICBmZGN0cmwt PmZpZm9bM10gLyAyOwotI2Vsc2UKLSAgICAgICAgICAgIGN1cl9kcnYtPmxhc3Rfc2VjdCA9 IGZkY3RybC0+Zmlmb1szXTsKLSNlbmRpZgotICAgICAgICAgICAgLyogVE9ETzogaW1wbGVt ZW50IGZvcm1hdCB1c2luZyBETUEgZXhwZWN0ZWQgYnkgdGhlIEJvY2hzIEJJT1MKLSAgICAg ICAgICAgICAqIGFuZCBMaW51eCBmZGZvcm1hdCAocmVhZCAzIGJ5dGVzIHBlciBzZWN0b3Ig dmlhIERNQSBhbmQgZmlsbAotICAgICAgICAgICAgICogdGhlIHNlY3RvciB3aXRoIHRoZSBz cGVjaWZpZWQgZmlsbCBieXRlCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGZkY3Ry bC0+ZGF0YV9zdGF0ZSAmPSB+RkRfU1RBVEVfRk9STUFUOwotICAgICAgICAgICAgZmRjdHJs X3N0b3BfdHJhbnNmZXIoZmRjdHJsLCAweDAwLCAweDAwLCAweDAwKTsKKyAgICAgICAgICAg IGZkY3RybF9oYW5kbGVfZm9ybWF0X3RyYWNrKGZkY3RybCwgMCk7CiAgICAgICAgICAgICBi cmVhazsKICAgICAgICAgY2FzZSBGRF9DTURfRFJJVkVfU1BFQ0lGSUNBVElPTl9DT01NQU5E OgogICAgICAgICAgICAgLyogRFJJVkVfU1BFQ0lGSUNBVElPTl9DT01NQU5EICovCiAgICAg ICAgICAgICBGTE9QUFlfRFBSSU5URigidHJlYXQgRFJJVkVfU1BFQ0lGSUNBVElPTl9DT01N QU5EIGNvbW1hbmRcbiIpOwotICAgICAgICAgICAgaWYgKGZkY3RybC0+Zmlmb1tmZGN0cmwt PmRhdGFfcG9zIC0gMV0gJiAweDgwKSB7Ci0gICAgICAgICAgICAgICAgLyogQ29tbWFuZCBw YXJhbWV0ZXJzIGRvbmUgKi8KLSAgICAgICAgICAgICAgICBpZiAoZmRjdHJsLT5maWZvW2Zk Y3RybC0+ZGF0YV9wb3MgLSAxXSAmIDB4NDApIHsKLSAgICAgICAgICAgICAgICAgICAgZmRj dHJsLT5maWZvWzBdID0gZmRjdHJsLT5maWZvWzFdOwotICAgICAgICAgICAgICAgICAgICBm ZGN0cmwtPmZpZm9bMl0gPSAwOwotICAgICAgICAgICAgICAgICAgICBmZGN0cmwtPmZpZm9b M10gPSAwOwotICAgICAgICAgICAgICAgICAgICBmZGN0cmxfc2V0X2ZpZm8oZmRjdHJsLCA0 LCAxKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBm ZGN0cmxfcmVzZXRfZmlmbyhmZGN0cmwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAg ICAgIH0gZWxzZSBpZiAoZmRjdHJsLT5kYXRhX2xlbiA+IDcpIHsKLSAgICAgICAgICAgICAg ICAvKiBFUlJPUiAqLwotICAgICAgICAgICAgICAgIGZkY3RybC0+Zmlmb1swXSA9IDB4ODAg fAotICAgICAgICAgICAgICAgICAgICAoY3VyX2Rydi0+aGVhZCA8PCAyKSB8IGZkY3RybC0+ Y3VyX2RydjsKLSAgICAgICAgICAgICAgICBmZGN0cmxfc2V0X2ZpZm8oZmRjdHJsLCAxLCAx KTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZkY3RybF9oYW5kbGVfZHJpdmVfc3Bl Y2lmaWNhdGlvbl9jb21tYW5kKGZkY3RybCwgMCk7CiAgICAgICAgICAgICBicmVhazsKICAg ICAgICAgY2FzZSBGRF9DTURfUkVMQVRJVkVfU0VFS19PVVQ6CiAgICAgICAgICAgICAvKiBS RUxBVElWRV9TRUVLX09VVCAqLwogICAgICAgICAgICAgRkxPUFBZX0RQUklOVEYoInRyZWF0 IFJFTEFUSVZFX1NFRUtfT1VUIGNvbW1hbmRcbiIpOwotICAgICAgICAgICAgZmRjdHJsLT5j dXJfZHJ2ID0gZmRjdHJsLT5maWZvWzFdICYgRkRfRE9SX1NFTE1BU0s7Ci0gICAgICAgICAg ICBjdXJfZHJ2ID0gZ2V0X2N1cl9kcnYoZmRjdHJsKTsKLSAgICAgICAgICAgIGZkX3N0YXJ0 KGN1cl9kcnYpOwotICAgICAgICAgICAgY3VyX2Rydi0+ZGlyID0gMDsKLSAgICAgICAgICAg IGlmIChmZGN0cmwtPmZpZm9bMl0gKyBjdXJfZHJ2LT50cmFjayA+PSBjdXJfZHJ2LT5tYXhf dHJhY2spIHsKLSAgICAgICAgICAgICAgICBjdXJfZHJ2LT50cmFjayA9IGN1cl9kcnYtPm1h eF90cmFjayAtIDE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGN1 cl9kcnYtPnRyYWNrICs9IGZkY3RybC0+Zmlmb1syXTsKLSAgICAgICAgICAgIH0KLSAgICAg ICAgICAgIGZkY3RybF9yZXNldF9maWZvKGZkY3RybCk7Ci0gICAgICAgICAgICBmZGN0cmxf cmFpc2VfaXJxKGZkY3RybCwgRkRfU1IwX1NFRUspOworICAgICAgICAgICAgZmRjdHJsX2hh bmRsZV9yZWxhdGl2ZV9zZWVrX291dChmZGN0cmwsIDApOwogICAgICAgICAgICAgYnJlYWs7 CiAgICAgICAgIGNhc2UgRkRfQ01EX0ZPUk1BVF9BTkRfV1JJVEU6CiAgICAgICAgICAgICAv KiBGT1JNQVRfQU5EX1dSSVRFICovCkBAIC0xOTc3LDE4ICsyMTA3LDcgQEANCiAgICAgICAg IGNhc2UgRkRfQ01EX1JFTEFUSVZFX1NFRUtfSU46CiAgICAgICAgICAgICAvKiBSRUxBVElW RV9TRUVLX0lOICovCiAgICAgICAgICAgICBGTE9QUFlfRFBSSU5URigidHJlYXQgUkVMQVRJ VkVfU0VFS19JTiBjb21tYW5kXG4iKTsKLSAgICAgICAgICAgIGZkY3RybC0+Y3VyX2RydiA9 IGZkY3RybC0+Zmlmb1sxXSAmIEZEX0RPUl9TRUxNQVNLOwotICAgICAgICAgICAgY3VyX2Ry diA9IGdldF9jdXJfZHJ2KGZkY3RybCk7Ci0gICAgICAgICAgICBmZF9zdGFydChjdXJfZHJ2 KTsKLSAgICAgICAgICAgIGN1cl9kcnYtPmRpciA9IDE7Ci0gICAgICAgICAgICBpZiAoZmRj dHJsLT5maWZvWzJdID4gY3VyX2Rydi0+dHJhY2spIHsKLSAgICAgICAgICAgICAgICBjdXJf ZHJ2LT50cmFjayA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAg IGN1cl9kcnYtPnRyYWNrIC09IGZkY3RybC0+Zmlmb1syXTsKLSAgICAgICAgICAgIH0KLSAg ICAgICAgICAgIGZkY3RybF9yZXNldF9maWZvKGZkY3RybCk7Ci0gICAgICAgICAgICAvKiBS YWlzZSBJbnRlcnJ1cHQgKi8KLSAgICAgICAgICAgIGZkY3RybF9yYWlzZV9pcnEoZmRjdHJs LCBGRF9TUjBfU0VFSyk7CisgICAgICAgICAgICBmZGN0cmxfaGFuZGxlX3JlbGF0aXZlX3Nl ZWtfaW4oZmRjdHJsLCAwKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAg fQo= --------------030405040503060400030808 Content-Type: text/plain; name="fdc_remove_duplicate.diff" Content-Disposition: inline; filename="fdc_remove_duplicate.diff" Content-Transfer-Encoding: quoted-printable Index: fdc.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- fdc.c (revision 4154) +++ fdc.c (working copy) @@ -2,6 +2,7 @@ * QEMU Floppy disk emulator (Intel 82078) * * Copyright (c) 2003, 2007 Jocelyn Mayer + * Copyright (c) 2008 Herv=E9 Poussineau * * Permission is hereby granted, free of charge, to any person obtaining= a copy * of this software and associated documentation files (the "Software"),= to deal @@ -372,32 +373,32 @@ }; =20 enum { + FD_CMD_READ_TRACK =3D 0x02, FD_CMD_SPECIFY =3D 0x03, FD_CMD_SENSE_DRIVE_STATUS =3D 0x04, + FD_CMD_WRITE =3D 0x05, + FD_CMD_READ =3D 0x06, FD_CMD_RECALIBRATE =3D 0x07, FD_CMD_SENSE_INTERRUPT_STATUS =3D 0x08, + FD_CMD_WRITE_DELETED =3D 0x09, + FD_CMD_READ_ID =3D 0x0a, + FD_CMD_READ_DELETED =3D 0x0c, + FD_CMD_FORMAT_TRACK =3D 0x0d, FD_CMD_DUMPREG =3D 0x0e, FD_CMD_SEEK =3D 0x0f, FD_CMD_VERSION =3D 0x10, + FD_CMD_SCAN_EQUAL =3D 0x11, FD_CMD_PERPENDICULAR_MODE =3D 0x12, FD_CMD_CONFIGURE =3D 0x13, FD_CMD_UNLOCK =3D 0x14, + FD_CMD_VERIFY =3D 0x16, FD_CMD_POWERDOWN_MODE =3D 0x17, FD_CMD_PART_ID =3D 0x18, + FD_CMD_SCAN_LOW_OR_EQUAL =3D 0x19, + FD_CMD_SCAN_HIGH_OR_EQUAL =3D 0x1d, FD_CMD_SAVE =3D 0x2c, FD_CMD_OPTION =3D 0x33, - FD_CMD_READ_TRACK =3D 0x42, - FD_CMD_WRITE =3D 0x45, - FD_CMD_READ =3D 0x46, - FD_CMD_WRITE_DELETED =3D 0x49, - FD_CMD_READ_ID =3D 0x4a, - FD_CMD_READ_DELETED =3D 0x4c, FD_CMD_RESTORE =3D 0x4c, - FD_CMD_FORMAT_TRACK =3D 0x4d, - FD_CMD_SCAN_EQUAL =3D 0x50, - FD_CMD_VERIFY =3D 0x56, - FD_CMD_SCAN_LOW_OR_EQUAL =3D 0x59, - FD_CMD_SCAN_HIGH_OR_EQUAL =3D 0x5d, FD_CMD_DRIVE_SPECIFICATION_COMMAND =3D 0x8e, FD_CMD_RELATIVE_SEEK_OUT =3D 0x8f, FD_CMD_LOCK =3D 0x94, @@ -1047,7 +1048,7 @@ } =20 /* Set an error: unimplemented/unknown command */ -static void fdctrl_unimplemented (fdctrl_t *fdctrl) +static void fdctrl_unimplemented (fdctrl_t *fdctrl, int direction) { #if 0 fdrive_t *cur_drv; @@ -1720,6 +1721,47 @@ static void fdctrl_write_data (fdctrl_t *fdctrl, uint32_t value) { fdrive_t *cur_drv; + int pos; + struct { + uint8_t value; + uint8_t mask; + const char* name; + int parameters; + void (*handler)(fdctrl_t *fdctrl, int direction); + int parameter; + } commands[] =3D { + { FD_CMD_RESTORE, 0xff, "RESTORE", 17, fdctrl_handle_restore }, = /* part of READ DELETED DATA */ + { FD_CMD_SAVE, 0xff, "SAVE", 0, fdctrl_handle_save }, /* part of= READ DELETED DATA */ + { FD_CMD_READ, 0x1f, "READ", 8, fdctrl_start_transfer, FD_DIR_RE= AD }, + { FD_CMD_READ_DELETED, 0x1f, "READ DELETED DATA", 8, fdctrl_star= t_transfer_del, FD_DIR_READ }, + { FD_CMD_SCAN_EQUAL, 0x1f, "SCAN EQUAL", 8, fdctrl_start_transfe= r, FD_DIR_SCANE }, + { FD_CMD_VERIFY, 0x1f, "VERIFY", 8, fdctrl_unimplemented }, + { FD_CMD_SCAN_LOW_OR_EQUAL, 0x1f, "SCAN LOW OR EQUAL", 8, fdctrl= _start_transfer, FD_DIR_SCANL }, + { FD_CMD_SCAN_HIGH_OR_EQUAL, 0x1f, "SCAN HIGH OR EQUAL", 8, fdct= rl_start_transfer, FD_DIR_SCANH }, + { FD_CMD_WRITE, 0x3f, "WRITE", 8, fdctrl_start_transfer, FD_DIR_= WRITE }, + { FD_CMD_WRITE_DELETED, 0x3f, "WRITE DELETED DATA", 8, fdctrl_st= art_transfer_del, FD_DIR_WRITE }, + { FD_CMD_READ_ID, 0xbf, "READ ID", 1, fdctrl_handle_readid }, + { FD_CMD_FORMAT_TRACK, 0xbf, "FORMAT TRACK", 5, fdctrl_handle_fo= rmat_track }, + { FD_CMD_READ_TRACK, 0xbf, "READ TRACK", 8, fdctrl_start_transfe= r, FD_DIR_READ }, + { FD_CMD_SPECIFY, 0xff, "SPECIFY", 2, fdctrl_handle_specify }, + { FD_CMD_SENSE_DRIVE_STATUS, 0xff, "SENSE DRIVE STATUS", 1, fdct= rl_handle_sense_drive_status }, + { FD_CMD_RECALIBRATE, 0xff, "RECALIBRATE", 1, fdctrl_handle_reca= librate }, + { FD_CMD_SEEK, 0xff, "SEEK", 2, fdctrl_handle_seek }, + { FD_CMD_PERPENDICULAR_MODE, 0xff, "PERPENDICULAR MODE", 1, fdct= rl_handle_perpendicular_mode }, + { FD_CMD_CONFIGURE, 0xff, "CONFIGURE", 3, fdctrl_handle_configur= e }, + { FD_CMD_POWERDOWN_MODE, 0xff, "POWERDOWN MODE", 2, fdctrl_handl= e_powerdown_mode }, + { FD_CMD_OPTION, 0xff, "OPTION", 1, fdctrl_handle_option }, + { FD_CMD_DRIVE_SPECIFICATION_COMMAND, 0xff, "DRIVE SPECIFICATION= COMMAND", 5, fdctrl_handle_drive_specification_command }, + { FD_CMD_RELATIVE_SEEK_OUT, 0xff, "RELATIVE SEEK OUT", 2, fdctrl= _handle_relative_seek_out }, + { FD_CMD_FORMAT_AND_WRITE, 0xff, "FORMAT AND WRITE", 10, fdctrl_= unimplemented }, + { FD_CMD_RELATIVE_SEEK_IN, 0xff, "RELATIVE SEEK IN", 2, fdctrl_h= andle_relative_seek_in }, + { FD_CMD_UNLOCK, 0xff, "UNLOCK", 0, fdctrl_handle_unlock }, + { FD_CMD_LOCK, 0xff, "LOCK", 0, fdctrl_handle_lock }, + { FD_CMD_DUMPREG, 0xff, "DUMPREG", 0, fdctrl_handle_dumpreg }, + { FD_CMD_VERSION, 0xff, "VERSION", 0, fdctrl_handle_version }, + { FD_CMD_PART_ID, 0xff, "PART ID", 0, fdctrl_handle_partid }, + { FD_CMD_WRITE, 0x1f, "WRITE (BeOS)", 8, fdctrl_start_transfer, = FD_DIR_WRITE }, /* not in specification ; BeOS 4.5 bug */ + }; =20 cur_drv =3D get_cur_drv(fdctrl); /* Reset mode */ @@ -1749,82 +1791,7 @@ } if (fdctrl->data_pos =3D=3D 0) { /* Command */ - switch (value & 0x5F) { - case FD_CMD_READ: - /* READ variants */ - FLOPPY_DPRINTF("READ command\n"); - /* 8 parameters cmd */ - fdctrl->data_len =3D 9; - goto enqueue; - case FD_CMD_READ_DELETED: - /* READ_DELETED variants */ - FLOPPY_DPRINTF("READ_DELETED command\n"); - /* 8 parameters cmd */ - fdctrl->data_len =3D 9; - goto enqueue; - case FD_CMD_SCAN_EQUAL: - /* SCAN_EQUAL variants */ - FLOPPY_DPRINTF("SCAN_EQUAL command\n"); - /* 8 parameters cmd */ - fdctrl->data_len =3D 9; - goto enqueue; - case FD_CMD_VERIFY: - /* VERIFY variants */ - FLOPPY_DPRINTF("VERIFY command\n"); - /* 8 parameters cmd */ - fdctrl->data_len =3D 9; - goto enqueue; - case FD_CMD_SCAN_LOW_OR_EQUAL: - /* SCAN_LOW_OR_EQUAL variants */ - FLOPPY_DPRINTF("SCAN_LOW_OR_EQUAL command\n"); - /* 8 parameters cmd */ - fdctrl->data_len =3D 9; - goto enqueue; - case FD_CMD_SCAN_HIGH_OR_EQUAL: - /* SCAN_HIGH_OR_EQUAL variants */ - FLOPPY_DPRINTF("SCAN_HIGH_OR_EQUAL command\n"); - /* 8 parameters cmd */ - fdctrl->data_len =3D 9; - goto enqueue; - default: - break; - } - switch (value & 0x7F) { - case FD_CMD_WRITE: - /* WRITE variants */ - FLOPPY_DPRINTF("WRITE command\n"); - /* 8 parameters cmd */ - fdctrl->data_len =3D 9; - goto enqueue; - case FD_CMD_WRITE_DELETED: - /* WRITE_DELETED variants */ - FLOPPY_DPRINTF("WRITE_DELETED command\n"); - /* 8 parameters cmd */ - fdctrl->data_len =3D 9; - goto enqueue; - default: - break; - } - switch (value) { - case FD_CMD_SPECIFY: - /* SPECIFY */ - FLOPPY_DPRINTF("SPECIFY command\n"); - /* 1 parameter cmd */ - fdctrl->data_len =3D 3; - goto enqueue; - case FD_CMD_SENSE_DRIVE_STATUS: - /* SENSE_DRIVE_STATUS */ - FLOPPY_DPRINTF("SENSE_DRIVE_STATUS command\n"); - /* 1 parameter cmd */ - fdctrl->data_len =3D 2; - goto enqueue; - case FD_CMD_RECALIBRATE: - /* RECALIBRATE */ - FLOPPY_DPRINTF("RECALIBRATE command\n"); - /* 1 parameter cmd */ - fdctrl->data_len =3D 2; - goto enqueue; - case FD_CMD_SENSE_INTERRUPT_STATUS: + if (value =3D=3D FD_CMD_SENSE_INTERRUPT_STATUS) { /* SENSE_INTERRUPT_STATUS */ FLOPPY_DPRINTF("SENSE_INTERRUPT_STATUS command (%02x)\n", fdctrl->int_status); @@ -1844,120 +1811,24 @@ fdctrl_reset_irq(fdctrl); fdctrl->int_status =3D FD_SR0_RDYCHG; return; - case FD_CMD_DUMPREG: - /* DUMPREG */ - FLOPPY_DPRINTF("DUMPREG command\n"); - fdctrl_handle_dumpreg(fdctrl, 0); - return; - case FD_CMD_SEEK: - /* SEEK */ - FLOPPY_DPRINTF("SEEK command\n"); - /* 2 parameters cmd */ - fdctrl->data_len =3D 3; - goto enqueue; - case FD_CMD_VERSION: - /* VERSION */ - FLOPPY_DPRINTF("VERSION command\n"); - fdctrl_handle_version(fdctrl, 0); - return; - case FD_CMD_PERPENDICULAR_MODE: - /* PERPENDICULAR_MODE */ - FLOPPY_DPRINTF("PERPENDICULAR_MODE command\n"); - /* 1 parameter cmd */ - fdctrl->data_len =3D 2; - goto enqueue; - case FD_CMD_CONFIGURE: - /* CONFIGURE */ - FLOPPY_DPRINTF("CONFIGURE command\n"); - /* 3 parameters cmd */ - fdctrl->data_len =3D 4; - goto enqueue; - case FD_CMD_UNLOCK: - /* UNLOCK */ - FLOPPY_DPRINTF("UNLOCK command\n"); - fdctrl_handle_unlock(fdctrl, 0); - return; - case FD_CMD_POWERDOWN_MODE: - /* POWERDOWN_MODE */ - FLOPPY_DPRINTF("POWERDOWN_MODE command\n"); - /* 2 parameters cmd */ - fdctrl->data_len =3D 3; - goto enqueue; - case FD_CMD_PART_ID: - /* PART_ID */ - FLOPPY_DPRINTF("PART_ID command\n"); - fdctrl_handle_partid(fdctrl, 0); - return; - case FD_CMD_SAVE: - /* SAVE */ - FLOPPY_DPRINTF("SAVE command\n"); - fdctrl_handle_save(fdctrl, 0); - return; - case FD_CMD_OPTION: - /* OPTION */ - FLOPPY_DPRINTF("OPTION command\n"); - /* 1 parameter cmd */ - fdctrl->data_len =3D 2; - goto enqueue; - case FD_CMD_READ_TRACK: - /* READ_TRACK */ - FLOPPY_DPRINTF("READ_TRACK command\n"); - /* 8 parameters cmd */ - fdctrl->data_len =3D 9; - goto enqueue; - case FD_CMD_READ_ID: - /* READ_ID */ - FLOPPY_DPRINTF("READ_ID command\n"); - /* 1 parameter cmd */ - fdctrl->data_len =3D 2; - goto enqueue; - case FD_CMD_RESTORE: - /* RESTORE */ - FLOPPY_DPRINTF("RESTORE command\n"); - /* 17 parameters cmd */ - fdctrl->data_len =3D 18; - goto enqueue; - case FD_CMD_FORMAT_TRACK: - /* FORMAT_TRACK */ - FLOPPY_DPRINTF("FORMAT_TRACK command\n"); - /* 5 parameters cmd */ - fdctrl->data_len =3D 6; - goto enqueue; - case FD_CMD_DRIVE_SPECIFICATION_COMMAND: - /* DRIVE_SPECIFICATION_COMMAND */ - FLOPPY_DPRINTF("DRIVE_SPECIFICATION_COMMAND command\n"); - /* 5 parameters cmd */ - fdctrl->data_len =3D 6; - goto enqueue; - case FD_CMD_RELATIVE_SEEK_OUT: - /* RELATIVE_SEEK_OUT */ - FLOPPY_DPRINTF("RELATIVE_SEEK_OUT command\n"); - /* 2 parameters cmd */ - fdctrl->data_len =3D 3; - goto enqueue; - case FD_CMD_LOCK: - /* LOCK */ - FLOPPY_DPRINTF("LOCK command\n"); - fdctrl_handle_lock(fdctrl, 0); - return; - case FD_CMD_FORMAT_AND_WRITE: - /* FORMAT_AND_WRITE */ - FLOPPY_DPRINTF("FORMAT_AND_WRITE command\n"); - /* 10 parameters cmd */ - fdctrl->data_len =3D 11; - goto enqueue; - case FD_CMD_RELATIVE_SEEK_IN: - /* RELATIVE_SEEK_IN */ - FLOPPY_DPRINTF("RELATIVE_SEEK_IN command\n"); - /* 2 parameters cmd */ - fdctrl->data_len =3D 3; - goto enqueue; - default: - /* Unknown command */ - FLOPPY_ERROR("unknown command: 0x%02x\n", value); - fdctrl_unimplemented(fdctrl); - return; } + + for (pos =3D 0; pos < sizeof(commands)/sizeof(commands[0]); pos+= +) { + if ((value & commands[pos].mask) =3D=3D commands[pos].value)= { + FLOPPY_DPRINTF("%s command\n", commands[pos].name); + if (commands[pos].parameters =3D=3D 0) { + (*commands[pos].handler)(fdctrl, commands[pos].param= eter); + return; + } + fdctrl->data_len =3D commands[pos].parameters + 1; + goto enqueue; + } + } + + /* Unknown command */ + FLOPPY_ERROR("unknown command: 0x%02x\n", value); + fdctrl_unimplemented(fdctrl, 0); + return; } enqueue: FLOPPY_DPRINTF("%s: %02x\n", __func__, value); @@ -1970,145 +1841,13 @@ fdctrl_format_sector(fdctrl); return; } - switch (fdctrl->fifo[0] & 0x1F) { - case FD_CMD_READ & 0x1F: - { - /* READ variants */ - FLOPPY_DPRINTF("treat READ command\n"); - fdctrl_start_transfer(fdctrl, FD_DIR_READ); - return; + + for (pos =3D 0; pos < sizeof(commands)/sizeof(commands[0]); pos+= +) { + if ((fdctrl->fifo[0] & commands[pos].mask) =3D=3D commands[p= os].value) { + FLOPPY_DPRINTF("treat %s command\n", commands[pos].name)= ; + (*commands[pos].handler)(fdctrl, commands[pos].parameter= ); + break; } - case FD_CMD_READ_DELETED & 0x1F: - /* READ_DELETED variants */ -// FLOPPY_DPRINTF("treat READ_DELETED command\n"); - FLOPPY_ERROR("treat READ_DELETED command\n"); - fdctrl_start_transfer_del(fdctrl, FD_DIR_READ); - return; - case FD_CMD_VERIFY & 0x1F: - /* VERIFY variants */ -// FLOPPY_DPRINTF("treat VERIFY command\n"); - FLOPPY_ERROR("treat VERIFY command\n"); - fdctrl_stop_transfer(fdctrl, FD_SR0_SEEK, 0x00, 0x00); - return; - case FD_CMD_SCAN_EQUAL & 0x1F: - /* SCAN_EQUAL variants */ -// FLOPPY_DPRINTF("treat SCAN_EQUAL command\n"); - FLOPPY_ERROR("treat SCAN_EQUAL command\n"); - fdctrl_start_transfer(fdctrl, FD_DIR_SCANE); - return; - case FD_CMD_SCAN_LOW_OR_EQUAL & 0x1F: - /* SCAN_LOW_OR_EQUAL variants */ -// FLOPPY_DPRINTF("treat SCAN_LOW_OR_EQUAL command\n"); - FLOPPY_ERROR("treat SCAN_LOW_OR_EQUAL command\n"); - fdctrl_start_transfer(fdctrl, FD_DIR_SCANL); - return; - case FD_CMD_SCAN_HIGH_OR_EQUAL & 0x1F: - /* SCAN_HIGH_OR_EQUAL variants */ -// FLOPPY_DPRINTF("treat SCAN_HIGH_OR_EQUAL command\n"); - FLOPPY_ERROR("treat SCAN_HIGH_OR_EQUAL command\n"); - fdctrl_start_transfer(fdctrl, FD_DIR_SCANH); - return; - default: - break; - } - switch (fdctrl->fifo[0] & 0x3F) { - case FD_CMD_WRITE & 0x3F: - /* WRITE variants */ - FLOPPY_DPRINTF("treat WRITE command (%02x)\n", fdctrl->fifo[= 0]); - fdctrl_start_transfer(fdctrl, FD_DIR_WRITE); - return; - case FD_CMD_WRITE_DELETED & 0x3F: - /* WRITE_DELETED variants */ -// FLOPPY_DPRINTF("treat WRITE_DELETED command\n"); - FLOPPY_ERROR("treat WRITE_DELETED command\n"); - fdctrl_start_transfer_del(fdctrl, FD_DIR_WRITE); - return; - default: - break; - } - switch (fdctrl->fifo[0]) { - case FD_CMD_SPECIFY: - /* SPECIFY */ - FLOPPY_DPRINTF("treat SPECIFY command\n"); - fdctrl_handle_specify(fdctrl, 0); - break; - case FD_CMD_SENSE_DRIVE_STATUS: - /* SENSE_DRIVE_STATUS */ - FLOPPY_DPRINTF("treat SENSE_DRIVE_STATUS command\n"); - fdctrl_handle_sense_drive_status(fdctrl, 0); - break; - case FD_CMD_RECALIBRATE: - /* RECALIBRATE */ - FLOPPY_DPRINTF("treat RECALIBRATE command\n"); - fdctrl_handle_recalibrate(fdctrl, 0); =20 - break; - case FD_CMD_SEEK: - /* SEEK */ - FLOPPY_DPRINTF("treat SEEK command\n"); - fdctrl_handle_seek(fdctrl, 0); - break; - case FD_CMD_PERPENDICULAR_MODE: - /* PERPENDICULAR_MODE */ - FLOPPY_DPRINTF("treat PERPENDICULAR_MODE command\n"); - fdctrl_handle_perpendicular_mode(fdctrl, 0); - break; - case FD_CMD_CONFIGURE: - /* CONFIGURE */ - FLOPPY_DPRINTF("treat CONFIGURE command\n"); - fdctrl_handle_configure(fdctrl, 0); =20 - break; - case FD_CMD_POWERDOWN_MODE: - /* POWERDOWN_MODE */ - FLOPPY_DPRINTF("treat POWERDOWN_MODE command\n"); - fdctrl_handle_powerdown_mode(fdctrl, 0); =20 - break; - case FD_CMD_OPTION: - /* OPTION */ - FLOPPY_DPRINTF("treat OPTION command\n"); - fdctrl_handle_option(fdctrl, 0); - break; - case FD_CMD_READ_TRACK: - /* READ_TRACK */ - FLOPPY_DPRINTF("treat READ_TRACK command\n"); - FLOPPY_ERROR("treat READ_TRACK command\n"); - fdctrl_start_transfer(fdctrl, FD_DIR_READ); - break; - case FD_CMD_READ_ID: - /* READ_ID */ - FLOPPY_DPRINTF("treat READ_ID command\n"); - fdctrl_handle_readid(fdctrl, 0); - break; - case FD_CMD_RESTORE: - /* RESTORE */ - FLOPPY_DPRINTF("treat RESTORE command\n"); - fdctrl_handle_restore(fdctrl, 0); - break; - case FD_CMD_FORMAT_TRACK: - /* FORMAT_TRACK */ - FLOPPY_DPRINTF("treat FORMAT_TRACK command\n"); - fdctrl_handle_format_track(fdctrl, 0); - break; - case FD_CMD_DRIVE_SPECIFICATION_COMMAND: - /* DRIVE_SPECIFICATION_COMMAND */ - FLOPPY_DPRINTF("treat DRIVE_SPECIFICATION_COMMAND command\n"= ); - fdctrl_handle_drive_specification_command(fdctrl, 0); - break; - case FD_CMD_RELATIVE_SEEK_OUT: - /* RELATIVE_SEEK_OUT */ - FLOPPY_DPRINTF("treat RELATIVE_SEEK_OUT command\n"); - fdctrl_handle_relative_seek_out(fdctrl, 0); - break; - case FD_CMD_FORMAT_AND_WRITE: - /* FORMAT_AND_WRITE */ - FLOPPY_DPRINTF("treat FORMAT_AND_WRITE command\n"); - FLOPPY_ERROR("treat FORMAT_AND_WRITE command\n"); - fdctrl_unimplemented(fdctrl); - break; - case FD_CMD_RELATIVE_SEEK_IN: - /* RELATIVE_SEEK_IN */ - FLOPPY_DPRINTF("treat RELATIVE_SEEK_IN command\n"); - fdctrl_handle_relative_seek_in(fdctrl, 0); - break; } } } --------------030405040503060400030808--