From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Lnhjr-0004FD-77 for qemu-devel@nongnu.org; Sat, 28 Mar 2009 19:14:55 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Lnhjq-0004ER-Ju for qemu-devel@nongnu.org; Sat, 28 Mar 2009 19:14:54 -0400 Received: from [199.232.76.173] (port=36333 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Lnhjq-0004ED-FX for qemu-devel@nongnu.org; Sat, 28 Mar 2009 19:14:54 -0400 Received: from savannah.gnu.org ([199.232.41.3]:53522 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1Lnhjq-0007ex-9b for qemu-devel@nongnu.org; Sat, 28 Mar 2009 19:14:54 -0400 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1Lnhjp-0005rO-Kl for qemu-devel@nongnu.org; Sat, 28 Mar 2009 23:14:53 +0000 Received: from aurel32 by cvs.savannah.gnu.org with local (Exim 4.69) (envelope-from ) id 1Lnhjp-0005rJ-AY for qemu-devel@nongnu.org; Sat, 28 Mar 2009 23:14:53 +0000 MIME-Version: 1.0 Errors-To: aurel32 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Aurelien Jarno Message-Id: Date: Sat, 28 Mar 2009 23:14:53 +0000 Subject: [Qemu-devel] [6918] hw/eeprom93xx.c: support 93xx EEPROMs with more than 255 words 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 Revision: 6918 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=6918 Author: aurel32 Date: 2009-03-28 23:14:52 +0000 (Sat, 28 Mar 2009) Log Message: ----------- hw/eeprom93xx.c: support 93xx EEPROMs with more than 255 words In the head of eeprom93xx.c we promise to support chips with 256 words, but store the size in an unsigned byte. This patch replaces this with an 16 bit variable and changes the load/store code accordingly (introducing a new version). Signed-off-by: Andre Przywara Signed-off-by: Aurelien Jarno Modified Paths: -------------- trunk/hw/eeprom93xx.c Modified: trunk/hw/eeprom93xx.c =================================================================== --- trunk/hw/eeprom93xx.c 2009-03-28 23:14:41 UTC (rev 6917) +++ trunk/hw/eeprom93xx.c 2009-03-28 23:14:52 UTC (rev 6918) @@ -49,8 +49,9 @@ #define logout(fmt, args...) ((void)0) #endif -static int eeprom_instance = 0; -static const int eeprom_version = 20061112; +#define EEPROM_INSTANCE 0 +#define OLD_EEPROM_VERSION 20061112 +#define EEPROM_VERSION (OLD_EEPROM_VERSION + 1) #if 0 typedef enum { @@ -83,7 +84,7 @@ uint8_t eedo; uint8_t addrbits; - uint8_t size; + uint16_t size; uint16_t data; uint16_t contents[0]; }; @@ -106,8 +107,7 @@ qemu_put_byte(f, eeprom->eedo); qemu_put_byte(f, eeprom->addrbits); - qemu_put_byte(f, eeprom->size); - qemu_put_byte(f, 0); /* padding for compatiblity */ + qemu_put_be16(f, eeprom->size); qemu_put_be16(f, eeprom->data); for (address = 0; address < eeprom->size; address++) { qemu_put_be16(f, eeprom->contents[address]); @@ -120,9 +120,9 @@ of data and current EEPROM are identical. */ eeprom_t *eeprom = (eeprom_t *)opaque; int result = -EINVAL; - if (version_id == eeprom_version) { + if (version_id >= OLD_EEPROM_VERSION) { unsigned address; - uint8_t size = eeprom->size; + int size = eeprom->size; eeprom->tick = qemu_get_byte(f); eeprom->address = qemu_get_byte(f); @@ -134,8 +134,12 @@ eeprom->eedo = qemu_get_byte(f); eeprom->addrbits = qemu_get_byte(f); - eeprom->size = qemu_get_byte(f); - qemu_get_byte(f); /* skip padding byte */ + if (version_id == OLD_EEPROM_VERSION) { + eeprom->size = qemu_get_byte(f); + qemu_get_byte(f); + } else { + eeprom->size = qemu_get_be16(f); + } if (eeprom->size == size) { eeprom->data = qemu_get_be16(f); @@ -317,7 +321,7 @@ /* Output DO is tristate, read results in 1. */ eeprom->eedo = 1; logout("eeprom = 0x%p, nwords = %u\n", eeprom, nwords); - register_savevm("eeprom", eeprom_instance, eeprom_version, + register_savevm("eeprom", EEPROM_INSTANCE, EEPROM_VERSION, eeprom_save, eeprom_load, eeprom); return eeprom; }