mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 01:03:55 -06:00
Merge remote-tracking branch 'kwolf/for-anthony' into staging
* kwolf/for-anthony: (46 commits) qed: remove incoming live migration blocker qed: honor BDRV_O_INCOMING for incoming live migration migration: clear BDRV_O_INCOMING flags on end of incoming live migration qed: add bdrv_invalidate_cache to be called after incoming live migration blockdev: open images with BDRV_O_INCOMING on incoming live migration block: add a function to clear incoming live migration flags block: Add new BDRV_O_INCOMING flag to notice incoming live migration block stream: close unused files and update ->backing_hd qemu-iotests: Fix call syntax for qemu-io qemu-iotests: Fix call syntax for qemu-img qemu-iotests: Test unknown qcow2 header extensions qemu-iotests: qcow2.py sheepdog: fix send req helpers sheepdog: implement SD_OP_FLUSH_VDI operation block: bdrv_append() fixes qed: track dirty flag status qemu-img: add dirty flag status qed: image fragmentation statistics qemu-img: add image fragmentation statistics block: document job API ...
This commit is contained in:
commit
bb5d8dd757
44 changed files with 1089 additions and 502 deletions
|
@ -31,7 +31,6 @@
|
|||
#include "sysemu.h"
|
||||
#include "dma.h"
|
||||
#include "blockdev.h"
|
||||
#include "block_int.h"
|
||||
|
||||
#include <hw/ide/internal.h>
|
||||
|
||||
|
@ -101,7 +100,7 @@ static void ide_identify(IDEState *s)
|
|||
put_le16(p + 21, 512); /* cache size in sectors */
|
||||
put_le16(p + 22, 4); /* ecc bytes */
|
||||
padstr((char *)(p + 23), s->version, 8); /* firmware version */
|
||||
padstr((char *)(p + 27), "QEMU HARDDISK", 40); /* model */
|
||||
padstr((char *)(p + 27), s->drive_model_str, 40); /* model */
|
||||
#if MAX_MULT_SECTORS > 1
|
||||
put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
|
||||
#endif
|
||||
|
@ -143,17 +142,25 @@ static void ide_identify(IDEState *s)
|
|||
put_le16(p + 82, (1 << 14) | (1 << 5) | 1);
|
||||
/* 13=flush_cache_ext,12=flush_cache,10=lba48 */
|
||||
put_le16(p + 83, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10));
|
||||
/* 14=set to 1, 1=SMART self test, 0=SMART error logging */
|
||||
put_le16(p + 84, (1 << 14) | 0);
|
||||
/* 14=set to 1, 8=has WWN, 1=SMART self test, 0=SMART error logging */
|
||||
if (s->wwn) {
|
||||
put_le16(p + 84, (1 << 14) | (1 << 8) | 0);
|
||||
} else {
|
||||
put_le16(p + 84, (1 << 14) | 0);
|
||||
}
|
||||
/* 14 = NOP supported, 5=WCACHE enabled, 0=SMART feature set enabled */
|
||||
if (bdrv_enable_write_cache(s->bs))
|
||||
put_le16(p + 85, (1 << 14) | (1 << 5) | 1);
|
||||
else
|
||||
put_le16(p + 85, (1 << 14) | 1);
|
||||
/* 13=flush_cache_ext,12=flush_cache,10=lba48 */
|
||||
put_le16(p + 86, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10));
|
||||
/* 14=set to 1, 1=smart self test, 0=smart error logging */
|
||||
put_le16(p + 87, (1 << 14) | 0);
|
||||
put_le16(p + 86, (1 << 13) | (1 <<12) | (1 << 10));
|
||||
/* 14=set to 1, 8=has WWN, 1=SMART self test, 0=SMART error logging */
|
||||
if (s->wwn) {
|
||||
put_le16(p + 87, (1 << 14) | (1 << 8) | 0);
|
||||
} else {
|
||||
put_le16(p + 87, (1 << 14) | 0);
|
||||
}
|
||||
put_le16(p + 88, 0x3f | (1 << 13)); /* udma5 set and supported */
|
||||
put_le16(p + 93, 1 | (1 << 14) | 0x2000);
|
||||
put_le16(p + 100, s->nb_sectors);
|
||||
|
@ -163,6 +170,13 @@ static void ide_identify(IDEState *s)
|
|||
|
||||
if (dev && dev->conf.physical_block_size)
|
||||
put_le16(p + 106, 0x6000 | get_physical_block_exp(&dev->conf));
|
||||
if (s->wwn) {
|
||||
/* LE 16-bit words 111-108 contain 64-bit World Wide Name */
|
||||
put_le16(p + 108, s->wwn >> 48);
|
||||
put_le16(p + 109, s->wwn >> 32);
|
||||
put_le16(p + 110, s->wwn >> 16);
|
||||
put_le16(p + 111, s->wwn);
|
||||
}
|
||||
if (dev && dev->conf.discard_granularity) {
|
||||
put_le16(p + 169, 1); /* TRIM support */
|
||||
}
|
||||
|
@ -189,7 +203,7 @@ static void ide_atapi_identify(IDEState *s)
|
|||
put_le16(p + 21, 512); /* cache size in sectors */
|
||||
put_le16(p + 22, 4); /* ecc bytes */
|
||||
padstr((char *)(p + 23), s->version, 8); /* firmware version */
|
||||
padstr((char *)(p + 27), "QEMU DVD-ROM", 40); /* model */
|
||||
padstr((char *)(p + 27), s->drive_model_str, 40); /* model */
|
||||
put_le16(p + 48, 1); /* dword I/O (XXX: should not be set on CDROM) */
|
||||
#ifdef USE_DMA_CDROM
|
||||
put_le16(p + 49, 1 << 9 | 1 << 8); /* DMA and LBA supported */
|
||||
|
@ -246,7 +260,7 @@ static void ide_cfata_identify(IDEState *s)
|
|||
padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
|
||||
put_le16(p + 22, 0x0004); /* ECC bytes */
|
||||
padstr((char *) (p + 23), s->version, 8); /* Firmware Revision */
|
||||
padstr((char *) (p + 27), "QEMU MICRODRIVE", 40);/* Model number */
|
||||
padstr((char *) (p + 27), s->drive_model_str, 40);/* Model number */
|
||||
#if MAX_MULT_SECTORS > 1
|
||||
put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
|
||||
#else
|
||||
|
@ -604,7 +618,8 @@ void ide_dma_cb(void *opaque, int ret)
|
|||
break;
|
||||
case IDE_DMA_TRIM:
|
||||
s->bus->dma->aiocb = dma_bdrv_io(s->bs, &s->sg, sector_num,
|
||||
ide_issue_trim, ide_dma_cb, s, true);
|
||||
ide_issue_trim, ide_dma_cb, s,
|
||||
DMA_DIRECTION_TO_DEVICE);
|
||||
break;
|
||||
}
|
||||
return;
|
||||
|
@ -1834,7 +1849,8 @@ static const BlockDevOps ide_cd_block_ops = {
|
|||
};
|
||||
|
||||
int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
|
||||
const char *version, const char *serial)
|
||||
const char *version, const char *serial, const char *model,
|
||||
uint64_t wwn)
|
||||
{
|
||||
int cylinders, heads, secs;
|
||||
uint64_t nb_sectors;
|
||||
|
@ -1860,6 +1876,7 @@ int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
|
|||
s->heads = heads;
|
||||
s->sectors = secs;
|
||||
s->nb_sectors = nb_sectors;
|
||||
s->wwn = wwn;
|
||||
/* The SMART values should be preserved across power cycles
|
||||
but they aren't. */
|
||||
s->smart_enabled = 1;
|
||||
|
@ -1880,11 +1897,27 @@ int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
|
|||
}
|
||||
}
|
||||
if (serial) {
|
||||
strncpy(s->drive_serial_str, serial, sizeof(s->drive_serial_str));
|
||||
pstrcpy(s->drive_serial_str, sizeof(s->drive_serial_str), serial);
|
||||
} else {
|
||||
snprintf(s->drive_serial_str, sizeof(s->drive_serial_str),
|
||||
"QM%05d", s->drive_serial);
|
||||
}
|
||||
if (model) {
|
||||
pstrcpy(s->drive_model_str, sizeof(s->drive_model_str), model);
|
||||
} else {
|
||||
switch (kind) {
|
||||
case IDE_CD:
|
||||
strcpy(s->drive_model_str, "QEMU DVD-ROM");
|
||||
break;
|
||||
case IDE_CFATA:
|
||||
strcpy(s->drive_model_str, "QEMU MICRODRIVE");
|
||||
break;
|
||||
default:
|
||||
strcpy(s->drive_model_str, "QEMU HARDDISK");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (version) {
|
||||
pstrcpy(s->version, sizeof(s->version), version);
|
||||
} else {
|
||||
|
@ -1977,7 +2010,8 @@ void ide_init2_with_non_qdev_drives(IDEBus *bus, DriveInfo *hd0,
|
|||
if (dinfo) {
|
||||
if (ide_init_drive(&bus->ifs[i], dinfo->bdrv,
|
||||
dinfo->media_cd ? IDE_CD : IDE_HD, NULL,
|
||||
*dinfo->serial ? dinfo->serial : NULL) < 0) {
|
||||
*dinfo->serial ? dinfo->serial : NULL,
|
||||
NULL, 0) < 0) {
|
||||
error_report("Can't set up IDE drive %s", dinfo->id);
|
||||
exit(1);
|
||||
}
|
||||
|
|
|
@ -348,6 +348,8 @@ struct IDEState {
|
|||
uint8_t identify_data[512];
|
||||
int drive_serial;
|
||||
char drive_serial_str[21];
|
||||
char drive_model_str[41];
|
||||
uint64_t wwn;
|
||||
/* ide regs */
|
||||
uint8_t feature;
|
||||
uint8_t error;
|
||||
|
@ -468,6 +470,8 @@ struct IDEDevice {
|
|||
BlockConf conf;
|
||||
char *version;
|
||||
char *serial;
|
||||
char *model;
|
||||
uint64_t wwn;
|
||||
};
|
||||
|
||||
#define BM_STATUS_DMAING 0x01
|
||||
|
@ -534,7 +538,8 @@ void ide_data_writel(void *opaque, uint32_t addr, uint32_t val);
|
|||
uint32_t ide_data_readl(void *opaque, uint32_t addr);
|
||||
|
||||
int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
|
||||
const char *version, const char *serial);
|
||||
const char *version, const char *serial, const char *model,
|
||||
uint64_t wwn);
|
||||
void ide_init2(IDEBus *bus, qemu_irq irq);
|
||||
void ide_init2_with_non_qdev_drives(IDEBus *bus, DriveInfo *hd0,
|
||||
DriveInfo *hd1, qemu_irq irq);
|
||||
|
|
|
@ -149,7 +149,8 @@ static void pmac_ide_transfer_cb(void *opaque, int ret)
|
|||
break;
|
||||
case IDE_DMA_TRIM:
|
||||
m->aiocb = dma_bdrv_io(s->bs, &s->sg, sector_num,
|
||||
ide_issue_trim, pmac_ide_transfer_cb, s, true);
|
||||
ide_issue_trim, pmac_ide_transfer_cb, s,
|
||||
DMA_DIRECTION_TO_DEVICE);
|
||||
break;
|
||||
}
|
||||
return;
|
||||
|
|
|
@ -136,7 +136,8 @@ static int ide_dev_initfn(IDEDevice *dev, IDEDriveKind kind)
|
|||
}
|
||||
}
|
||||
|
||||
if (ide_init_drive(s, dev->conf.bs, kind, dev->version, serial) < 0) {
|
||||
if (ide_init_drive(s, dev->conf.bs, kind,
|
||||
dev->version, serial, dev->model, dev->wwn) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -173,7 +174,9 @@ static int ide_drive_initfn(IDEDevice *dev)
|
|||
#define DEFINE_IDE_DEV_PROPERTIES() \
|
||||
DEFINE_BLOCK_PROPERTIES(IDEDrive, dev.conf), \
|
||||
DEFINE_PROP_STRING("ver", IDEDrive, dev.version), \
|
||||
DEFINE_PROP_STRING("serial", IDEDrive, dev.serial)
|
||||
DEFINE_PROP_HEX64("wwn", IDEDrive, dev.wwn, 0), \
|
||||
DEFINE_PROP_STRING("serial", IDEDrive, dev.serial),\
|
||||
DEFINE_PROP_STRING("model", IDEDrive, dev.model)
|
||||
|
||||
static Property ide_hd_properties[] = {
|
||||
DEFINE_IDE_DEV_PROPERTIES(),
|
||||
|
|
|
@ -15,7 +15,6 @@
|
|||
#include "hw.h"
|
||||
#include "pci.h"
|
||||
#include "scsi.h"
|
||||
#include "block_int.h"
|
||||
#include "dma.h"
|
||||
|
||||
//#define DEBUG_LSI
|
||||
|
|
|
@ -877,6 +877,52 @@ PropertyInfo qdev_prop_pci_devfn = {
|
|||
.max = 0xFFFFFFFFULL,
|
||||
};
|
||||
|
||||
/* --- blocksize --- */
|
||||
|
||||
static void set_blocksize(Object *obj, Visitor *v, void *opaque,
|
||||
const char *name, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
int16_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
Error *local_err = NULL;
|
||||
int64_t value;
|
||||
|
||||
if (dev->state != DEV_STATE_CREATED) {
|
||||
error_set(errp, QERR_PERMISSION_DENIED);
|
||||
return;
|
||||
}
|
||||
|
||||
visit_type_int(v, &value, name, &local_err);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
return;
|
||||
}
|
||||
if (value < prop->info->min || value > prop->info->max) {
|
||||
error_set(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE,
|
||||
dev->id?:"", name, value, prop->info->min,
|
||||
prop->info->max);
|
||||
return;
|
||||
}
|
||||
|
||||
/* We rely on power-of-2 blocksizes for bitmasks */
|
||||
if ((value & (value - 1)) != 0) {
|
||||
error_set(errp, QERR_PROPERTY_VALUE_NOT_POWER_OF_2,
|
||||
dev->id?:"", name, value);
|
||||
return;
|
||||
}
|
||||
|
||||
*ptr = value;
|
||||
}
|
||||
|
||||
PropertyInfo qdev_prop_blocksize = {
|
||||
.name = "blocksize",
|
||||
.get = get_int16,
|
||||
.set = set_blocksize,
|
||||
.min = 512,
|
||||
.max = 65024,
|
||||
};
|
||||
|
||||
/* --- public helpers --- */
|
||||
|
||||
static Property *qdev_prop_walk(Property *props, const char *name)
|
||||
|
|
|
@ -223,6 +223,7 @@ extern PropertyInfo qdev_prop_drive;
|
|||
extern PropertyInfo qdev_prop_netdev;
|
||||
extern PropertyInfo qdev_prop_vlan;
|
||||
extern PropertyInfo qdev_prop_pci_devfn;
|
||||
extern PropertyInfo qdev_prop_blocksize;
|
||||
|
||||
#define DEFINE_PROP(_name, _state, _field, _prop, _type) { \
|
||||
.name = (_name), \
|
||||
|
@ -284,6 +285,8 @@ extern PropertyInfo qdev_prop_pci_devfn;
|
|||
#define DEFINE_PROP_LOSTTICKPOLICY(_n, _s, _f, _d) \
|
||||
DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_losttickpolicy, \
|
||||
LostTickPolicy)
|
||||
#define DEFINE_PROP_BLOCKSIZE(_n, _s, _f, _d) \
|
||||
DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_blocksize, uint16_t)
|
||||
|
||||
#define DEFINE_PROP_END_OF_LIST() \
|
||||
{}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue