Compare commits
40
Commits
v1.6.1
...
stable-1.6
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e82ee0845c | ||
|
|
192d2f4cc7 | ||
|
|
9388fdb603 | ||
|
|
68a1ac19a1 | ||
|
|
08dde5b17b | ||
|
|
12f741031f | ||
|
|
982c8c5e20 | ||
|
|
d90ff19d0a | ||
|
|
7cfd037403 | ||
|
|
0f6298786f | ||
|
|
03060dc086 | ||
|
|
2cafbbf1e0 | ||
|
|
991a5f3782 | ||
|
|
817a872cc6 | ||
|
|
37da395651 | ||
|
|
4d2f39a918 | ||
|
|
4a5bf69f78 | ||
|
|
53e8cf93b3 | ||
|
|
2c8187434f | ||
|
|
5326636ff2 | ||
|
|
3bd74d1712 | ||
|
|
c554ddb901 | ||
|
|
c1fecf2085 | ||
|
|
08e2f35c65 | ||
|
|
ba3b29e04b | ||
|
|
0ca1774b61 | ||
|
|
bd821a9bc3 | ||
|
|
7bda8555de | ||
|
|
91a2cf3d0b | ||
|
|
b685f6af6f | ||
|
|
99b5b999a4 | ||
|
|
78bd79fac3 | ||
|
|
a2c9dc504a | ||
|
|
927fab3e06 | ||
|
|
2c342444a0 | ||
|
|
98384a92cc | ||
|
|
7038fe818e | ||
|
|
8501da4b93 | ||
|
|
aeefaaac83 | ||
|
|
205cff77af |
No files matched your search
+2
-1
@@ -1124,7 +1124,8 @@ static int audio_is_timer_needed (void)
|
||||
static void audio_reset_timer (AudioState *s)
|
||||
{
|
||||
if (audio_is_timer_needed ()) {
|
||||
qemu_mod_timer (s->ts, qemu_get_clock_ns (vm_clock) + 1);
|
||||
qemu_mod_timer (s->ts,
|
||||
qemu_get_clock_ns(vm_clock) + conf.period.ticks);
|
||||
}
|
||||
else {
|
||||
qemu_del_timer (s->ts);
|
||||
|
||||
+3
-1
@@ -91,12 +91,14 @@ static int rng_egd_chr_can_read(void *opaque)
|
||||
static void rng_egd_chr_read(void *opaque, const uint8_t *buf, int size)
|
||||
{
|
||||
RngEgd *s = RNG_EGD(opaque);
|
||||
size_t buf_offset = 0;
|
||||
|
||||
while (size > 0 && s->requests) {
|
||||
RngRequest *req = s->requests->data;
|
||||
int len = MIN(size, req->size - req->offset);
|
||||
|
||||
memcpy(req->data + req->offset, buf, len);
|
||||
memcpy(req->data + req->offset, buf + buf_offset, len);
|
||||
buf_offset += len;
|
||||
req->offset += len;
|
||||
size -= len;
|
||||
|
||||
|
||||
@@ -266,12 +266,15 @@ static int count_contiguous_clusters(uint64_t nb_clusters, int cluster_size,
|
||||
uint64_t *l2_table, uint64_t start, uint64_t stop_flags)
|
||||
{
|
||||
int i;
|
||||
uint64_t mask = stop_flags | L2E_OFFSET_MASK;
|
||||
uint64_t offset = be64_to_cpu(l2_table[0]) & mask;
|
||||
uint64_t mask = stop_flags | L2E_OFFSET_MASK | QCOW_OFLAG_COMPRESSED;
|
||||
uint64_t first_entry = be64_to_cpu(l2_table[0]);
|
||||
uint64_t offset = first_entry & mask;
|
||||
|
||||
if (!offset)
|
||||
return 0;
|
||||
|
||||
assert(qcow2_get_cluster_type(first_entry) != QCOW2_CLUSTER_COMPRESSED);
|
||||
|
||||
for (i = start; i < start + nb_clusters; i++) {
|
||||
uint64_t l2_entry = be64_to_cpu(l2_table[i]) & mask;
|
||||
if (offset + (uint64_t) i * cluster_size != l2_entry) {
|
||||
|
||||
+20
-16
@@ -1285,7 +1285,7 @@ static int qcow2_create2(const char *filename, int64_t total_size,
|
||||
* size for any qcow2 image.
|
||||
*/
|
||||
BlockDriverState* bs;
|
||||
QCowHeader header;
|
||||
QCowHeader *header;
|
||||
uint8_t* refcount_table;
|
||||
int ret;
|
||||
|
||||
@@ -1300,30 +1300,34 @@ static int qcow2_create2(const char *filename, int64_t total_size,
|
||||
}
|
||||
|
||||
/* Write the header */
|
||||
memset(&header, 0, sizeof(header));
|
||||
header.magic = cpu_to_be32(QCOW_MAGIC);
|
||||
header.version = cpu_to_be32(version);
|
||||
header.cluster_bits = cpu_to_be32(cluster_bits);
|
||||
header.size = cpu_to_be64(0);
|
||||
header.l1_table_offset = cpu_to_be64(0);
|
||||
header.l1_size = cpu_to_be32(0);
|
||||
header.refcount_table_offset = cpu_to_be64(cluster_size);
|
||||
header.refcount_table_clusters = cpu_to_be32(1);
|
||||
header.refcount_order = cpu_to_be32(3 + REFCOUNT_SHIFT);
|
||||
header.header_length = cpu_to_be32(sizeof(header));
|
||||
QEMU_BUILD_BUG_ON((1 << MIN_CLUSTER_BITS) < sizeof(*header));
|
||||
header = g_malloc0(cluster_size);
|
||||
*header = (QCowHeader) {
|
||||
.magic = cpu_to_be32(QCOW_MAGIC),
|
||||
.version = cpu_to_be32(version),
|
||||
.cluster_bits = cpu_to_be32(cluster_bits),
|
||||
.size = cpu_to_be64(0),
|
||||
.l1_table_offset = cpu_to_be64(0),
|
||||
.l1_size = cpu_to_be32(0),
|
||||
.refcount_table_offset = cpu_to_be64(cluster_size),
|
||||
.refcount_table_clusters = cpu_to_be32(1),
|
||||
.refcount_order = cpu_to_be32(3 + REFCOUNT_SHIFT),
|
||||
.header_length = cpu_to_be32(sizeof(*header)),
|
||||
};
|
||||
|
||||
if (flags & BLOCK_FLAG_ENCRYPT) {
|
||||
header.crypt_method = cpu_to_be32(QCOW_CRYPT_AES);
|
||||
header->crypt_method = cpu_to_be32(QCOW_CRYPT_AES);
|
||||
} else {
|
||||
header.crypt_method = cpu_to_be32(QCOW_CRYPT_NONE);
|
||||
header->crypt_method = cpu_to_be32(QCOW_CRYPT_NONE);
|
||||
}
|
||||
|
||||
if (flags & BLOCK_FLAG_LAZY_REFCOUNTS) {
|
||||
header.compatible_features |=
|
||||
header->compatible_features |=
|
||||
cpu_to_be64(QCOW2_COMPAT_LAZY_REFCOUNTS);
|
||||
}
|
||||
|
||||
ret = bdrv_pwrite(bs, 0, &header, sizeof(header));
|
||||
ret = bdrv_pwrite(bs, 0, header, cluster_size);
|
||||
g_free(header);
|
||||
if (ret < 0) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
+41
-25
@@ -755,10 +755,13 @@ static int vmdk_parse_extents(const char *desc, BlockDriverState *bs,
|
||||
}
|
||||
next_line:
|
||||
/* move to next line */
|
||||
while (*p && *p != '\n') {
|
||||
while (*p) {
|
||||
if (*p == '\n') {
|
||||
p++;
|
||||
break;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -1535,7 +1538,7 @@ static int filename_decompose(const char *filename, char *path, char *prefix,
|
||||
static int vmdk_create(const char *filename, QEMUOptionParameter *options)
|
||||
{
|
||||
int fd, idx = 0;
|
||||
char desc[BUF_SIZE];
|
||||
char *desc = NULL;
|
||||
int64_t total_size = 0, filesize;
|
||||
const char *adapter_type = NULL;
|
||||
const char *backing_file = NULL;
|
||||
@@ -1543,7 +1546,7 @@ static int vmdk_create(const char *filename, QEMUOptionParameter *options)
|
||||
int flags = 0;
|
||||
int ret = 0;
|
||||
bool flat, split, compress;
|
||||
char ext_desc_lines[BUF_SIZE] = "";
|
||||
GString *ext_desc_lines;
|
||||
char path[PATH_MAX], prefix[PATH_MAX], postfix[PATH_MAX];
|
||||
const int64_t split_size = 0x80000000; /* VMDK has constant split size */
|
||||
const char *desc_extent_line;
|
||||
@@ -1571,8 +1574,11 @@ static int vmdk_create(const char *filename, QEMUOptionParameter *options)
|
||||
"ddb.geometry.sectors = \"63\"\n"
|
||||
"ddb.adapterType = \"%s\"\n";
|
||||
|
||||
ext_desc_lines = g_string_new(NULL);
|
||||
|
||||
if (filename_decompose(filename, path, prefix, postfix, PATH_MAX)) {
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto exit;
|
||||
}
|
||||
/* Read out options */
|
||||
while (options && options->name) {
|
||||
@@ -1598,7 +1604,8 @@ static int vmdk_create(const char *filename, QEMUOptionParameter *options)
|
||||
strcmp(adapter_type, "lsilogic") &&
|
||||
strcmp(adapter_type, "legacyESX")) {
|
||||
fprintf(stderr, "VMDK: Unknown adapter type: '%s'.\n", adapter_type);
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto exit;
|
||||
}
|
||||
if (strcmp(adapter_type, "ide") != 0) {
|
||||
/* that's the number of heads with which vmware operates when
|
||||
@@ -1614,7 +1621,8 @@ static int vmdk_create(const char *filename, QEMUOptionParameter *options)
|
||||
strcmp(fmt, "twoGbMaxExtentFlat") &&
|
||||
strcmp(fmt, "streamOptimized")) {
|
||||
fprintf(stderr, "VMDK: Unknown subformat: %s\n", fmt);
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto exit;
|
||||
}
|
||||
split = !(strcmp(fmt, "twoGbMaxExtentFlat") &&
|
||||
strcmp(fmt, "twoGbMaxExtentSparse"));
|
||||
@@ -1628,18 +1636,20 @@ static int vmdk_create(const char *filename, QEMUOptionParameter *options)
|
||||
}
|
||||
if (flat && backing_file) {
|
||||
/* not supporting backing file for flat image */
|
||||
return -ENOTSUP;
|
||||
ret = -ENOTSUP;
|
||||
goto exit;
|
||||
}
|
||||
if (backing_file) {
|
||||
BlockDriverState *bs = bdrv_new("");
|
||||
ret = bdrv_open(bs, backing_file, NULL, 0, NULL);
|
||||
if (ret != 0) {
|
||||
bdrv_delete(bs);
|
||||
return ret;
|
||||
goto exit;
|
||||
}
|
||||
if (strcmp(bs->drv->format_name, "vmdk")) {
|
||||
bdrv_delete(bs);
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto exit;
|
||||
}
|
||||
parent_cid = vmdk_read_cid(bs, 0);
|
||||
bdrv_delete(bs);
|
||||
@@ -1673,25 +1683,27 @@ static int vmdk_create(const char *filename, QEMUOptionParameter *options)
|
||||
|
||||
if (vmdk_create_extent(ext_filename, size,
|
||||
flat, compress, zeroed_grain)) {
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto exit;
|
||||
}
|
||||
filesize -= size;
|
||||
|
||||
/* Format description line */
|
||||
snprintf(desc_line, sizeof(desc_line),
|
||||
desc_extent_line, size / 512, desc_filename);
|
||||
pstrcat(ext_desc_lines, sizeof(ext_desc_lines), desc_line);
|
||||
g_string_append(ext_desc_lines, desc_line);
|
||||
}
|
||||
/* generate descriptor file */
|
||||
snprintf(desc, sizeof(desc), desc_template,
|
||||
(unsigned int)time(NULL),
|
||||
parent_cid,
|
||||
fmt,
|
||||
parent_desc_line,
|
||||
ext_desc_lines,
|
||||
(flags & BLOCK_FLAG_COMPAT6 ? 6 : 4),
|
||||
total_size / (int64_t)(63 * number_heads * 512), number_heads,
|
||||
adapter_type);
|
||||
desc = g_strdup_printf(desc_template,
|
||||
(unsigned int)time(NULL),
|
||||
parent_cid,
|
||||
fmt,
|
||||
parent_desc_line,
|
||||
ext_desc_lines->str,
|
||||
(flags & BLOCK_FLAG_COMPAT6 ? 6 : 4),
|
||||
total_size / (int64_t)(63 * number_heads * 512),
|
||||
number_heads,
|
||||
adapter_type);
|
||||
if (split || flat) {
|
||||
fd = qemu_open(filename,
|
||||
O_WRONLY | O_CREAT | O_TRUNC | O_BINARY | O_LARGEFILE,
|
||||
@@ -1702,21 +1714,25 @@ static int vmdk_create(const char *filename, QEMUOptionParameter *options)
|
||||
0644);
|
||||
}
|
||||
if (fd < 0) {
|
||||
return -errno;
|
||||
ret = -errno;
|
||||
goto exit;
|
||||
}
|
||||
/* the descriptor offset = 0x200 */
|
||||
if (!split && !flat && 0x200 != lseek(fd, 0x200, SEEK_SET)) {
|
||||
ret = -errno;
|
||||
goto exit;
|
||||
goto close_exit;
|
||||
}
|
||||
ret = qemu_write_full(fd, desc, strlen(desc));
|
||||
if (ret != strlen(desc)) {
|
||||
ret = -errno;
|
||||
goto exit;
|
||||
goto close_exit;
|
||||
}
|
||||
ret = 0;
|
||||
exit:
|
||||
close_exit:
|
||||
qemu_close(fd);
|
||||
exit:
|
||||
g_free(desc);
|
||||
g_string_free(ext_desc_lines, true);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -298,6 +298,9 @@ query_pkg_config() {
|
||||
pkg_config=query_pkg_config
|
||||
sdl_config="${SDL_CONFIG-${cross_prefix}sdl-config}"
|
||||
|
||||
# If the user hasn't specified ARFLAGS, default to 'rv', just as make does.
|
||||
ARFLAGS="${ARFLAGS-rv}"
|
||||
|
||||
# default flags for all hosts
|
||||
QEMU_CFLAGS="-fno-strict-aliasing $QEMU_CFLAGS"
|
||||
QEMU_CFLAGS="-Wall -Wundef -Wwrite-strings -Wmissing-prototypes $QEMU_CFLAGS"
|
||||
@@ -1394,39 +1397,27 @@ feature_not_found() {
|
||||
"configure was not able to find it"
|
||||
}
|
||||
|
||||
if test -z "$cross_prefix" ; then
|
||||
|
||||
# ---
|
||||
# big/little endian test
|
||||
cat > $TMPC << EOF
|
||||
#include <inttypes.h>
|
||||
int main(void) {
|
||||
volatile uint32_t i=0x01234567;
|
||||
return (*((uint8_t*)(&i))) == 0x67;
|
||||
short big_endian[] = { 0x4269, 0x4765, 0x4e64, 0x4961, 0x4e00, 0, };
|
||||
short little_endian[] = { 0x694c, 0x7454, 0x654c, 0x6e45, 0x6944, 0x6e41, 0, };
|
||||
extern int foo(short *, short *);
|
||||
int main(int argc, char *argv[]) {
|
||||
return foo(big_endian, little_endian);
|
||||
}
|
||||
EOF
|
||||
|
||||
if compile_prog "" "" ; then
|
||||
$TMPE && bigendian="yes"
|
||||
else
|
||||
echo big/little test failed
|
||||
fi
|
||||
|
||||
else
|
||||
|
||||
# if cross compiling, cannot launch a program, so make a static guess
|
||||
case "$cpu" in
|
||||
arm)
|
||||
# ARM can be either way; ask the compiler which one we are
|
||||
if check_define __ARMEB__; then
|
||||
bigendian=yes
|
||||
if compile_object ; then
|
||||
if grep -q BiGeNdIaN $TMPO ; then
|
||||
bigendian="yes"
|
||||
elif grep -q LiTtLeEnDiAn $TMPO ; then
|
||||
bigendian="no"
|
||||
else
|
||||
echo big/little test failed
|
||||
fi
|
||||
;;
|
||||
hppa|m68k|mips|mips64|ppc|ppc64|s390|s390x|sparc|sparc64)
|
||||
bigendian=yes
|
||||
;;
|
||||
esac
|
||||
|
||||
else
|
||||
echo big/little test failed
|
||||
fi
|
||||
|
||||
##########################################
|
||||
@@ -3541,6 +3532,7 @@ echo "Source path $source_path"
|
||||
echo "C compiler $cc"
|
||||
echo "Host C compiler $host_cc"
|
||||
echo "Objective-C compiler $objcc"
|
||||
echo "ARFLAGS $ARFLAGS"
|
||||
echo "CFLAGS $CFLAGS"
|
||||
echo "QEMU_CFLAGS $QEMU_CFLAGS"
|
||||
echo "LDFLAGS $LDFLAGS"
|
||||
@@ -4129,6 +4121,7 @@ echo "CC_I386=$cc_i386" >> $config_host_mak
|
||||
echo "HOST_CC=$host_cc" >> $config_host_mak
|
||||
echo "OBJCC=$objcc" >> $config_host_mak
|
||||
echo "AR=$ar" >> $config_host_mak
|
||||
echo "ARFLAGS=$ARFLAGS" >> $config_host_mak
|
||||
echo "AS=$as" >> $config_host_mak
|
||||
echo "CPP=$cpp" >> $config_host_mak
|
||||
echo "OBJCOPY=$objcopy" >> $config_host_mak
|
||||
|
||||
@@ -425,8 +425,10 @@ static void breakpoint_invalidate(CPUState *cpu, target_ulong pc)
|
||||
#else
|
||||
static void breakpoint_invalidate(CPUState *cpu, target_ulong pc)
|
||||
{
|
||||
tb_invalidate_phys_addr(cpu_get_phys_page_debug(cpu, pc) |
|
||||
(pc & ~TARGET_PAGE_MASK));
|
||||
hwaddr phys = cpu_get_phys_page_debug(cpu, pc);
|
||||
if (phys != -1) {
|
||||
tb_invalidate_phys_addr(phys | (pc & ~TARGET_PAGE_MASK));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif /* TARGET_HAS_ICE */
|
||||
|
||||
@@ -405,6 +405,7 @@ static int ioreq_map(struct ioreq *ioreq)
|
||||
xen_be_printf(&ioreq->blkdev->xendev, 0,
|
||||
"can't map grant ref %d (%s, %d maps)\n",
|
||||
refs[i], strerror(errno), ioreq->blkdev->cnt_map);
|
||||
ioreq->mapped = 1;
|
||||
ioreq_unmap(ioreq);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -873,8 +873,20 @@ static void vfio_disable_msi_common(VFIODevice *vdev)
|
||||
|
||||
static void vfio_disable_msix(VFIODevice *vdev)
|
||||
{
|
||||
int i;
|
||||
|
||||
msix_unset_vector_notifiers(&vdev->pdev);
|
||||
|
||||
/*
|
||||
* MSI-X will only release vectors if MSI-X is still enabled on the
|
||||
* device, check through the rest and release it ourselves if necessary.
|
||||
*/
|
||||
for (i = 0; i < vdev->nr_vectors; i++) {
|
||||
if (vdev->msi_vectors[i].use) {
|
||||
vfio_msix_vector_release(&vdev->pdev, i);
|
||||
}
|
||||
}
|
||||
|
||||
if (vdev->nr_vectors) {
|
||||
vfio_disable_irqindex(vdev, VFIO_PCI_MSIX_IRQ_INDEX);
|
||||
}
|
||||
@@ -3142,6 +3154,13 @@ static int vfio_initfn(PCIDevice *pdev)
|
||||
vdev->emulated_config_bits[PCI_HEADER_TYPE] =
|
||||
PCI_HEADER_TYPE_MULTI_FUNCTION;
|
||||
|
||||
/* Restore or clear multifunction, this is always controlled by QEMU */
|
||||
if (vdev->pdev.cap_present & QEMU_PCI_CAP_MULTIFUNCTION) {
|
||||
vdev->pdev.config[PCI_HEADER_TYPE] |= PCI_HEADER_TYPE_MULTI_FUNCTION;
|
||||
} else {
|
||||
vdev->pdev.config[PCI_HEADER_TYPE] &= ~PCI_HEADER_TYPE_MULTI_FUNCTION;
|
||||
}
|
||||
|
||||
/*
|
||||
* Clear host resource mapping info. If we choose not to register a
|
||||
* BAR, such as might be the case with the option ROM, we can get
|
||||
|
||||
+5
-5
@@ -200,16 +200,16 @@ static void rxfilter_notify(NetClientState *nc)
|
||||
VirtIONet *n = qemu_get_nic_opaque(nc);
|
||||
|
||||
if (nc->rxfilter_notify_enabled) {
|
||||
gchar *path = object_get_canonical_path(OBJECT(n->qdev));
|
||||
if (n->netclient_name) {
|
||||
event_data = qobject_from_jsonf("{ 'name': %s, 'path': %s }",
|
||||
n->netclient_name,
|
||||
object_get_canonical_path(OBJECT(n->qdev)));
|
||||
n->netclient_name, path);
|
||||
} else {
|
||||
event_data = qobject_from_jsonf("{ 'path': %s }",
|
||||
object_get_canonical_path(OBJECT(n->qdev)));
|
||||
event_data = qobject_from_jsonf("{ 'path': %s }", path);
|
||||
}
|
||||
monitor_protocol_event(QEVENT_NIC_RX_FILTER_CHANGED, event_data);
|
||||
qobject_decref(event_data);
|
||||
g_free(path);
|
||||
|
||||
/* disable event notification to avoid events flooding */
|
||||
nc->rxfilter_notify_enabled = 0;
|
||||
@@ -1600,7 +1600,7 @@ static int virtio_net_device_exit(DeviceState *qdev)
|
||||
if (q->tx_timer) {
|
||||
qemu_del_timer(q->tx_timer);
|
||||
qemu_free_timer(q->tx_timer);
|
||||
} else {
|
||||
} else if (q->tx_bh) {
|
||||
qemu_bh_delete(q->tx_bh);
|
||||
}
|
||||
}
|
||||
|
||||
+8
-1
@@ -48,6 +48,7 @@ typedef struct I440FXState {
|
||||
PCIHostState parent_obj;
|
||||
PcPciInfo pci_info;
|
||||
uint64_t pci_hole64_size;
|
||||
uint32_t short_root_bus;
|
||||
} I440FXState;
|
||||
|
||||
#define PIIX_NUM_PIC_IRQS 16 /* i8259 * 2 */
|
||||
@@ -706,13 +707,19 @@ static const TypeInfo i440fx_info = {
|
||||
static const char *i440fx_pcihost_root_bus_path(PCIHostState *host_bridge,
|
||||
PCIBus *rootbus)
|
||||
{
|
||||
I440FXState *s = I440FX_PCI_HOST_BRIDGE(host_bridge);
|
||||
|
||||
/* For backwards compat with old device paths */
|
||||
return "0000";
|
||||
if (s->short_root_bus) {
|
||||
return "0000";
|
||||
}
|
||||
return "0000:00";
|
||||
}
|
||||
|
||||
static Property i440fx_props[] = {
|
||||
DEFINE_PROP_SIZE(PCI_HOST_PROP_PCI_HOLE64_SIZE, I440FXState,
|
||||
pci_hole64_size, DEFAULT_PCI_HOLE64_SIZE),
|
||||
DEFINE_PROP_UINT32("short_root_bus", I440FXState, short_root_bus, 1),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
|
||||
+8
-2
@@ -61,8 +61,13 @@ static void q35_host_realize(DeviceState *dev, Error **errp)
|
||||
static const char *q35_host_root_bus_path(PCIHostState *host_bridge,
|
||||
PCIBus *rootbus)
|
||||
{
|
||||
/* For backwards compat with old device paths */
|
||||
return "0000";
|
||||
Q35PCIHost *s = Q35_HOST_DEVICE(host_bridge);
|
||||
|
||||
/* For backwards compat with old device paths */
|
||||
if (s->mch.short_root_bus) {
|
||||
return "0000";
|
||||
}
|
||||
return "0000:00";
|
||||
}
|
||||
|
||||
static void q35_host_get_pci_hole_start(Object *obj, Visitor *v,
|
||||
@@ -108,6 +113,7 @@ static Property mch_props[] = {
|
||||
MCH_HOST_BRIDGE_PCIEXBAR_DEFAULT),
|
||||
DEFINE_PROP_SIZE(PCI_HOST_PROP_PCI_HOLE64_SIZE, Q35PCIHost,
|
||||
mch.pci_hole64_size, DEFAULT_PCI_HOLE64_SIZE),
|
||||
DEFINE_PROP_UINT32("short_root_bus", Q35PCIHost, mch.short_root_bus, 1),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
|
||||
@@ -47,6 +47,7 @@ static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent);
|
||||
static char *pcibus_get_dev_path(DeviceState *dev);
|
||||
static char *pcibus_get_fw_dev_path(DeviceState *dev);
|
||||
static int pcibus_reset(BusState *qbus);
|
||||
static void pci_bus_finalize(Object *obj);
|
||||
|
||||
static Property pci_props[] = {
|
||||
DEFINE_PROP_PCI_DEVFN("addr", PCIDevice, devfn, -1),
|
||||
@@ -73,6 +74,7 @@ static const TypeInfo pci_bus_info = {
|
||||
.name = TYPE_PCI_BUS,
|
||||
.parent = TYPE_BUS,
|
||||
.instance_size = sizeof(PCIBus),
|
||||
.instance_finalize = pci_bus_finalize,
|
||||
.class_init = pci_bus_class_init,
|
||||
};
|
||||
|
||||
@@ -375,6 +377,12 @@ int pci_bus_num(PCIBus *s)
|
||||
return s->parent_dev->config[PCI_SECONDARY_BUS];
|
||||
}
|
||||
|
||||
static void pci_bus_finalize(Object *obj)
|
||||
{
|
||||
PCIBus *bus = PCI_BUS(obj);
|
||||
vmstate_unregister(NULL, &vmstate_pcibus, bus);
|
||||
}
|
||||
|
||||
static int get_pci_config_device(QEMUFile *f, void *pv, size_t size)
|
||||
{
|
||||
PCIDevice *s = container_of(pv, PCIDevice, config);
|
||||
|
||||
+2
-1
@@ -460,7 +460,8 @@ static int32_t scsi_target_send_command(SCSIRequest *req, uint8_t *buf)
|
||||
break;
|
||||
case REQUEST_SENSE:
|
||||
scsi_target_alloc_buf(&r->req, SCSI_SENSE_LEN);
|
||||
r->len = scsi_device_get_sense(r->req.dev, r->buf, r->buf_len,
|
||||
r->len = scsi_device_get_sense(r->req.dev, r->buf,
|
||||
MIN(req->cmd.xfer, r->buf_len),
|
||||
(req->cmd.buf[1] & 1) == 0);
|
||||
if (r->req.dev->sense_is_ua) {
|
||||
scsi_device_unit_attention_reported(req->dev);
|
||||
|
||||
@@ -258,6 +258,14 @@ int e820_add_entry(uint64_t, uint64_t, uint32_t);
|
||||
.driver = TYPE_X86_CPU,\
|
||||
.property = "pmu",\
|
||||
.value = "on",\
|
||||
},{\
|
||||
.driver = "i440FX-pcihost",\
|
||||
.property = "short_root_bus",\
|
||||
.value = stringify(0),\
|
||||
},{\
|
||||
.driver = "q35-pcihost",\
|
||||
.property = "short_root_bus",\
|
||||
.value = stringify(0),\
|
||||
}
|
||||
|
||||
#define PC_COMPAT_1_4 \
|
||||
|
||||
@@ -61,6 +61,7 @@ typedef struct MCHPCIState {
|
||||
ram_addr_t above_4g_mem_size;
|
||||
uint64_t pci_hole64_size;
|
||||
PcGuestInfo *guest_info;
|
||||
uint32_t short_root_bus;
|
||||
} MCHPCIState;
|
||||
|
||||
typedef struct Q35PCIHost {
|
||||
|
||||
@@ -183,6 +183,86 @@ static inline unsigned long hweight_long(unsigned long w)
|
||||
return count;
|
||||
}
|
||||
|
||||
/**
|
||||
* rol8 - rotate an 8-bit value left
|
||||
* @word: value to rotate
|
||||
* @shift: bits to roll
|
||||
*/
|
||||
static inline uint8_t rol8(uint8_t word, unsigned int shift)
|
||||
{
|
||||
return (word << shift) | (word >> (8 - shift));
|
||||
}
|
||||
|
||||
/**
|
||||
* ror8 - rotate an 8-bit value right
|
||||
* @word: value to rotate
|
||||
* @shift: bits to roll
|
||||
*/
|
||||
static inline uint8_t ror8(uint8_t word, unsigned int shift)
|
||||
{
|
||||
return (word >> shift) | (word << (8 - shift));
|
||||
}
|
||||
|
||||
/**
|
||||
* rol16 - rotate a 16-bit value left
|
||||
* @word: value to rotate
|
||||
* @shift: bits to roll
|
||||
*/
|
||||
static inline uint16_t rol16(uint16_t word, unsigned int shift)
|
||||
{
|
||||
return (word << shift) | (word >> (16 - shift));
|
||||
}
|
||||
|
||||
/**
|
||||
* ror16 - rotate a 16-bit value right
|
||||
* @word: value to rotate
|
||||
* @shift: bits to roll
|
||||
*/
|
||||
static inline uint16_t ror16(uint16_t word, unsigned int shift)
|
||||
{
|
||||
return (word >> shift) | (word << (16 - shift));
|
||||
}
|
||||
|
||||
/**
|
||||
* rol32 - rotate a 32-bit value left
|
||||
* @word: value to rotate
|
||||
* @shift: bits to roll
|
||||
*/
|
||||
static inline uint32_t rol32(uint32_t word, unsigned int shift)
|
||||
{
|
||||
return (word << shift) | (word >> (32 - shift));
|
||||
}
|
||||
|
||||
/**
|
||||
* ror32 - rotate a 32-bit value right
|
||||
* @word: value to rotate
|
||||
* @shift: bits to roll
|
||||
*/
|
||||
static inline uint32_t ror32(uint32_t word, unsigned int shift)
|
||||
{
|
||||
return (word >> shift) | (word << (32 - shift));
|
||||
}
|
||||
|
||||
/**
|
||||
* rol64 - rotate a 64-bit value left
|
||||
* @word: value to rotate
|
||||
* @shift: bits to roll
|
||||
*/
|
||||
static inline uint64_t rol64(uint64_t word, unsigned int shift)
|
||||
{
|
||||
return (word << shift) | (word >> (64 - shift));
|
||||
}
|
||||
|
||||
/**
|
||||
* ror64 - rotate a 64-bit value right
|
||||
* @word: value to rotate
|
||||
* @shift: bits to roll
|
||||
*/
|
||||
static inline uint64_t ror64(uint64_t word, unsigned int shift)
|
||||
{
|
||||
return (word >> shift) | (word << (64 - shift));
|
||||
}
|
||||
|
||||
/**
|
||||
* extract32:
|
||||
* @value: the value to extract the bit field from
|
||||
|
||||
@@ -78,6 +78,7 @@ struct CharDriverState {
|
||||
int explicit_be_open;
|
||||
int avail_connections;
|
||||
int is_mux;
|
||||
guint fd_in_tag;
|
||||
QemuOpts *opts;
|
||||
QTAILQ_ENTRY(CharDriverState) next;
|
||||
};
|
||||
|
||||
@@ -4764,10 +4764,10 @@ static inline abi_long host_to_target_stat64(void *cpu_env,
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
#if TARGET_ABI_BITS == 64 && !defined(TARGET_ALPHA)
|
||||
struct target_stat *target_st;
|
||||
#else
|
||||
#if defined(TARGET_HAS_STRUCT_STAT64)
|
||||
struct target_stat64 *target_st;
|
||||
#else
|
||||
struct target_stat *target_st;
|
||||
#endif
|
||||
|
||||
if (!lock_user_struct(VERIFY_WRITE, target_st, target_addr, 0))
|
||||
|
||||
@@ -1165,6 +1165,7 @@ struct target_stat {
|
||||
/* This matches struct stat64 in glibc2.1, hence the absolutely
|
||||
* insane amounts of padding around dev_t's.
|
||||
*/
|
||||
#define TARGET_HAS_STRUCT_STAT64
|
||||
struct target_stat64 {
|
||||
unsigned short st_dev;
|
||||
unsigned char __pad0[10];
|
||||
@@ -1200,6 +1201,7 @@ struct target_stat64 {
|
||||
} QEMU_PACKED;
|
||||
|
||||
#ifdef TARGET_ARM
|
||||
#define TARGET_HAS_STRUCT_STAT64
|
||||
struct target_eabi_stat64 {
|
||||
unsigned long long st_dev;
|
||||
unsigned int __pad1;
|
||||
@@ -1249,6 +1251,7 @@ struct target_stat {
|
||||
abi_ulong __unused4[2];
|
||||
};
|
||||
|
||||
#define TARGET_HAS_STRUCT_STAT64
|
||||
struct target_stat64 {
|
||||
unsigned char __pad0[6];
|
||||
unsigned short st_dev;
|
||||
@@ -1304,6 +1307,7 @@ struct target_stat {
|
||||
abi_ulong __unused4[2];
|
||||
};
|
||||
|
||||
#define TARGET_HAS_STRUCT_STAT64
|
||||
struct target_stat64 {
|
||||
unsigned char __pad0[6];
|
||||
unsigned short st_dev;
|
||||
@@ -1371,6 +1375,8 @@ struct target_stat {
|
||||
#endif
|
||||
};
|
||||
|
||||
#if !defined(TARGET_PPC64) || defined(TARGET_ABI32)
|
||||
#define TARGET_HAS_STRUCT_STAT64
|
||||
struct QEMU_PACKED target_stat64 {
|
||||
unsigned long long st_dev;
|
||||
unsigned long long st_ino;
|
||||
@@ -1393,6 +1399,7 @@ struct QEMU_PACKED target_stat64 {
|
||||
unsigned int __unused4;
|
||||
unsigned int __unused5;
|
||||
};
|
||||
#endif
|
||||
|
||||
#elif defined(TARGET_MICROBLAZE)
|
||||
|
||||
@@ -1418,6 +1425,7 @@ struct target_stat {
|
||||
};
|
||||
|
||||
/* FIXME: Microblaze no-mmu user-space has a difference stat64 layout... */
|
||||
#define TARGET_HAS_STRUCT_STAT64
|
||||
struct QEMU_PACKED target_stat64 {
|
||||
uint64_t st_dev;
|
||||
#define TARGET_STAT64_HAS_BROKEN_ST_INO 1
|
||||
@@ -1473,6 +1481,7 @@ struct target_stat {
|
||||
/* This matches struct stat64 in glibc2.1, hence the absolutely
|
||||
* insane amounts of padding around dev_t's.
|
||||
*/
|
||||
#define TARGET_HAS_STRUCT_STAT64
|
||||
struct target_stat64 {
|
||||
unsigned long long st_dev;
|
||||
unsigned char __pad1[2];
|
||||
@@ -1581,6 +1590,7 @@ struct target_stat {
|
||||
* struct stat of the 64-bit kernel.
|
||||
*/
|
||||
|
||||
#define TARGET_HAS_STRUCT_STAT64
|
||||
struct target_stat64 {
|
||||
unsigned int st_dev;
|
||||
unsigned int st_pad0[3]; /* Reserved for st_dev expansion */
|
||||
@@ -1652,6 +1662,7 @@ struct target_stat {
|
||||
* struct stat of the 64-bit kernel.
|
||||
*/
|
||||
|
||||
#define TARGET_HAS_STRUCT_STAT64
|
||||
struct target_stat64 {
|
||||
abi_ulong st_dev;
|
||||
abi_ulong st_pad0[3]; /* Reserved for st_dev expansion */
|
||||
@@ -1708,6 +1719,7 @@ struct target_stat {
|
||||
unsigned int st_gen;
|
||||
};
|
||||
|
||||
#define TARGET_HAS_STRUCT_STAT64
|
||||
struct target_stat64 {
|
||||
abi_ulong st_dev;
|
||||
abi_ulong st_ino;
|
||||
@@ -1757,6 +1769,7 @@ struct target_stat {
|
||||
/* This matches struct stat64 in glibc2.1, hence the absolutely
|
||||
* insane amounts of padding around dev_t's.
|
||||
*/
|
||||
#define TARGET_HAS_STRUCT_STAT64
|
||||
struct QEMU_PACKED target_stat64 {
|
||||
unsigned long long st_dev;
|
||||
unsigned char __pad0[4];
|
||||
@@ -1862,6 +1875,7 @@ struct target_stat {
|
||||
unsigned int __unused5;
|
||||
};
|
||||
|
||||
#define TARGET_HAS_STRUCT_STAT64
|
||||
struct target_stat64 {
|
||||
uint64_t st_dev;
|
||||
uint64_t st_ino;
|
||||
|
||||
@@ -1809,7 +1809,9 @@ static void mtree_print_mr(fprintf_function mon_printf, void *f,
|
||||
mr->alias->name,
|
||||
mr->alias_offset,
|
||||
mr->alias_offset
|
||||
+ (hwaddr)int128_get64(mr->size) - 1);
|
||||
+ (int128_nz(mr->size) ?
|
||||
(hwaddr)int128_get64(int128_sub(mr->size,
|
||||
int128_one())) : 0));
|
||||
} else {
|
||||
mon_printf(f,
|
||||
TARGET_FMT_plx "-" TARGET_FMT_plx " (prio %d, %c%c): %s\n",
|
||||
|
||||
@@ -508,7 +508,6 @@ static const char *monitor_event_names[] = {
|
||||
QEMU_BUILD_BUG_ON(ARRAY_SIZE(monitor_event_names) != QEVENT_MAX)
|
||||
|
||||
MonitorEventState monitor_event_state[QEVENT_MAX];
|
||||
QemuMutex monitor_event_state_lock;
|
||||
|
||||
/*
|
||||
* Emits the event to every monitor instance
|
||||
@@ -540,7 +539,6 @@ monitor_protocol_event_queue(MonitorEvent event,
|
||||
int64_t now = qemu_get_clock_ns(rt_clock);
|
||||
assert(event < QEVENT_MAX);
|
||||
|
||||
qemu_mutex_lock(&monitor_event_state_lock);
|
||||
evstate = &(monitor_event_state[event]);
|
||||
trace_monitor_protocol_event_queue(event,
|
||||
data,
|
||||
@@ -573,7 +571,6 @@ monitor_protocol_event_queue(MonitorEvent event,
|
||||
evstate->last = now;
|
||||
}
|
||||
}
|
||||
qemu_mutex_unlock(&monitor_event_state_lock);
|
||||
}
|
||||
|
||||
|
||||
@@ -586,7 +583,6 @@ static void monitor_protocol_event_handler(void *opaque)
|
||||
MonitorEventState *evstate = opaque;
|
||||
int64_t now = qemu_get_clock_ns(rt_clock);
|
||||
|
||||
qemu_mutex_lock(&monitor_event_state_lock);
|
||||
|
||||
trace_monitor_protocol_event_handler(evstate->event,
|
||||
evstate->data,
|
||||
@@ -598,7 +594,6 @@ static void monitor_protocol_event_handler(void *opaque)
|
||||
evstate->data = NULL;
|
||||
}
|
||||
evstate->last = now;
|
||||
qemu_mutex_unlock(&monitor_event_state_lock);
|
||||
}
|
||||
|
||||
|
||||
@@ -635,7 +630,6 @@ monitor_protocol_event_throttle(MonitorEvent event,
|
||||
* and initialize state */
|
||||
static void monitor_protocol_event_init(void)
|
||||
{
|
||||
qemu_mutex_init(&monitor_event_state_lock);
|
||||
/* Limit RTC & BALLOON events to 1 per second */
|
||||
monitor_protocol_event_throttle(QEVENT_RTC_CHANGE, 1000);
|
||||
monitor_protocol_event_throttle(QEVENT_BALLOON_CHANGE, 1000);
|
||||
|
||||
@@ -76,6 +76,24 @@ static void qapi_dealloc_end_struct(Visitor *v, Error **errp)
|
||||
}
|
||||
}
|
||||
|
||||
static void qapi_dealloc_start_implicit_struct(Visitor *v,
|
||||
void **obj,
|
||||
size_t size,
|
||||
Error **errp)
|
||||
{
|
||||
QapiDeallocVisitor *qov = to_qov(v);
|
||||
qapi_dealloc_push(qov, obj);
|
||||
}
|
||||
|
||||
static void qapi_dealloc_end_implicit_struct(Visitor *v, Error **errp)
|
||||
{
|
||||
QapiDeallocVisitor *qov = to_qov(v);
|
||||
void **obj = qapi_dealloc_pop(qov);
|
||||
if (obj) {
|
||||
g_free(*obj);
|
||||
}
|
||||
}
|
||||
|
||||
static void qapi_dealloc_start_list(Visitor *v, const char *name, Error **errp)
|
||||
{
|
||||
QapiDeallocVisitor *qov = to_qov(v);
|
||||
@@ -162,6 +180,8 @@ QapiDeallocVisitor *qapi_dealloc_visitor_new(void)
|
||||
|
||||
v->visitor.start_struct = qapi_dealloc_start_struct;
|
||||
v->visitor.end_struct = qapi_dealloc_end_struct;
|
||||
v->visitor.start_implicit_struct = qapi_dealloc_start_implicit_struct;
|
||||
v->visitor.end_implicit_struct = qapi_dealloc_end_implicit_struct;
|
||||
v->visitor.start_list = qapi_dealloc_start_list;
|
||||
v->visitor.next_list = qapi_dealloc_next_list;
|
||||
v->visitor.end_list = qapi_dealloc_end_list;
|
||||
|
||||
@@ -472,6 +472,12 @@ DeviceState *qdev_device_add(QemuOpts *opts)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (object_class_is_abstract(obj)) {
|
||||
qerror_report(QERR_INVALID_PARAMETER_VALUE, "driver",
|
||||
"non-abstract device type");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
k = DEVICE_CLASS(obj);
|
||||
|
||||
/* find bus */
|
||||
@@ -512,6 +518,7 @@ DeviceState *qdev_device_add(QemuOpts *opts)
|
||||
}
|
||||
if (qemu_opt_foreach(opts, set_property, qdev, 1) != 0) {
|
||||
qdev_free(qdev);
|
||||
object_unref(OBJECT(qdev));
|
||||
return NULL;
|
||||
}
|
||||
if (qdev->id) {
|
||||
@@ -525,6 +532,7 @@ DeviceState *qdev_device_add(QemuOpts *opts)
|
||||
g_free(name);
|
||||
}
|
||||
if (qdev_init(qdev) < 0) {
|
||||
object_unref(OBJECT(qdev));
|
||||
qerror_report(QERR_DEVICE_INIT_FAILED, driver);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
+33
-53
@@ -193,6 +193,8 @@ void qemu_chr_fe_printf(CharDriverState *s, const char *fmt, ...)
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
static void remove_fd_in_watch(CharDriverState *chr);
|
||||
|
||||
void qemu_chr_add_handlers(CharDriverState *s,
|
||||
IOCanReadHandler *fd_can_read,
|
||||
IOReadHandler *fd_read,
|
||||
@@ -203,6 +205,7 @@ void qemu_chr_add_handlers(CharDriverState *s,
|
||||
|
||||
if (!opaque && !fd_can_read && !fd_read && !fd_event) {
|
||||
fe_open = 0;
|
||||
remove_fd_in_watch(s);
|
||||
} else {
|
||||
fe_open = 1;
|
||||
}
|
||||
@@ -725,6 +728,14 @@ static void io_remove_watch_poll(guint tag)
|
||||
g_source_destroy(&iwp->parent);
|
||||
}
|
||||
|
||||
static void remove_fd_in_watch(CharDriverState *chr)
|
||||
{
|
||||
if (chr->fd_in_tag) {
|
||||
io_remove_watch_poll(chr->fd_in_tag);
|
||||
chr->fd_in_tag = 0;
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
static GIOChannel *io_channel_from_fd(int fd)
|
||||
{
|
||||
@@ -798,7 +809,6 @@ static int io_channel_send(GIOChannel *fd, const void *buf, size_t len)
|
||||
typedef struct FDCharDriver {
|
||||
CharDriverState *chr;
|
||||
GIOChannel *fd_in, *fd_out;
|
||||
guint fd_in_tag;
|
||||
int max_size;
|
||||
QTAILQ_ENTRY(FDCharDriver) node;
|
||||
} FDCharDriver;
|
||||
@@ -830,10 +840,7 @@ static gboolean fd_chr_read(GIOChannel *chan, GIOCondition cond, void *opaque)
|
||||
status = g_io_channel_read_chars(chan, (gchar *)buf,
|
||||
len, &bytes_read, NULL);
|
||||
if (status == G_IO_STATUS_EOF) {
|
||||
if (s->fd_in_tag) {
|
||||
io_remove_watch_poll(s->fd_in_tag);
|
||||
s->fd_in_tag = 0;
|
||||
}
|
||||
remove_fd_in_watch(chr);
|
||||
qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
|
||||
return FALSE;
|
||||
}
|
||||
@@ -863,13 +870,10 @@ static void fd_chr_update_read_handler(CharDriverState *chr)
|
||||
{
|
||||
FDCharDriver *s = chr->opaque;
|
||||
|
||||
if (s->fd_in_tag) {
|
||||
io_remove_watch_poll(s->fd_in_tag);
|
||||
s->fd_in_tag = 0;
|
||||
}
|
||||
|
||||
remove_fd_in_watch(chr);
|
||||
if (s->fd_in) {
|
||||
s->fd_in_tag = io_add_watch_poll(s->fd_in, fd_chr_read_poll, fd_chr_read, chr);
|
||||
chr->fd_in_tag = io_add_watch_poll(s->fd_in, fd_chr_read_poll,
|
||||
fd_chr_read, chr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -877,11 +881,7 @@ static void fd_chr_close(struct CharDriverState *chr)
|
||||
{
|
||||
FDCharDriver *s = chr->opaque;
|
||||
|
||||
if (s->fd_in_tag) {
|
||||
io_remove_watch_poll(s->fd_in_tag);
|
||||
s->fd_in_tag = 0;
|
||||
}
|
||||
|
||||
remove_fd_in_watch(chr);
|
||||
if (s->fd_in) {
|
||||
g_io_channel_unref(s->fd_in);
|
||||
}
|
||||
@@ -1012,7 +1012,6 @@ static CharDriverState *qemu_chr_open_stdio(ChardevStdio *opts)
|
||||
|
||||
typedef struct {
|
||||
GIOChannel *fd;
|
||||
guint fd_tag;
|
||||
int connected;
|
||||
int read_bytes;
|
||||
guint timer_tag;
|
||||
@@ -1123,10 +1122,7 @@ static void pty_chr_state(CharDriverState *chr, int connected)
|
||||
PtyCharDriver *s = chr->opaque;
|
||||
|
||||
if (!connected) {
|
||||
if (s->fd_tag) {
|
||||
io_remove_watch_poll(s->fd_tag);
|
||||
s->fd_tag = 0;
|
||||
}
|
||||
remove_fd_in_watch(chr);
|
||||
s->connected = 0;
|
||||
/* (re-)connect poll interval for idle guests: once per second.
|
||||
* We check more frequently in case the guests sends data to
|
||||
@@ -1140,7 +1136,8 @@ static void pty_chr_state(CharDriverState *chr, int connected)
|
||||
if (!s->connected) {
|
||||
s->connected = 1;
|
||||
qemu_chr_be_generic_open(chr);
|
||||
s->fd_tag = io_add_watch_poll(s->fd, pty_chr_read_poll, pty_chr_read, chr);
|
||||
chr->fd_in_tag = io_add_watch_poll(s->fd, pty_chr_read_poll,
|
||||
pty_chr_read, chr);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1151,10 +1148,7 @@ static void pty_chr_close(struct CharDriverState *chr)
|
||||
PtyCharDriver *s = chr->opaque;
|
||||
int fd;
|
||||
|
||||
if (s->fd_tag) {
|
||||
io_remove_watch_poll(s->fd_tag);
|
||||
s->fd_tag = 0;
|
||||
}
|
||||
remove_fd_in_watch(chr);
|
||||
fd = g_io_channel_unix_get_fd(s->fd);
|
||||
g_io_channel_unref(s->fd);
|
||||
close(fd);
|
||||
@@ -2161,7 +2155,6 @@ static CharDriverState *qemu_chr_open_stdio(ChardevStdio *opts)
|
||||
typedef struct {
|
||||
int fd;
|
||||
GIOChannel *chan;
|
||||
guint tag;
|
||||
uint8_t buf[READ_BUF_LEN];
|
||||
int bufcnt;
|
||||
int bufptr;
|
||||
@@ -2217,10 +2210,7 @@ static gboolean udp_chr_read(GIOChannel *chan, GIOCondition cond, void *opaque)
|
||||
s->bufcnt = bytes_read;
|
||||
s->bufptr = s->bufcnt;
|
||||
if (status != G_IO_STATUS_NORMAL) {
|
||||
if (s->tag) {
|
||||
io_remove_watch_poll(s->tag);
|
||||
s->tag = 0;
|
||||
}
|
||||
remove_fd_in_watch(chr);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -2238,23 +2228,18 @@ static void udp_chr_update_read_handler(CharDriverState *chr)
|
||||
{
|
||||
NetCharDriver *s = chr->opaque;
|
||||
|
||||
if (s->tag) {
|
||||
io_remove_watch_poll(s->tag);
|
||||
s->tag = 0;
|
||||
}
|
||||
|
||||
remove_fd_in_watch(chr);
|
||||
if (s->chan) {
|
||||
s->tag = io_add_watch_poll(s->chan, udp_chr_read_poll, udp_chr_read, chr);
|
||||
chr->fd_in_tag = io_add_watch_poll(s->chan, udp_chr_read_poll,
|
||||
udp_chr_read, chr);
|
||||
}
|
||||
}
|
||||
|
||||
static void udp_chr_close(CharDriverState *chr)
|
||||
{
|
||||
NetCharDriver *s = chr->opaque;
|
||||
if (s->tag) {
|
||||
io_remove_watch_poll(s->tag);
|
||||
s->tag = 0;
|
||||
}
|
||||
|
||||
remove_fd_in_watch(chr);
|
||||
if (s->chan) {
|
||||
g_io_channel_unref(s->chan);
|
||||
closesocket(s->fd);
|
||||
@@ -2304,7 +2289,7 @@ static CharDriverState *qemu_chr_open_udp(QemuOpts *opts)
|
||||
typedef struct {
|
||||
|
||||
GIOChannel *chan, *listen_chan;
|
||||
guint tag, listen_tag;
|
||||
guint listen_tag;
|
||||
int fd, listen_fd;
|
||||
int connected;
|
||||
int max_size;
|
||||
@@ -2489,10 +2474,7 @@ static gboolean tcp_chr_read(GIOChannel *chan, GIOCondition cond, void *opaque)
|
||||
if (s->listen_chan) {
|
||||
s->listen_tag = g_io_add_watch(s->listen_chan, G_IO_IN, tcp_chr_accept, chr);
|
||||
}
|
||||
if (s->tag) {
|
||||
io_remove_watch_poll(s->tag);
|
||||
s->tag = 0;
|
||||
}
|
||||
remove_fd_in_watch(chr);
|
||||
g_io_channel_unref(s->chan);
|
||||
s->chan = NULL;
|
||||
closesocket(s->fd);
|
||||
@@ -2522,7 +2504,8 @@ static void tcp_chr_connect(void *opaque)
|
||||
|
||||
s->connected = 1;
|
||||
if (s->chan) {
|
||||
s->tag = io_add_watch_poll(s->chan, tcp_chr_read_poll, tcp_chr_read, chr);
|
||||
chr->fd_in_tag = io_add_watch_poll(s->chan, tcp_chr_read_poll,
|
||||
tcp_chr_read, chr);
|
||||
}
|
||||
qemu_chr_be_generic_open(chr);
|
||||
}
|
||||
@@ -2605,10 +2588,7 @@ static void tcp_chr_close(CharDriverState *chr)
|
||||
{
|
||||
TCPCharDriver *s = chr->opaque;
|
||||
if (s->fd >= 0) {
|
||||
if (s->tag) {
|
||||
io_remove_watch_poll(s->tag);
|
||||
s->tag = 0;
|
||||
}
|
||||
remove_fd_in_watch(chr);
|
||||
if (s->chan) {
|
||||
g_io_channel_unref(s->chan);
|
||||
}
|
||||
@@ -2989,11 +2969,11 @@ QemuOpts *qemu_chr_parse_compat(const char *label, const char *filename)
|
||||
if (strstart(filename, "vc", &p)) {
|
||||
qemu_opt_set(opts, "backend", "vc");
|
||||
if (*p == ':') {
|
||||
if (sscanf(p+1, "%8[0-9]x%8[0-9]", width, height) == 2) {
|
||||
if (sscanf(p+1, "%7[0-9]x%7[0-9]", width, height) == 2) {
|
||||
/* pixels */
|
||||
qemu_opt_set(opts, "width", width);
|
||||
qemu_opt_set(opts, "height", height);
|
||||
} else if (sscanf(p+1, "%8[0-9]Cx%8[0-9]C", width, height) == 2) {
|
||||
} else if (sscanf(p+1, "%7[0-9]Cx%7[0-9]C", width, height) == 2) {
|
||||
/* chars */
|
||||
qemu_opt_set(opts, "cols", width);
|
||||
qemu_opt_set(opts, "rows", height);
|
||||
|
||||
@@ -113,6 +113,7 @@ static const struct QemuSeccompSyscall seccomp_whitelist[] = {
|
||||
{ SCMP_SYS(write), 244 },
|
||||
{ SCMP_SYS(fcntl), 243 },
|
||||
{ SCMP_SYS(tgkill), 242 },
|
||||
{ SCMP_SYS(kill), 242 },
|
||||
{ SCMP_SYS(rt_sigaction), 242 },
|
||||
{ SCMP_SYS(pipe2), 242 },
|
||||
{ SCMP_SYS(munmap), 242 },
|
||||
|
||||
@@ -566,7 +566,7 @@ typedef struct FsMount {
|
||||
QTAILQ_ENTRY(FsMount) next;
|
||||
} FsMount;
|
||||
|
||||
typedef QTAILQ_HEAD(, FsMount) FsMountList;
|
||||
typedef QTAILQ_HEAD(FsMountList, FsMount) FsMountList;
|
||||
|
||||
static void free_fs_mount_list(FsMountList *mounts)
|
||||
{
|
||||
@@ -728,7 +728,7 @@ int64_t qmp_guest_fsfreeze_freeze(Error **err)
|
||||
/* cannot risk guest agent blocking itself on a write in this state */
|
||||
ga_set_frozen(ga_state);
|
||||
|
||||
QTAILQ_FOREACH(mount, &mounts, next) {
|
||||
QTAILQ_FOREACH_REVERSE(mount, &mounts, FsMountList, next) {
|
||||
fd = qemu_open(mount->dirname, O_RDONLY);
|
||||
if (fd == -1) {
|
||||
error_setg_errno(err, errno, "failed to open %s", mount->dirname);
|
||||
|
||||
+3
-2
@@ -823,8 +823,9 @@ char *object_property_get_str(Object *obj, const char *name,
|
||||
void object_property_set_link(Object *obj, Object *value,
|
||||
const char *name, Error **errp)
|
||||
{
|
||||
object_property_set_str(obj, object_get_canonical_path(value),
|
||||
name, errp);
|
||||
gchar *path = object_get_canonical_path(value);
|
||||
object_property_set_str(obj, path, name, errp);
|
||||
g_free(path);
|
||||
}
|
||||
|
||||
Object *object_property_get_link(Object *obj, const char *name,
|
||||
|
||||
+14
-3
@@ -20,7 +20,10 @@ import errno
|
||||
def generate_visit_struct_fields(name, field_prefix, fn_prefix, members):
|
||||
substructs = []
|
||||
ret = ''
|
||||
full_name = name if not fn_prefix else "%s_%s" % (name, fn_prefix)
|
||||
if not fn_prefix:
|
||||
full_name = name
|
||||
else:
|
||||
full_name = "%s_%s" % (name, fn_prefix)
|
||||
|
||||
for argname, argentry, optional, structured in parse_args(members):
|
||||
if structured:
|
||||
@@ -84,7 +87,10 @@ if (!error_is_set(errp)) {
|
||||
''')
|
||||
push_indent()
|
||||
|
||||
full_name = name if not field_prefix else "%s_%s" % (field_prefix, name)
|
||||
if not field_prefix:
|
||||
full_name = name
|
||||
else:
|
||||
full_name = "%s_%s" % (field_prefix, name)
|
||||
|
||||
if len(field_prefix):
|
||||
ret += mcgen('''
|
||||
@@ -265,12 +271,17 @@ void visit_type_%(name)s(Visitor *m, %(name)s ** obj, const char *name, Error **
|
||||
name=name)
|
||||
|
||||
pop_indent()
|
||||
|
||||
if not discriminator:
|
||||
desc_type = "type"
|
||||
else:
|
||||
desc_type = discriminator
|
||||
ret += mcgen('''
|
||||
visit_type_%(name)sKind(m, &(*obj)->kind, "%(type)s", &err);
|
||||
if (!err) {
|
||||
switch ((*obj)->kind) {
|
||||
''',
|
||||
name=name, type="type" if not discriminator else discriminator)
|
||||
name=name, type=desc_type)
|
||||
|
||||
for key in members:
|
||||
if not discriminator:
|
||||
|
||||
@@ -577,7 +577,7 @@ uint64_t HELPER(iwmmxt_rorl)(CPUARMState *env, uint64_t x, uint32_t n)
|
||||
|
||||
uint64_t HELPER(iwmmxt_rorq)(CPUARMState *env, uint64_t x, uint32_t n)
|
||||
{
|
||||
x = (x >> n) | (x << (64 - n));
|
||||
x = ror64(x, n);
|
||||
env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x);
|
||||
return x;
|
||||
}
|
||||
|
||||
@@ -15988,10 +15988,13 @@ void cpu_state_reset(CPUMIPSState *env)
|
||||
if (env->CP0_Config3 & (1 << CP0C3_DSPP)) {
|
||||
env->CP0_Status |= (1 << CP0St_MX);
|
||||
}
|
||||
/* Enable 64-bit FPU if the target cpu supports it. */
|
||||
if (env->active_fpu.fcr0 & (1 << FCR0_F64)) {
|
||||
# if defined(TARGET_MIPS64)
|
||||
/* For MIPS64, init FR bit to 1 if FPU unit is there and bit is writable. */
|
||||
if ((env->CP0_Config1 & (1 << CP0C1_FP)) &&
|
||||
(env->CP0_Status_rw_bitmask & (1 << CP0St_FR))) {
|
||||
env->CP0_Status |= (1 << CP0St_FR);
|
||||
}
|
||||
# endif
|
||||
#else
|
||||
if (env->hflags & MIPS_HFLAG_BMASK) {
|
||||
/* If the exception was raised from a delay slot,
|
||||
|
||||
+4
-8
@@ -236,20 +236,16 @@ static TCGArg do_constant_folding_2(TCGOpcode op, TCGArg x, TCGArg y)
|
||||
return (int64_t)x >> (int64_t)y;
|
||||
|
||||
case INDEX_op_rotr_i32:
|
||||
x = ((uint32_t)x << (32 - y)) | ((uint32_t)x >> y);
|
||||
return x;
|
||||
return ror32(x, y);
|
||||
|
||||
case INDEX_op_rotr_i64:
|
||||
x = ((uint64_t)x << (64 - y)) | ((uint64_t)x >> y);
|
||||
return x;
|
||||
return ror64(x, y);
|
||||
|
||||
case INDEX_op_rotl_i32:
|
||||
x = ((uint32_t)x << y) | ((uint32_t)x >> (32 - y));
|
||||
return x;
|
||||
return rol32(x, y);
|
||||
|
||||
case INDEX_op_rotl_i64:
|
||||
x = ((uint64_t)x << y) | ((uint64_t)x >> (64 - y));
|
||||
return x;
|
||||
return rol64(x, y);
|
||||
|
||||
CASE_OP_32_64(not):
|
||||
return ~x;
|
||||
|
||||
@@ -677,7 +677,6 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args,
|
||||
case INDEX_op_shl_i64:
|
||||
case INDEX_op_shr_i64:
|
||||
case INDEX_op_sar_i64:
|
||||
/* TODO: Implementation of rotl_i64, rotr_i64 missing in tci.c. */
|
||||
case INDEX_op_rotl_i64: /* Optional (TCG_TARGET_HAS_rot_i64). */
|
||||
case INDEX_op_rotr_i64: /* Optional (TCG_TARGET_HAS_rot_i64). */
|
||||
tcg_out_r(s, args[0]);
|
||||
|
||||
@@ -688,13 +688,13 @@ tcg_target_ulong tcg_qemu_tb_exec(CPUArchState *env, uint8_t *tb_ptr)
|
||||
t0 = *tb_ptr++;
|
||||
t1 = tci_read_ri32(&tb_ptr);
|
||||
t2 = tci_read_ri32(&tb_ptr);
|
||||
tci_write_reg32(t0, (t1 << t2) | (t1 >> (32 - t2)));
|
||||
tci_write_reg32(t0, rol32(t1, t2));
|
||||
break;
|
||||
case INDEX_op_rotr_i32:
|
||||
t0 = *tb_ptr++;
|
||||
t1 = tci_read_ri32(&tb_ptr);
|
||||
t2 = tci_read_ri32(&tb_ptr);
|
||||
tci_write_reg32(t0, (t1 >> t2) | (t1 << (32 - t2)));
|
||||
tci_write_reg32(t0, ror32(t1, t2));
|
||||
break;
|
||||
#endif
|
||||
#if TCG_TARGET_HAS_deposit_i32
|
||||
@@ -952,8 +952,16 @@ tcg_target_ulong tcg_qemu_tb_exec(CPUArchState *env, uint8_t *tb_ptr)
|
||||
break;
|
||||
#if TCG_TARGET_HAS_rot_i64
|
||||
case INDEX_op_rotl_i64:
|
||||
t0 = *tb_ptr++;
|
||||
t1 = tci_read_ri64(&tb_ptr);
|
||||
t2 = tci_read_ri64(&tb_ptr);
|
||||
tci_write_reg64(t0, rol64(t1, t2));
|
||||
break;
|
||||
case INDEX_op_rotr_i64:
|
||||
TODO();
|
||||
t0 = *tb_ptr++;
|
||||
t1 = tci_read_ri64(&tb_ptr);
|
||||
t2 = tci_read_ri64(&tb_ptr);
|
||||
tci_write_reg64(t0, ror64(t1, t2));
|
||||
break;
|
||||
#endif
|
||||
#if TCG_TARGET_HAS_deposit_i64
|
||||
|
||||
@@ -5,8 +5,10 @@ check-qjson
|
||||
check-qlist
|
||||
check-qstring
|
||||
test-aio
|
||||
test-bitops
|
||||
test-cutils
|
||||
test-hbitmap
|
||||
test-int128
|
||||
test-iov
|
||||
test-mul64
|
||||
test-qapi-types.[ch]
|
||||
@@ -19,3 +21,4 @@ test-thread-pool
|
||||
test-x86-cpuid
|
||||
test-xbzrle
|
||||
*-test
|
||||
qapi-schema/*.test.*
|
||||
+4
-4
@@ -247,10 +247,10 @@ check-tests/test-qapi.py: tests/test-qapi.py
|
||||
|
||||
.PHONY: $(patsubst %, check-%, $(check-qapi-schema-y))
|
||||
$(patsubst %, check-%, $(check-qapi-schema-y)): check-%.json: $(SRC_PATH)/%.json
|
||||
$(call quiet-command, PYTHONPATH=$(SRC_PATH)/scripts $(PYTHON) $(SRC_PATH)/tests/qapi-schema/test-qapi.py <$^ >$*.out 2>$*.err; echo $$? >$*.exit, " TEST $*.out")
|
||||
@diff -q $(SRC_PATH)/$*.out $*.out
|
||||
@diff -q $(SRC_PATH)/$*.err $*.err
|
||||
@diff -q $(SRC_PATH)/$*.exit $*.exit
|
||||
$(call quiet-command, PYTHONPATH=$(SRC_PATH)/scripts $(PYTHON) $(SRC_PATH)/tests/qapi-schema/test-qapi.py <$^ >$*.test.out 2>$*.test.err; echo $$? >$*.test.exit, " TEST $*.out")
|
||||
@diff -q $(SRC_PATH)/$*.out $*.test.out
|
||||
@diff -q $(SRC_PATH)/$*.err $*.test.err
|
||||
@diff -q $(SRC_PATH)/$*.exit $*.test.exit
|
||||
|
||||
# Consolidated targets
|
||||
|
||||
|
||||
@@ -66,6 +66,11 @@ poke_file "$TEST_IMG" "$capacity_offset" "\xff\xff\xff\xff"
|
||||
poke_file "$TEST_IMG" "$grain_table_size_offset" "\x01\x00\x00\x00"
|
||||
{ $QEMU_IO -c "read 0 512" $TEST_IMG; } 2>&1 | _filter_qemu_io | _filter_testdir
|
||||
|
||||
echo
|
||||
echo "=== Testing big twoGbMaxExtentFlat ==="
|
||||
IMGOPTS="subformat=twoGbMaxExtentFlat" _make_test_img 1000G
|
||||
$QEMU_IMG info $TEST_IMG | _filter_testdir | sed -e 's/cid: [0-9]*/cid: XXXXXXXX/'
|
||||
|
||||
# success, all done
|
||||
echo "*** done"
|
||||
rm -f $seq.full
|
||||
|
||||
+2019
-8
File diff suppressed because it is too large.
Load diff
@@ -604,6 +604,7 @@ static void test_visitor_in_errors(TestInputVisitorData *data,
|
||||
g_assert(error_is_set(&errp));
|
||||
g_assert(p->string == NULL);
|
||||
|
||||
error_free(errp);
|
||||
g_free(p->string);
|
||||
g_free(p);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user