From patchwork Thu Jan 14 13:44:12 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gerd Hoffmann X-Patchwork-Id: 42885 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id BB01DB7CD6 for ; Fri, 15 Jan 2010 00:50:21 +1100 (EST) Received: from localhost ([127.0.0.1]:57408 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NVQ5X-0002zM-Q5 for incoming@patchwork.ozlabs.org; Thu, 14 Jan 2010 08:50:15 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NVPzs-0000vi-Q6 for qemu-devel@nongnu.org; Thu, 14 Jan 2010 08:44:25 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NVPzo-0000rK-R3 for qemu-devel@nongnu.org; Thu, 14 Jan 2010 08:44:24 -0500 Received: from [199.232.76.173] (port=35878 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NVPzo-0000r0-EF for qemu-devel@nongnu.org; Thu, 14 Jan 2010 08:44:20 -0500 Received: from mx1.redhat.com ([209.132.183.28]:48256) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NVPzn-0000Ne-Hl for qemu-devel@nongnu.org; Thu, 14 Jan 2010 08:44:19 -0500 Received: from int-mx04.intmail.prod.int.phx2.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.17]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o0EDiIas021777 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 14 Jan 2010 08:44:18 -0500 Received: from zweiblum.home.kraxel.org (vpn1-7-208.ams2.redhat.com [10.36.7.208]) by int-mx04.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o0EDiGe5029703; Thu, 14 Jan 2010 08:44:16 -0500 Received: by zweiblum.home.kraxel.org (Postfix, from userid 500) id B9E077010B; Thu, 14 Jan 2010 14:44:14 +0100 (CET) From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Thu, 14 Jan 2010 14:44:12 +0100 Message-Id: <1263476654-7222-2-git-send-email-kraxel@redhat.com> In-Reply-To: <1263476654-7222-1-git-send-email-kraxel@redhat.com> References: <1263476654-7222-1-git-send-email-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.17 X-detected-operating-system: by monty-python.gnu.org: Genre and OS details not recognized. Cc: Gerd Hoffmann Subject: [Qemu-devel] [PATCH 1/3] ide: device version property X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org This patch adds a new property named 'ver' to ide-drive which allows to specify the version which the virtual disk/cdrom should report to the guest. By default this is the qemu version (i.e. 0.12). usage: -drive if=none,id=disk,file=... -device ide-drive,bus=ide.0,unit=0,drive=disk,ver=42 You can also switch the version for all ide drives using: -global ide-drive.ver=42 Signed-off-by: Gerd Hoffmann --- hw/ide/core.c | 19 ++++++++++++------- hw/ide/internal.h | 4 +++- hw/ide/qdev.c | 3 ++- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/hw/ide/core.c b/hw/ide/core.c index 76c3820..b6643e8 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -115,7 +115,7 @@ static void ide_identify(IDEState *s) put_le16(p + 20, 3); /* XXX: retired, remove ? */ put_le16(p + 21, 512); /* cache size in sectors */ put_le16(p + 22, 4); /* ecc bytes */ - padstr((char *)(p + 23), QEMU_VERSION, 8); /* firmware version */ + padstr((char *)(p + 23), s->version, 8); /* firmware version */ padstr((char *)(p + 27), "QEMU HARDDISK", 40); /* model */ #if MAX_MULT_SECTORS > 1 put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS); @@ -186,7 +186,7 @@ static void ide_atapi_identify(IDEState *s) put_le16(p + 20, 3); /* buffer type */ put_le16(p + 21, 512); /* cache size in sectors */ put_le16(p + 22, 4); /* ecc bytes */ - padstr((char *)(p + 23), QEMU_VERSION, 8); /* firmware version */ + padstr((char *)(p + 23), s->version, 8); /* firmware version */ padstr((char *)(p + 27), "QEMU DVD-ROM", 40); /* model */ put_le16(p + 48, 1); /* dword I/O (XXX: should not be set on CDROM) */ #ifdef USE_DMA_CDROM @@ -238,7 +238,7 @@ static void ide_cfata_identify(IDEState *s) put_le16(p + 8, s->nb_sectors); /* Sectors per card */ padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */ put_le16(p + 22, 0x0004); /* ECC bytes */ - padstr((char *) (p + 23), QEMU_VERSION, 8); /* Firmware Revision */ + padstr((char *) (p + 23), s->version, 8); /* Firmware Revision */ padstr((char *) (p + 27), "QEMU MICRODRIVE", 40);/* Model number */ #if MAX_MULT_SECTORS > 1 put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS); @@ -1591,7 +1591,7 @@ static void ide_atapi_cmd(IDEState *s) buf[7] = 0; /* reserved */ padstr8(buf + 8, 8, "QEMU"); padstr8(buf + 16, 16, "QEMU DVD-ROM"); - padstr8(buf + 32, 4, QEMU_VERSION); + padstr8(buf + 32, 4, s->version); ide_atapi_cmd_reply(s, 36, max_len); break; case GPCMD_GET_CONFIGURATION: @@ -2590,7 +2590,7 @@ void ide_bus_reset(IDEBus *bus) ide_clear_hob(bus); } -void ide_init_drive(IDEState *s, DriveInfo *dinfo) +void ide_init_drive(IDEState *s, DriveInfo *dinfo, const char *version) { int cylinders, heads, secs; uint64_t nb_sectors; @@ -2619,6 +2619,11 @@ void ide_init_drive(IDEState *s, DriveInfo *dinfo) if (strlen(s->drive_serial_str) == 0) snprintf(s->drive_serial_str, sizeof(s->drive_serial_str), "QM%05d", s->drive_serial); + if (version) { + pstrcpy(s->version, sizeof(s->version), version); + } else { + pstrcpy(s->version, sizeof(s->version), QEMU_VERSION); + } ide_reset(s); } @@ -2639,9 +2644,9 @@ void ide_init2(IDEBus *bus, DriveInfo *hd0, DriveInfo *hd1, s->sector_write_timer = qemu_new_timer(vm_clock, ide_sector_write_timer_cb, s); if (i == 0) - ide_init_drive(s, hd0); + ide_init_drive(s, hd0, NULL); if (i == 1) - ide_init_drive(s, hd1); + ide_init_drive(s, hd1, NULL); } bus->irq = irq; } diff --git a/hw/ide/internal.h b/hw/ide/internal.h index eb5b404..1cc4b55 100644 --- a/hw/ide/internal.h +++ b/hw/ide/internal.h @@ -397,6 +397,7 @@ struct IDEState { /* set for lba48 access */ uint8_t lba48; BlockDriverState *bs; + char version[9]; /* ATAPI specific */ uint8_t sense_key; uint8_t asc; @@ -449,6 +450,7 @@ struct IDEDevice { DeviceState qdev; uint32_t unit; DriveInfo *dinfo; + char *version; }; typedef int (*ide_qdev_initfn)(IDEDevice *dev); @@ -549,7 +551,7 @@ uint32_t ide_data_readw(void *opaque, uint32_t addr); void ide_data_writel(void *opaque, uint32_t addr, uint32_t val); uint32_t ide_data_readl(void *opaque, uint32_t addr); -void ide_init_drive(IDEState *s, DriveInfo *dinfo); +void ide_init_drive(IDEState *s, DriveInfo *dinfo, const char *version); void ide_init2(IDEBus *bus, DriveInfo *hd0, DriveInfo *hd1, qemu_irq irq); void ide_init_ioport(IDEBus *bus, int iobase, int iobase2); diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c index 81e7995..0b84a4f 100644 --- a/hw/ide/qdev.c +++ b/hw/ide/qdev.c @@ -99,7 +99,7 @@ typedef struct IDEDrive { static int ide_drive_initfn(IDEDevice *dev) { IDEBus *bus = DO_UPCAST(IDEBus, qbus, dev->qdev.parent_bus); - ide_init_drive(bus->ifs + dev->unit, dev->dinfo); + ide_init_drive(bus->ifs + dev->unit, dev->dinfo, dev->version); return 0; } @@ -110,6 +110,7 @@ static IDEDeviceInfo ide_drive_info = { .qdev.props = (Property[]) { DEFINE_PROP_UINT32("unit", IDEDrive, dev.unit, -1), DEFINE_PROP_DRIVE("drive", IDEDrive, dev.dinfo), + DEFINE_PROP_STRING("ver", IDEDrive, dev.version), DEFINE_PROP_END_OF_LIST(), } };