aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--block/file-posix.c146
-rw-r--r--blockjob.c27
-rw-r--r--docs/qdev-device-use.txt3
-rw-r--r--hw/core/qdev-properties-system.c80
-rw-r--r--hw/s390x/ccw-device.c8
-rw-r--r--hw/s390x/css.c8
-rw-r--r--hw/s390x/ipl.c43
-rw-r--r--hw/s390x/ipl.h16
-rw-r--r--hw/s390x/s390-virtio-ccw.c51
-rw-r--r--hw/s390x/virtio-ccw.c20
-rw-r--r--hw/s390x/virtio-ccw.h1
-rw-r--r--include/block/blockjob_int.h14
-rw-r--r--include/exec/user/thunk.h22
-rw-r--r--include/hw/qdev-properties.h3
-rw-r--r--include/hw/s390x/s390-virtio-ccw.h2
-rw-r--r--include/net/net.h1
-rw-r--r--linux-user/sparc/syscall_nr.h32
-rw-r--r--linux-user/sparc/target_errno.h207
-rw-r--r--linux-user/sparc/target_syscall.h4
-rw-r--r--linux-user/sparc64/syscall_nr.h20
-rw-r--r--linux-user/sparc64/target_syscall.h5
-rw-r--r--linux-user/syscall.c66
-rw-r--r--linux-user/syscall_defs.h25
-rw-r--r--net/hub.c7
-rw-r--r--net/net.c18
-rw-r--r--net/slirp.c8
-rw-r--r--net/tap.c4
-rw-r--r--pc-bios/s390-ccw/cio.h2
-rw-r--r--qapi/block-core.json7
-rw-r--r--qapi/net.json15
-rw-r--r--qemu-doc.texi51
-rw-r--r--qemu-options.hx29
-rwxr-xr-xscripts/checkpatch.pl56
-rw-r--r--target/m68k/softfloat.c1
-rw-r--r--target/s390x/cpu.h26
-rw-r--r--target/s390x/diag.c61
-rw-r--r--target/s390x/internal.h6
-rw-r--r--target/s390x/kvm.c2
-rw-r--r--target/s390x/misc_helper.c2
39 files changed, 756 insertions, 343 deletions
diff --git a/block/file-posix.c b/block/file-posix.c
index 3794c00..5a602cf 100644
--- a/block/file-posix.c
+++ b/block/file-posix.c
@@ -161,6 +161,7 @@ typedef struct BDRVRawState {
bool page_cache_inconsistent:1;
bool has_fallocate;
bool needs_alignment;
+ bool check_cache_dropped;
PRManager *pr_mgr;
} BDRVRawState;
@@ -168,6 +169,7 @@ typedef struct BDRVRawState {
typedef struct BDRVRawReopenState {
int fd;
int open_flags;
+ bool check_cache_dropped;
} BDRVRawReopenState;
static int fd_open(BlockDriverState *bs);
@@ -415,6 +417,11 @@ static QemuOptsList raw_runtime_opts = {
.type = QEMU_OPT_STRING,
.help = "id of persistent reservation manager object (default: none)",
},
+ {
+ .name = "x-check-cache-dropped",
+ .type = QEMU_OPT_BOOL,
+ .help = "check that page cache was dropped on live migration (default: off)"
+ },
{ /* end of list */ }
},
};
@@ -500,6 +507,9 @@ static int raw_open_common(BlockDriverState *bs, QDict *options,
}
}
+ s->check_cache_dropped = qemu_opt_get_bool(opts, "x-check-cache-dropped",
+ false);
+
s->open_flags = open_flags;
raw_parse_flags(bdrv_flags, &s->open_flags);
@@ -777,6 +787,7 @@ static int raw_reopen_prepare(BDRVReopenState *state,
{
BDRVRawState *s;
BDRVRawReopenState *rs;
+ QemuOpts *opts;
int ret = 0;
Error *local_err = NULL;
@@ -787,6 +798,19 @@ static int raw_reopen_prepare(BDRVReopenState *state,
state->opaque = g_new0(BDRVRawReopenState, 1);
rs = state->opaque;
+ rs->fd = -1;
+
+ /* Handle options changes */
+ opts = qemu_opts_create(&raw_runtime_opts, NULL, 0, &error_abort);
+ qemu_opts_absorb_qdict(opts, state->options, &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ ret = -EINVAL;
+ goto out;
+ }
+
+ rs->check_cache_dropped = qemu_opt_get_bool(opts, "x-check-cache-dropped",
+ s->check_cache_dropped);
if (s->type == FTYPE_CD) {
rs->open_flags |= O_NONBLOCK;
@@ -794,8 +818,6 @@ static int raw_reopen_prepare(BDRVReopenState *state,
raw_parse_flags(state->flags, &rs->open_flags);
- rs->fd = -1;
-
int fcntl_flags = O_APPEND | O_NONBLOCK;
#ifdef O_NOATIME
fcntl_flags |= O_NOATIME;
@@ -850,6 +872,8 @@ static int raw_reopen_prepare(BDRVReopenState *state,
}
}
+out:
+ qemu_opts_del(opts);
return ret;
}
@@ -858,6 +882,7 @@ static void raw_reopen_commit(BDRVReopenState *state)
BDRVRawReopenState *rs = state->opaque;
BDRVRawState *s = state->bs->opaque;
+ s->check_cache_dropped = rs->check_cache_dropped;
s->open_flags = rs->open_flags;
qemu_close(s->fd);
@@ -2236,6 +2261,120 @@ static int coroutine_fn raw_co_block_status(BlockDriverState *bs,
return ret | BDRV_BLOCK_OFFSET_VALID;
}
+#if defined(__linux__)
+/* Verify that the file is not in the page cache */
+static void check_cache_dropped(BlockDriverState *bs, Error **errp)
+{
+ const size_t window_size = 128 * 1024 * 1024;
+ BDRVRawState *s = bs->opaque;
+ void *window = NULL;
+ size_t length = 0;
+ unsigned char *vec;
+ size_t page_size;
+ off_t offset;
+ off_t end;
+
+ /* mincore(2) page status information requires 1 byte per page */
+ page_size = sysconf(_SC_PAGESIZE);
+ vec = g_malloc(DIV_ROUND_UP(window_size, page_size));
+
+ end = raw_getlength(bs);
+
+ for (offset = 0; offset < end; offset += window_size) {
+ void *new_window;
+ size_t new_length;
+ size_t vec_end;
+ size_t i;
+ int ret;
+
+ /* Unmap previous window if size has changed */
+ new_length = MIN(end - offset, window_size);
+ if (new_length != length) {
+ munmap(window, length);
+ window = NULL;
+ length = 0;
+ }
+
+ new_window = mmap(window, new_length, PROT_NONE, MAP_PRIVATE,
+ s->fd, offset);
+ if (new_window == MAP_FAILED) {
+ error_setg_errno(errp, errno, "mmap failed");
+ break;
+ }
+
+ window = new_window;
+ length = new_length;
+
+ ret = mincore(window, length, vec);
+ if (ret < 0) {
+ error_setg_errno(errp, errno, "mincore failed");
+ break;
+ }
+
+ vec_end = DIV_ROUND_UP(length, page_size);
+ for (i = 0; i < vec_end; i++) {
+ if (vec[i] & 0x1) {
+ error_setg(errp, "page cache still in use!");
+ break;
+ }
+ }
+ }
+
+ if (window) {
+ munmap(window, length);
+ }
+
+ g_free(vec);
+}
+#endif /* __linux__ */
+
+static void coroutine_fn raw_co_invalidate_cache(BlockDriverState *bs,
+ Error **errp)
+{
+ BDRVRawState *s = bs->opaque;
+ int ret;
+
+ ret = fd_open(bs);
+ if (ret < 0) {
+ error_setg_errno(errp, -ret, "The file descriptor is not open");
+ return;
+ }
+
+ if (s->open_flags & O_DIRECT) {
+ return; /* No host kernel page cache */
+ }
+
+#if defined(__linux__)
+ /* This sets the scene for the next syscall... */
+ ret = bdrv_co_flush(bs);
+ if (ret < 0) {
+ error_setg_errno(errp, -ret, "flush failed");
+ return;
+ }
+
+ /* Linux does not invalidate pages that are dirty, locked, or mmapped by a
+ * process. These limitations are okay because we just fsynced the file,
+ * we don't use mmap, and the file should not be in use by other processes.
+ */
+ ret = posix_fadvise(s->fd, 0, 0, POSIX_FADV_DONTNEED);
+ if (ret != 0) { /* the return value is a positive errno */
+ error_setg_errno(errp, ret, "fadvise failed");
+ return;
+ }
+
+ if (s->check_cache_dropped) {
+ check_cache_dropped(bs, errp);
+ }
+#else /* __linux__ */
+ /* Do nothing. Live migration to a remote host with cache.direct=off is
+ * unsupported on other host operating systems. Cache consistency issues
+ * may occur but no error is reported here, partly because that's the
+ * historical behavior and partly because it's hard to differentiate valid
+ * configurations that should not cause errors.
+ */
+#endif /* !__linux__ */
+}
+
static coroutine_fn BlockAIOCB *raw_aio_pdiscard(BlockDriverState *bs,
int64_t offset, int bytes,
BlockCompletionFunc *cb, void *opaque)
@@ -2328,6 +2467,7 @@ BlockDriver bdrv_file = {
.bdrv_co_create_opts = raw_co_create_opts,
.bdrv_has_zero_init = bdrv_has_zero_init_1,
.bdrv_co_block_status = raw_co_block_status,
+ .bdrv_co_invalidate_cache = raw_co_invalidate_cache,
.bdrv_co_pwrite_zeroes = raw_co_pwrite_zeroes,
.bdrv_co_preadv = raw_co_preadv,
@@ -2805,6 +2945,7 @@ static BlockDriver bdrv_host_device = {
.bdrv_reopen_abort = raw_reopen_abort,
.bdrv_co_create_opts = hdev_co_create_opts,
.create_opts = &raw_create_opts,
+ .bdrv_co_invalidate_cache = raw_co_invalidate_cache,
.bdrv_co_pwrite_zeroes = hdev_co_pwrite_zeroes,
.bdrv_co_preadv = raw_co_preadv,
@@ -2927,6 +3068,7 @@ static BlockDriver bdrv_host_cdrom = {
.bdrv_reopen_abort = raw_reopen_abort,
.bdrv_co_create_opts = hdev_co_create_opts,
.create_opts = &raw_create_opts,
+ .bdrv_co_invalidate_cache = raw_co_invalidate_cache,
.bdrv_co_preadv = raw_co_preadv,
diff --git a/blockjob.c b/blockjob.c
index 27f957e..dfffad9 100644
--- a/blockjob.c
+++ b/blockjob.c
@@ -988,19 +988,6 @@ void *block_job_create(const char *job_id, const BlockJobDriver *driver,
return job;
}
-void block_job_pause_all(void)
-{
- BlockJob *job = NULL;
- while ((job = block_job_next(job))) {
- AioContext *aio_context = blk_get_aio_context(job->blk);
-
- aio_context_acquire(aio_context);
- block_job_ref(job);
- block_job_pause(job);
- aio_context_release(aio_context);
- }
-}
-
void block_job_early_fail(BlockJob *job)
{
assert(job->status == BLOCK_JOB_STATUS_CREATED);
@@ -1078,20 +1065,6 @@ void coroutine_fn block_job_pause_point(BlockJob *job)
}
}
-void block_job_resume_all(void)
-{
- BlockJob *job, *next;
-
- QLIST_FOREACH_SAFE(job, &block_jobs, job_list, next) {
- AioContext *aio_context = blk_get_aio_context(job->blk);
-
- aio_context_acquire(aio_context);
- block_job_resume(job);
- block_job_unref(job);
- aio_context_release(aio_context);
- }
-}
-
/*
* Conditionally enter a block_job pending a call to fn() while
* under the block_job_lock critical section.
diff --git a/docs/qdev-device-use.txt b/docs/qdev-device-use.txt
index 8f188d1..98229b3 100644
--- a/docs/qdev-device-use.txt
+++ b/docs/qdev-device-use.txt
@@ -277,9 +277,6 @@ devices and ne2k_isa are.
Some PCI devices aren't available with -net nic, e.g. i82558a.
-To connect to a VLAN instead of an ordinary host part, replace
-netdev=NET-ID by vlan=VLAN.
-
=== Graphics Devices ===
Host and guest part of graphics devices have always been separate.
diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c
index 1d3ba72..8b22fb5 100644
--- a/hw/core/qdev-properties-system.c
+++ b/hw/core/qdev-properties-system.c
@@ -321,86 +321,6 @@ const PropertyInfo qdev_prop_netdev = {
.set = set_netdev,
};
-/* --- vlan --- */
-
-static int print_vlan(DeviceState *dev, Property *prop, char *dest, size_t len)
-{
- NetClientState **ptr = qdev_get_prop_ptr(dev, prop);
-
- if (*ptr) {
- int id;
- if (!net_hub_id_for_client(*ptr, &id)) {
- return snprintf(dest, len, "%d", id);
- }
- }
-
- return snprintf(dest, len, "<null>");
-}
-
-static void get_vlan(Object *obj, Visitor *v, const char *name, void *opaque,
- Error **errp)
-{
- DeviceState *dev = DEVICE(obj);
- Property *prop = opaque;
- NetClientState **ptr = qdev_get_prop_ptr(dev, prop);
- int32_t id = -1;
-
- if (*ptr) {
- int hub_id;
- if (!net_hub_id_for_client(*ptr, &hub_id)) {
- id = hub_id;
- }
- }
-
- visit_type_int32(v, name, &id, errp);
-}
-
-static void set_vlan(Object *obj, Visitor *v, const char *name, void *opaque,
- Error **errp)
-{
- DeviceState *dev = DEVICE(obj);
- Property *prop = opaque;
- NICPeers *peers_ptr = qdev_get_prop_ptr(dev, prop);
- NetClientState **ptr = &peers_ptr->ncs[0];
- Error *local_err = NULL;
- int32_t id;
- NetClientState *hubport;
-
- if (dev->realized) {
- qdev_prop_set_after_realize(dev, name, errp);
- return;
- }
-
- visit_type_int32(v, name, &id, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
- return;
- }
- if (id == -1) {
- *ptr = NULL;
- return;
- }
- if (*ptr) {
- error_set_from_qdev_prop_error(errp, -EINVAL, dev, prop, name);
- return;
- }
-
- hubport = net_hub_port_find(id);
- if (!hubport) {
- error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
- name, prop->info->name);
- return;
- }
- *ptr = hubport;
-}
-
-const PropertyInfo qdev_prop_vlan = {
- .name = "int32",
- .description = "Integer VLAN id to connect to",
- .print = print_vlan,
- .get = get_vlan,
- .set = set_vlan,
-};
void qdev_prop_set_drive(DeviceState *dev, const char *name,
BlockBackend *value, Error **errp)
diff --git a/hw/s390x/ccw-device.c b/hw/s390x/ccw-device.c
index f9bfa15..7cd73df 100644
--- a/hw/s390x/ccw-device.c
+++ b/hw/s390x/ccw-device.c
@@ -40,6 +40,13 @@ static Property ccw_device_properties[] = {
DEFINE_PROP_END_OF_LIST(),
};
+static void ccw_device_reset(DeviceState *d)
+{
+ CcwDevice *ccw_dev = CCW_DEVICE(d);
+
+ css_reset_sch(ccw_dev->sch);
+}
+
static void ccw_device_class_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
@@ -48,6 +55,7 @@ static void ccw_device_class_init(ObjectClass *klass, void *data)
k->realize = ccw_device_realize;
k->refill_ids = ccw_device_refill_ids;
dc->props = ccw_device_properties;
+ dc->reset = ccw_device_reset;
}
const VMStateDescription vmstate_ccw_dev = {
diff --git a/hw/s390x/css.c b/hw/s390x/css.c
index 301bf17..56c3fa8 100644
--- a/hw/s390x/css.c
+++ b/hw/s390x/css.c
@@ -617,6 +617,14 @@ void css_inject_io_interrupt(SubchDev *sch)
void css_conditional_io_interrupt(SubchDev *sch)
{
/*
+ * If the subchannel is not enabled, it is not made status pending
+ * (see PoP p. 16-17, "Status Control").
+ */
+ if (!(sch->curr_status.pmcw.flags & PMCW_FLAGS_MASK_ENA)) {
+ return;
+ }
+
+ /*
* If the subchannel is not currently status pending, make it pending
* with alert status.
*/
diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
index 150f6c0..04245b5 100644
--- a/hw/s390x/ipl.c
+++ b/hw/s390x/ipl.c
@@ -26,6 +26,7 @@
#include "qemu/config-file.h"
#include "qemu/cutils.h"
#include "qemu/option.h"
+#include "exec/exec-all.h"
#define KERN_IMAGE_START 0x010000UL
#define KERN_PARM_AREA 0x010480UL
@@ -488,12 +489,20 @@ IplParameterBlock *s390_ipl_get_iplb(void)
return &ipl->iplb;
}
-void s390_reipl_request(void)
+void s390_ipl_reset_request(CPUState *cs, enum s390_reset reset_type)
{
S390IPLState *ipl = get_ipl_device();
- ipl->reipl_requested = true;
- if (ipl->iplb_valid &&
+ if (reset_type == S390_RESET_EXTERNAL || reset_type == S390_RESET_REIPL) {
+ /* use CPU 0 for full resets */
+ ipl->reset_cpu_index = 0;
+ } else {
+ ipl->reset_cpu_index = cs->cpu_index;
+ }
+ ipl->reset_type = reset_type;
+
+ if (reset_type == S390_RESET_REIPL &&
+ ipl->iplb_valid &&
!ipl->netboot &&
ipl->iplb.pbt == S390_IPL_TYPE_CCW &&
is_virtio_scsi_device(&ipl->iplb)) {
@@ -510,6 +519,31 @@ void s390_reipl_request(void)
}
}
qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
+ /* as this is triggered by a CPU, make sure to exit the loop */
+ if (tcg_enabled()) {
+ cpu_loop_exit(cs);
+ }
+}
+
+void s390_ipl_get_reset_request(CPUState **cs, enum s390_reset *reset_type)
+{
+ S390IPLState *ipl = get_ipl_device();
+
+ *cs = qemu_get_cpu(ipl->reset_cpu_index);
+ if (!*cs) {
+ /* use any CPU */
+ *cs = first_cpu;
+ }
+ *reset_type = ipl->reset_type;
+}
+
+void s390_ipl_clear_reset_request(void)
+{
+ S390IPLState *ipl = get_ipl_device();
+
+ ipl->reset_type = S390_RESET_EXTERNAL;
+ /* use CPU 0 for full resets */
+ ipl->reset_cpu_index = 0;
}
static void s390_ipl_prepare_qipl(S390CPU *cpu)
@@ -556,11 +590,10 @@ static void s390_ipl_reset(DeviceState *dev)
{
S390IPLState *ipl = S390_IPL(dev);
- if (!ipl->reipl_requested) {
+ if (ipl->reset_type != S390_RESET_REIPL) {
ipl->iplb_valid = false;
memset(&ipl->iplb, 0, sizeof(IplParameterBlock));
}
- ipl->reipl_requested = false;
}
static void s390_ipl_class_init(ObjectClass *klass, void *data)
diff --git a/hw/s390x/ipl.h b/hw/s390x/ipl.h
index 0570d0a..4e87b89 100644
--- a/hw/s390x/ipl.h
+++ b/hw/s390x/ipl.h
@@ -87,7 +87,17 @@ int s390_ipl_set_loadparm(uint8_t *loadparm);
void s390_ipl_update_diag308(IplParameterBlock *iplb);
void s390_ipl_prepare_cpu(S390CPU *cpu);
IplParameterBlock *s390_ipl_get_iplb(void);
-void s390_reipl_request(void);
+
+enum s390_reset {
+ /* default is a reset not triggered by a CPU e.g. issued by QMP */
+ S390_RESET_EXTERNAL = 0,
+ S390_RESET_REIPL,
+ S390_RESET_MODIFIED_CLEAR,
+ S390_RESET_LOAD_NORMAL,
+};
+void s390_ipl_reset_request(CPUState *cs, enum s390_reset reset_type);
+void s390_ipl_get_reset_request(CPUState **cs, enum s390_reset *reset_type);
+void s390_ipl_clear_reset_request(void);
#define QIPL_ADDRESS 0xcc
@@ -129,9 +139,11 @@ struct S390IPLState {
bool enforce_bios;
IplParameterBlock iplb;
bool iplb_valid;
- bool reipl_requested;
bool netboot;
QemuIplParameters qipl;
+ /* reset related properties don't have to be migrated or reset */
+ enum s390_reset reset_type;
+ int reset_cpu_index;
/*< public >*/
char *kernel;
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 5796e24..e548d34 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -93,7 +93,7 @@ static const char *const reset_dev_types[] = {
"diag288",
};
-void subsystem_reset(void)
+static void subsystem_reset(void)
{
DeviceState *dev;
int i;
@@ -381,17 +381,54 @@ static void s390_cpu_plug(HotplugHandler *hotplug_dev,
}
}
+static inline void s390_do_cpu_ipl(CPUState *cs, run_on_cpu_data arg)
+{
+ S390CPU *cpu = S390_CPU(cs);
+
+ s390_ipl_prepare_cpu(cpu);
+ s390_cpu_set_state(S390_CPU_STATE_OPERATING, cpu);
+}
+
static void s390_machine_reset(void)
{
- S390CPU *ipl_cpu = S390_CPU(qemu_get_cpu(0));
+ enum s390_reset reset_type;
+ CPUState *cs, *t;
+ /* get the reset parameters, reset them once done */
+ s390_ipl_get_reset_request(&cs, &reset_type);
+
+ /* all CPUs are paused and synchronized at this point */
s390_cmma_reset();
- qemu_devices_reset();
- s390_crypto_reset();
- /* all cpus are stopped - configure and start the ipl cpu only */
- s390_ipl_prepare_cpu(ipl_cpu);
- s390_cpu_set_state(S390_CPU_STATE_OPERATING, ipl_cpu);
+ switch (reset_type) {
+ case S390_RESET_EXTERNAL:
+ case S390_RESET_REIPL:
+ qemu_devices_reset();
+ s390_crypto_reset();
+
+ /* configure and start the ipl CPU only */
+ run_on_cpu(cs, s390_do_cpu_ipl, RUN_ON_CPU_NULL);
+ break;
+ case S390_RESET_MODIFIED_CLEAR:
+ CPU_FOREACH(t) {
+ run_on_cpu(t, s390_do_cpu_full_reset, RUN_ON_CPU_NULL);
+ }
+ subsystem_reset();
+ s390_crypto_reset();
+ run_on_cpu(cs, s390_do_cpu_load_normal, RUN_ON_CPU_NULL);
+ break;
+ case S390_RESET_LOAD_NORMAL:
+ CPU_FOREACH(t) {
+ run_on_cpu(t, s390_do_cpu_reset, RUN_ON_CPU_NULL);
+ }
+ subsystem_reset();
+ run_on_cpu(cs, s390_do_cpu_initial_reset, RUN_ON_CPU_NULL);
+ run_on_cpu(cs, s390_do_cpu_load_normal, RUN_ON_CPU_NULL);
+ break;
+ default:
+ g_assert_not_reached();
+ }
+ s390_ipl_clear_reset_request();
}
static void s390_machine_device_plug(HotplugHandler *hotplug_dev,
diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c
index e51fbef..22df33b 100644
--- a/hw/s390x/virtio-ccw.c
+++ b/hw/s390x/virtio-ccw.c
@@ -1058,10 +1058,12 @@ static void virtio_ccw_reset(DeviceState *d)
{
VirtioCcwDevice *dev = VIRTIO_CCW_DEVICE(d);
VirtIODevice *vdev = virtio_bus_get_device(&dev->bus);
- CcwDevice *ccw_dev = CCW_DEVICE(d);
+ VirtIOCCWDeviceClass *vdc = VIRTIO_CCW_DEVICE_GET_CLASS(dev);
virtio_ccw_reset_virtio(dev, vdev);
- css_reset_sch(ccw_dev->sch);
+ if (vdc->parent_reset) {
+ vdc->parent_reset(d);
+ }
}
static void virtio_ccw_vmstate_change(DeviceState *d, bool running)
@@ -1345,7 +1347,6 @@ static void virtio_ccw_net_class_init(ObjectClass *klass, void *data)
k->realize = virtio_ccw_net_realize;
k->unrealize = virtio_ccw_unrealize;
- dc->reset = virtio_ccw_reset;
dc->props = virtio_ccw_net_properties;
set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
}
@@ -1373,7 +1374,6 @@ static void virtio_ccw_blk_class_init(ObjectClass *klass, void *data)
k->realize = virtio_ccw_blk_realize;
k->unrealize = virtio_ccw_unrealize;
- dc->reset = virtio_ccw_reset;
dc->props = virtio_ccw_blk_properties;
set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
}
@@ -1401,7 +1401,6 @@ static void virtio_ccw_serial_class_init(ObjectClass *klass, void *data)
k->realize = virtio_ccw_serial_realize;
k->unrealize = virtio_ccw_unrealize;
- dc->reset = virtio_ccw_reset;
dc->props = virtio_ccw_serial_properties;
set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
}
@@ -1429,7 +1428,6 @@ static void virtio_ccw_balloon_class_init(ObjectClass *klass, void *data)
k->realize = virtio_ccw_balloon_realize;
k->unrealize = virtio_ccw_unrealize;
- dc->reset = virtio_ccw_reset;
dc->props = virtio_ccw_balloon_properties;
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
}
@@ -1457,7 +1455,6 @@ static void virtio_ccw_scsi_class_init(ObjectClass *klass, void *data)
k->realize = virtio_ccw_scsi_realize;
k->unrealize = virtio_ccw_unrealize;
- dc->reset = virtio_ccw_reset;
dc->props = virtio_ccw_scsi_properties;
set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
}
@@ -1484,7 +1481,6 @@ static void vhost_ccw_scsi_class_init(ObjectClass *klass, void *data)
k->realize = vhost_ccw_scsi_realize;
k->unrealize = virtio_ccw_unrealize;
- dc->reset = virtio_ccw_reset;
dc->props = vhost_ccw_scsi_properties;
set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
}
@@ -1521,7 +1517,6 @@ static void virtio_ccw_rng_class_init(ObjectClass *klass, void *data)
k->realize = virtio_ccw_rng_realize;
k->unrealize = virtio_ccw_unrealize;
- dc->reset = virtio_ccw_reset;
dc->props = virtio_ccw_rng_properties;
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
}
@@ -1559,7 +1554,6 @@ static void virtio_ccw_crypto_class_init(ObjectClass *klass, void *data)
k->realize = virtio_ccw_crypto_realize;
k->unrealize = virtio_ccw_unrealize;
- dc->reset = virtio_ccw_reset;
dc->props = virtio_ccw_crypto_properties;
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
}
@@ -1597,7 +1591,6 @@ static void virtio_ccw_gpu_class_init(ObjectClass *klass, void *data)
k->realize = virtio_ccw_gpu_realize;
k->unrealize = virtio_ccw_unrealize;
- dc->reset = virtio_ccw_reset;
dc->props = virtio_ccw_gpu_properties;
dc->hotpluggable = false;
set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
@@ -1626,7 +1619,6 @@ static void virtio_ccw_input_class_init(ObjectClass *klass, void *data)
k->realize = virtio_ccw_input_realize;
k->unrealize = virtio_ccw_unrealize;
- dc->reset = virtio_ccw_reset;
dc->props = virtio_ccw_input_properties;
set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
}
@@ -1725,11 +1717,13 @@ static void virtio_ccw_device_class_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
CCWDeviceClass *k = CCW_DEVICE_CLASS(dc);
+ VirtIOCCWDeviceClass *vdc = VIRTIO_CCW_DEVICE_CLASS(klass);
k->unplug = virtio_ccw_busdev_unplug;
dc->realize = virtio_ccw_busdev_realize;
dc->unrealize = virtio_ccw_busdev_unrealize;
dc->bus_type = TYPE_VIRTUAL_CSS_BUS;
+ device_class_set_parent_reset(dc, virtio_ccw_reset, &vdc->parent_reset);
}
static const TypeInfo virtio_ccw_device_info = {
@@ -1806,7 +1800,6 @@ static void virtio_ccw_9p_class_init(ObjectClass *klass, void *data)
k->unrealize = virtio_ccw_unrealize;
k->realize = virtio_ccw_9p_realize;
- dc->reset = virtio_ccw_reset;
dc->props = virtio_ccw_9p_properties;
set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
}
@@ -1856,7 +1849,6 @@ static void vhost_vsock_ccw_class_init(ObjectClass *klass, void *data)
k->unrealize = virtio_ccw_unrealize;
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
dc->props = vhost_vsock_ccw_properties;
- dc->reset = virtio_ccw_reset;
}
static void vhost_vsock_ccw_instance_init(Object *obj)
diff --git a/hw/s390x/virtio-ccw.h b/hw/s390x/virtio-ccw.h
index 2fc5130..3453aa1 100644
--- a/hw/s390x/virtio-ccw.h
+++ b/hw/s390x/virtio-ccw.h
@@ -77,6 +77,7 @@ typedef struct VirtIOCCWDeviceClass {
CCWDeviceClass parent_class;
void (*realize)(VirtioCcwDevice *dev, Error **errp);
void (*unrealize)(VirtioCcwDevice *dev, Error **errp);
+ void (*parent_reset)(DeviceState *dev);
} VirtIOCCWDeviceClass;
/* Performance improves when virtqueue kick processing is decoupled from the
diff --git a/include/block/blockjob_int.h b/include/block/blockjob_int.h
index 642adce..d5a515d 100644
--- a/include/block/blockjob_int.h
+++ b/include/block/blockjob_int.h
@@ -169,20 +169,6 @@ void block_job_sleep_ns(BlockJob *job, int64_t ns);
void block_job_yield(BlockJob *job);
/**
- * block_job_pause_all:
- *
- * Asynchronously pause all jobs.
- */
-void block_job_pause_all(void);
-
-/**
- * block_job_resume_all:
- *
- * Resume all block jobs. Must be paired with a preceding block_job_pause_all.
- */
-void block_job_resume_all(void);
-
-/**
* block_job_early_fail:
* @bs: The block device.
*
diff --git a/include/exec/user/thunk.h b/include/exec/user/thunk.h
index f19ef4b..8f55b23 100644
--- a/include/exec/user/thunk.h
+++ b/include/exec/user/thunk.h
@@ -149,20 +149,32 @@ static inline int thunk_type_align(const argtype *type_ptr, int is_host)
case TYPE_CHAR:
return 1;
case TYPE_SHORT:
- return 2;
+ if (is_host) {
+ return __alignof__(short);
+ } else {
+ return ABI_SHORT_ALIGNMENT;
+ }
case TYPE_INT:
- return 4;
+ if (is_host) {
+ return __alignof__(int);
+ } else {
+ return ABI_INT_ALIGNMENT;
+ }
case TYPE_LONGLONG:
case TYPE_ULONGLONG:
- return 8;
+ if (is_host) {
+ return __alignof__(long long);
+ } else {
+ return ABI_LLONG_ALIGNMENT;
+ }
case TYPE_LONG:
case TYPE_ULONG:
case TYPE_PTRVOID:
case TYPE_PTR:
if (is_host) {
- return sizeof(void *);
+ return __alignof__(long);
} else {
- return TARGET_ABI_BITS / 8;
+ return ABI_LONG_ALIGNMENT;
}
break;
case TYPE_OLDDEVT:
diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h
index b2ad8e9..4f60cc8 100644
--- a/include/hw/qdev-properties.h
+++ b/include/hw/qdev-properties.h
@@ -29,7 +29,6 @@ extern const PropertyInfo qdev_prop_bios_chs_trans;
extern const PropertyInfo qdev_prop_fdc_drive_type;
extern const PropertyInfo qdev_prop_drive;
extern const PropertyInfo qdev_prop_netdev;
-extern const PropertyInfo qdev_prop_vlan;
extern const PropertyInfo qdev_prop_pci_devfn;
extern const PropertyInfo qdev_prop_blocksize;
extern const PropertyInfo qdev_prop_pci_host_devaddr;
@@ -195,8 +194,6 @@ extern const PropertyInfo qdev_prop_off_auto_pcibar;
DEFINE_PROP(_n, _s, _f, qdev_prop_string, char*)
#define DEFINE_PROP_NETDEV(_n, _s, _f) \
DEFINE_PROP(_n, _s, _f, qdev_prop_netdev, NICPeers)
-#define DEFINE_PROP_VLAN(_n, _s, _f) \
- DEFINE_PROP(_n, _s, _f, qdev_prop_vlan, NICPeers)
#define DEFINE_PROP_DRIVE(_n, _s, _f) \
DEFINE_PROP(_n, _s, _f, qdev_prop_drive, BlockBackend *)
#define DEFINE_PROP_MACADDR(_n, _s, _f) \
diff --git a/include/hw/s390x/s390-virtio-ccw.h b/include/hw/s390x/s390-virtio-ccw.h
index ac896e3..ab88d49 100644
--- a/include/hw/s390x/s390-virtio-ccw.h
+++ b/include/hw/s390x/s390-virtio-ccw.h
@@ -53,6 +53,4 @@ bool cpu_model_allowed(void);
*/
bool css_migration_enabled(void);
-void subsystem_reset(void);
-
#endif
diff --git a/include/net/net.h b/include/net/net.h
index 1f7341e..1425960 100644
--- a/include/net/net.h
+++ b/include/net/net.h
@@ -37,7 +37,6 @@ typedef struct NICConf {
#define DEFINE_NIC_PROPERTIES(_state, _conf) \
DEFINE_PROP_MACADDR("mac", _state, _conf.macaddr), \
- DEFINE_PROP_VLAN("vlan", _state, _conf.peers), \
DEFINE_PROP_NETDEV("netdev", _state, _conf.peers)
diff --git a/linux-user/sparc/syscall_nr.h b/linux-user/sparc/syscall_nr.h
index e713c9d..2d77e19 100644
--- a/linux-user/sparc/syscall_nr.h
+++ b/linux-user/sparc/syscall_nr.h
@@ -22,6 +22,7 @@
#define TARGET_NR_capset 22 /* Linux Specific */
#define TARGET_NR_setuid 23 /* Implemented via setreuid in SunOS */
#define TARGET_NR_getuid 24 /* Common */
+#define TARGET_NR_vmsplice 25
#define TARGET_NR_ptrace 26 /* Common */
#define TARGET_NR_alarm 27 /* Implemented via setitimer in SunOS */
#define TARGET_NR_sigaltstack 28 /* Common */
@@ -135,6 +136,7 @@
#define TARGET_NR_rmdir 137 /* Common */
#define TARGET_NR_utimes 138 /* SunOS Specific */
#define TARGET_NR_stat64 139 /* Linux sparc32 Specific */
+#define TARGET_NR_sendfile64 140
#define TARGET_NR_getpeername 141 /* Common */
#define TARGET_NR_futex 142 /* gethostid under SunOS */
#define TARGET_NR_gettid 143 /* ENOSYS under SunOS */
@@ -145,29 +147,51 @@
#define TARGET_NR_pciconfig_read 148 /* ENOSYS under SunOS */
#define TARGET_NR_pciconfig_write 149 /* ENOSYS under SunOS */
#define TARGET_NR_getsockname 150 /* Common */
+#define TARGET_NR_inotify_init 151
+#define TARGET_NR_inotify_add_watch 152
#define TARGET_NR_poll 153 /* Common */
#define TARGET_NR_getdents64 154 /* Linux specific */
#define TARGET_NR_fcntl64 155 /* Linux sparc32 Specific */
+#define TARGET_NR_inotify_rm_watch 156
#define TARGET_NR_statfs 157 /* Common */
#define TARGET_NR_fstatfs 158 /* Common */
#define TARGET_NR_umount 159 /* Common */
+#define TARGET_NR_sched_set_affinity 160
+#define TARGET_NR_sched_get_affinity 161
#define TARGET_NR_getdomainname 162 /* SunOS Specific */
#define TARGET_NR_setdomainname 163 /* Common */
#define TARGET_NR_quotactl 165 /* Common */
#define TARGET_NR_set_tid_address 166 /* Linux specific, exportfs under SunOS */
#define TARGET_NR_mount 167 /* Common */
#define TARGET_NR_ustat 168 /* Common */
+#define TARGET_NR_setxattr 169
+#define TARGET_NR_lsetxattr 170
+#define TARGET_NR_fsetxattr 171
+#define TARGET_NR_getxattr 172
+#define TARGET_NR_lgetxattr 173
#define TARGET_NR_getdents 174 /* Common */
#define TARGET_NR_setsid 175 /* Common */
#define TARGET_NR_fchdir 176 /* Common */
+#define TARGET_NR_fgetxattr 177
+#define TARGET_NR_listxattr 178
+#define TARGET_NR_llistxattr 179
+#define TARGET_NR_flistxattr 180
+#define TARGET_NR_removexattr 181
+#define TARGET_NR_lremovexattr 182
#define TARGET_NR_sigpending 183 /* Common */
#define TARGET_NR_query_module 184 /* Linux Specific */
#define TARGET_NR_setpgid 185 /* Common */
+#define TARGET_NR_fremovexattr 186
#define TARGET_NR_tkill 187 /* SunOS: fpathconf */
#define TARGET_NR_exit_group 188 /* Linux specific, sysconf undef SunOS */
#define TARGET_NR_uname 189 /* Linux Specific */
#define TARGET_NR_init_module 190 /* Linux Specific */
#define TARGET_NR_personality 191 /* Linux Specific */
+#define TARGET_NR_remap_file_pages 192
+#define TARGET_NR_epoll_create 193
+#define TARGET_NR_epoll_ctl 194
+#define TARGET_NR_epoll_wait 195
+#define TARGET_NR_ioprio_set 196
#define TARGET_NR_getppid 197 /* Linux Specific */
#define TARGET_NR_sigaction 198 /* Linux Specific */
#define TARGET_NR_sgetmask 199 /* Linux Specific */
@@ -189,6 +213,7 @@
#define TARGET_NR_ipc 215 /* Linux Specific */
#define TARGET_NR_sigreturn 216 /* Linux Specific */
#define TARGET_NR_clone 217 /* Linux Specific */
+#define TARGET_NR_ioprio_get 218
#define TARGET_NR_adjtimex 219 /* Linux Specific */
#define TARGET_NR_sigprocmask 220 /* Linux Specific */
#define TARGET_NR_create_module 221 /* Linux Specific */
@@ -202,6 +227,7 @@
#define TARGET_NR_setfsgid 229 /* Linux Specific */
#define TARGET_NR__newselect 230 /* Linux Specific */
#define TARGET_NR_time 231 /* Linux Specific */
+#define TARGET_NR_splice 232
#define TARGET_NR_stime 233 /* Linux Specific */
#define TARGET_NR_statfs64 234 /* Linux Specific */
#define TARGET_NR_fstatfs64 235 /* Linux Specific */
@@ -224,7 +250,7 @@
#define TARGET_NR_getsid 252
#define TARGET_NR_fdatasync 253
#define TARGET_NR_nfsservctl 254
-#define TARGET_NR_aplib 255
+#define TARGET_NR_sync_file_range 255
#define TARGET_NR_clock_settime 256
#define TARGET_NR_clock_gettime 257
#define TARGET_NR_clock_getres 258
@@ -326,3 +352,7 @@
#define TARGET_NR_listen 354
#define TARGET_NR_setsockopt 355
#define TARGET_NR_mlock2 356
+#define TARGET_NR_copy_file_range 357
+#define TARGET_NR_preadv2 358
+#define TARGET_NR_pwritev2 359
+#define TARGET_NR_statx 360
diff --git a/linux-user/sparc/target_errno.h b/linux-user/sparc/target_errno.h
new file mode 100644
index 0000000..9b84689
--- /dev/null
+++ b/linux-user/sparc/target_errno.h
@@ -0,0 +1,207 @@
+#ifndef SPARC_TARGET_ERRNO_H
+#define SPARC_TARGET_ERRNO_H
+
+/* Target errno definitions taken from asm-sparc/errno.h */
+#undef TARGET_EWOULDBLOCK
+#define TARGET_EWOULDBLOCK TARGET_EAGAIN /* Operation would block */
+#undef TARGET_EINPROGRESS
+#define TARGET_EINPROGRESS 36 /* Operation now in progress */
+#undef TARGET_EALREADY
+#define TARGET_EALREADY 37 /* Operation already in progress */
+#undef TARGET_ENOTSOCK
+#define TARGET_ENOTSOCK 38 /* Socket operation on non-socket */
+#undef TARGET_EDESTADDRREQ
+#define TARGET_EDESTADDRREQ 39 /* Destination address required */
+#undef TARGET_EMSGSIZE
+#define TARGET_EMSGSIZE 40 /* Message too long */
+#undef TARGET_EPROTOTYPE
+#define TARGET_EPROTOTYPE 41 /* Protocol wrong type for socket */
+#undef TARGET_ENOPROTOOPT
+#define TARGET_ENOPROTOOPT 42 /* Protocol not available */
+#undef TARGET_EPROTONOSUPPORT
+#define TARGET_EPROTONOSUPPORT 43 /* Protocol not supported */
+#undef TARGET_ESOCKTNOSUPPORT
+#define TARGET_ESOCKTNOSUPPORT 44 /* Socket type not supported */
+#undef TARGET_EOPNOTSUPP
+#define TARGET_EOPNOTSUPP 45 /* Op not supported on transport endpoint */
+#undef TARGET_EPFNOSUPPORT
+#define TARGET_EPFNOSUPPORT 46 /* Protocol family not supported */
+#undef TARGET_EAFNOSUPPORT
+#define TARGET_EAFNOSUPPORT 47 /* Address family not supported by protocol */
+#undef TARGET_EADDRINUSE
+#define TARGET_EADDRINUSE 48 /* Address already in use */
+#undef TARGET_EADDRNOTAVAIL
+#define TARGET_EADDRNOTAVAIL 49 /* Cannot assign requested address */
+#undef TARGET_ENETDOWN
+#define TARGET_ENETDOWN 50 /* Network is down */
+#undef TARGET_ENETUNREACH
+#define TARGET_ENETUNREACH 51 /* Network is unreachable */
+#undef TARGET_ENETRESET
+#define TARGET_ENETRESET 52 /* Net dropped connection because of reset */
+#undef TARGET_ECONNABORTED
+#define TARGET_ECONNABORTED 53 /* Software caused connection abort */
+#undef TARGET_ECONNRESET
+#define TARGET_ECONNRESET 54 /* Connection reset by peer */
+#undef TARGET_ENOBUFS
+#define TARGET_ENOBUFS 55 /* No buffer space available */
+#undef TARGET_EISCONN
+#define TARGET_EISCONN 56 /* Transport endpoint is already connected */
+#undef TARGET_ENOTCONN
+#define TARGET_ENOTCONN 57 /* Transport endpoint is not connected */
+#undef TARGET_ESHUTDOWN
+#define TARGET_ESHUTDOWN 58 /* No send after transport endpoint shutdown*/
+#undef TARGET_ETOOMANYREFS
+#define TARGET_ETOOMANYREFS 59 /* Too many references: cannot splice */
+#undef TARGET_ETIMEDOUT
+#define TARGET_ETIMEDOUT 60 /* Connection timed out */
+#undef TARGET_ECONNREFUSED
+#define TARGET_ECONNREFUSED 61 /* Connection refused */
+#undef TARGET_ELOOP
+#define TARGET_ELOOP 62 /* Too many symbolic links encountered */
+#undef TARGET_ENAMETOOLONG
+#define TARGET_ENAMETOOLONG 63 /* File name too long */
+#undef TARGET_EHOSTDOWN
+#define TARGET_EHOSTDOWN 64 /* Host is down */
+#undef TARGET_EHOSTUNREACH
+#define TARGET_EHOSTUNREACH 65 /* No route to host */
+#undef TARGET_ENOTEMPTY
+#define TARGET_ENOTEMPTY 66 /* Directory not empty */
+#undef TARGET_EPROCLIM
+#define TARGET_EPROCLIM 67 /* SUNOS: Too many processes */
+#undef TARGET_EUSERS
+#define TARGET_EUSERS 68 /* Too many users */
+#undef TARGET_EDQUOT
+#define TARGET_EDQUOT 69 /* Quota exceeded */
+#undef TARGET_ESTALE
+#define TARGET_ESTALE 70 /* Stale file handle */
+#undef TARGET_EREMOTE
+#define TARGET_EREMOTE 71 /* Object is remote */
+#undef TARGET_ENOSTR
+#define TARGET_ENOSTR 72 /* Device not a stream */
+#undef TARGET_ETIME
+#define TARGET_ETIME 73 /* Timer expired */
+#undef TARGET_ENOSR
+#define TARGET_ENOSR 74 /* Out of streams resources */
+#undef TARGET_ENOMSG
+#define TARGET_ENOMSG 75 /* No message of desired type */
+#undef TARGET_EBADMSG
+#define TARGET_EBADMSG 76 /* Not a data message */
+#undef TARGET_EIDRM
+#define TARGET_EIDRM 77 /* Identifier removed */
+#undef TARGET_EDEADLK
+#define TARGET_EDEADLK 78 /* Resource deadlock would occur */
+#undef TARGET_ENOLCK
+#define TARGET_ENOLCK 79 /* No record locks available */
+#undef TARGET_ENONET
+#define TARGET_ENONET 80 /* Machine is not on the network */
+#undef TARGET_ERREMOTE
+#define TARGET_ERREMOTE 81 /* SunOS: Too many lvls of remote in path */
+#undef TARGET_ENOLINK
+#define TARGET_ENOLINK 82 /* Link has been severed */
+#undef TARGET_EADV
+#define TARGET_EADV 83 /* Advertise error */
+#undef TARGET_ESRMNT
+#define TARGET_ESRMNT 84 /* Srmount error */
+#undef TARGET_ECOMM
+#define TARGET_ECOMM 85 /* Communication error on send */
+#undef TARGET_EPROTO
+#define TARGET_EPROTO 86 /* Protocol error */
+#undef TARGET_EMULTIHOP
+#define TARGET_EMULTIHOP 87 /* Multihop attempted */
+#undef TARGET_EDOTDOT
+#define TARGET_EDOTDOT 88 /* RFS specific error */
+#undef TARGET_EREMCHG
+#define TARGET_EREMCHG 89 /* Remote address changed */
+#undef TARGET_ENOSYS
+#define TARGET_ENOSYS 90 /* Function not implemented */
+#undef TARGET_ESTRPIPE
+#define TARGET_ESTRPIPE 91 /* Streams pipe error */
+#undef TARGET_EOVERFLOW
+#define TARGET_EOVERFLOW 92 /* Value too large for defined data type */
+#undef TARGET_EBADFD
+#define TARGET_EBADFD 93 /* File descriptor in bad state */
+#undef TARGET_ECHRNG
+#define TARGET_ECHRNG 94 /* Channel number out of range */
+#undef TARGET_EL2NSYNC
+#define TARGET_EL2NSYNC 95 /* Level 2 not synchronized */
+#undef TARGET_EL3HLT
+#define TARGET_EL3HLT 96 /* Level 3 halted */
+#undef TARGET_EL3RST
+#define TARGET_EL3RST 97 /* Level 3 reset */
+#undef TARGET_ELNRNG
+#define TARGET_ELNRNG 98 /* Link number out of range */
+#undef TARGET_EUNATCH
+#define TARGET_EUNATCH 99 /* Protocol driver not attached */
+#undef TARGET_ENOCSI
+#define TARGET_ENOCSI 100 /* No CSI structure available */
+#undef TARGET_EL2HLT
+#define TARGET_EL2HLT 101 /* Level 2 halted */
+#undef TARGET_EBADE
+#define TARGET_EBADE 102 /* Invalid exchange */
+#undef TARGET_EBADR
+#define TARGET_EBADR 103 /* Invalid request descriptor */
+#undef TARGET_EXFULL
+#define TARGET_EXFULL 104 /* Exchange full */
+#undef TARGET_ENOANO
+#define TARGET_ENOANO 105 /* No anode */
+#undef TARGET_EBADRQC
+#define TARGET_EBADRQC 106 /* Invalid request code */
+#undef TARGET_EBADSLT
+#define TARGET_EBADSLT 107 /* Invalid slot */
+#undef TARGET_EDEADLOCK
+#define TARGET_EDEADLOCK 108 /* File locking deadlock error */
+#undef TARGET_EBFONT
+#define TARGET_EBFONT 109 /* Bad font file format */
+#undef TARGET_ELIBEXEC
+#define TARGET_ELIBEXEC 110 /* Cannot exec a shared library directly */
+#undef TARGET_ENODATA
+#define TARGET_ENODATA 111 /* No data available */
+#undef TARGET_ELIBBAD
+#define TARGET_ELIBBAD 112 /* Accessing a corrupted shared library */
+#undef TARGET_ENOPKG
+#define TARGET_ENOPKG 113 /* Package not installed */
+#undef TARGET_ELIBACC
+#define TARGET_ELIBACC 114 /* Can not access a needed shared library */
+#undef TARGET_ENOTUNIQ
+#define TARGET_ENOTUNIQ 115 /* Name not unique on network */
+#undef TARGET_ERESTART
+#define TARGET_ERESTART 116 /* Interrupted syscall should be restarted */
+#undef TARGET_EUCLEAN
+#define TARGET_EUCLEAN 117 /* Structure needs cleaning */
+#undef TARGET_ENOTNAM
+#define TARGET_ENOTNAM 118 /* Not a XENIX named type file */
+#undef TARGET_ENAVAIL
+#define TARGET_ENAVAIL 119 /* No XENIX semaphores available */
+#undef TARGET_EISNAM
+#define TARGET_EISNAM 120 /* Is a named type file */
+#undef TARGET_EREMOTEIO
+#define TARGET_EREMOTEIO 121 /* Remote I/O error */
+#undef TARGET_EILSEQ
+#define TARGET_EILSEQ 122 /* Illegal byte sequence */
+#undef TARGET_ELIBMAX
+#define TARGET_ELIBMAX 123 /* Atmpt to link in too many shared libs */
+#undef TARGET_ELIBSCN
+#define TARGET_ELIBSCN 124 /* .lib section in a.out corrupted */
+#undef TARGET_ENOMEDIUM
+#define TARGET_ENOMEDIUM 125 /* No medium found */
+#undef TARGET_EMEDIUMTYPE
+#define TARGET_EMEDIUMTYPE 126 /* Wrong medium type */
+#undef TARGET_ECANCELED
+#define TARGET_ECANCELED 127 /* Operation Cancelled */
+#undef TARGET_ENOKEY
+#define TARGET_ENOKEY 128 /* Required key not available */
+#undef TARGET_EKEYEXPIRED
+#define TARGET_EKEYEXPIRED 129 /* Key has expired */
+#undef TARGET_EKEYREVOKED
+#define TARGET_EKEYREVOKED 130 /* Key has been revoked */
+#undef TARGET_EKEYREJECTED
+#define TARGET_EKEYREJECTED 131 /* Key was rejected by service */
+#undef TARGET_EOWNERDEAD
+#define TARGET_EOWNERDEAD 132 /* Owner died */
+#undef TARGET_ENOTRECOVERABLE
+#define TARGET_ENOTRECOVERABLE 133 /* State not recoverable */
+#undef TARGET_ERFKILL
+#define TARGET_ERFKILL 134 /* Operation not possible due to RF-kill */
+#undef TARGET_EHWPOISON
+#define TARGET_EHWPOISON 135 /* Memory page has hardware error */
+#endif
diff --git a/linux-user/sparc/target_syscall.h b/linux-user/sparc/target_syscall.h
index 5f09abf..b9160a7 100644
--- a/linux-user/sparc/target_syscall.h
+++ b/linux-user/sparc/target_syscall.h
@@ -1,6 +1,8 @@
#ifndef SPARC_TARGET_SYSCALL_H
#define SPARC_TARGET_SYSCALL_H
+#include "target_errno.h"
+
struct target_pt_regs {
abi_ulong psr;
abi_ulong pc;
@@ -9,7 +11,7 @@ struct target_pt_regs {
abi_ulong u_regs[16];
};
-#define UNAME_MACHINE "sun4"
+#define UNAME_MACHINE "sparc"
#define UNAME_MINIMUM_RELEASE "2.6.32"
/* SPARC kernels don't define this in their Kconfig, but they have the
diff --git a/linux-user/sparc64/syscall_nr.h b/linux-user/sparc64/syscall_nr.h
index 2b49ead..9391645 100644
--- a/linux-user/sparc64/syscall_nr.h
+++ b/linux-user/sparc64/syscall_nr.h
@@ -23,7 +23,7 @@
#define TARGET_NR_capset 22 /* Linux Specific */
#define TARGET_NR_setuid 23 /* Implemented via setreuid in SunOS */
#define TARGET_NR_getuid 24 /* Common */
-/* #define TARGET_NR_time alias 25 ENOSYS under SunOS */
+#define TARGET_NR_vmsplice 25
#define TARGET_NR_ptrace 26 /* Common */
#define TARGET_NR_alarm 27 /* Implemented via setitimer in SunOS */
#define TARGET_NR_sigaltstack 28 /* Common */
@@ -149,8 +149,8 @@
#define TARGET_NR_pciconfig_read 148 /* ENOSYS under SunOS */
#define TARGET_NR_pciconfig_write 149 /* ENOSYS under SunOS */
#define TARGET_NR_getsockname 150 /* Common */
-/* #define TARGET_NR_getmsg 151 SunOS Specific */
-/* #define TARGET_NR_putmsg 152 SunOS Specific */
+#define TARGET_NR_inotify_init 151
+#define TARGET_NR_inotify_add_watch 152
#define TARGET_NR_poll 153 /* Common */
#define TARGET_NR_getdents64 154 /* Linux specific */
#define TARGET_NR_fcntl64 155 /* Linux sparc32 Specific */
@@ -194,7 +194,7 @@
#define TARGET_NR_epoll_create 193 /* Linux Specific */
#define TARGET_NR_epoll_ctl 194 /* Linux Specific */
#define TARGET_NR_epoll_wait 195 /* Linux Specific */
-/* #define TARGET_NR_ulimit 196 Linux Specific */
+#define TARGET_NR_ioprio_set 196
#define TARGET_NR_getppid 197 /* Linux Specific */
#define TARGET_NR_sigaction 198 /* Linux Specific */
#define TARGET_NR_sgetmask 199 /* Linux Specific */
@@ -216,7 +216,7 @@
#define TARGET_NR_ipc 215 /* Linux Specific */
#define TARGET_NR_sigreturn 216 /* Linux Specific */
#define TARGET_NR_clone 217 /* Linux Specific */
-/* #define TARGET_NR_modify_ldt 218 Linux Specific - i386 specific, unused */
+#define TARGET_NR_ioprio_get 218
#define TARGET_NR_adjtimex 219 /* Linux Specific */
#define TARGET_NR_sigprocmask 220 /* Linux Specific */
#define TARGET_NR_create_module 221 /* Linux Specific */
@@ -230,7 +230,7 @@
#define TARGET_NR_setfsgid 229 /* Linux Specific */
#define TARGET_NR__newselect 230 /* Linux Specific */
#define TARGET_NR_time 231 /* Linux sparc32 */
-/* #define TARGET_NR_oldstat 232 Linux Specific */
+#define TARGET_NR_splice 232
#define TARGET_NR_stime 233 /* Linux Specific */
#define TARGET_NR_statfs64 234 /* Linux Specific */
#define TARGET_NR_fstatfs64 235 /* Linux Specific */
@@ -253,7 +253,7 @@
#define TARGET_NR_getsid 252
#define TARGET_NR_fdatasync 253
#define TARGET_NR_nfsservctl 254
-#define TARGET_NR_aplib 255
+#define TARGET_NR_sync_file_range 255
#define TARGET_NR_clock_settime 256
#define TARGET_NR_clock_gettime 257
#define TARGET_NR_clock_getres 258
@@ -310,7 +310,7 @@
#define TARGET_NR_epoll_pwait 309
#define TARGET_NR_utimensat 310
#define TARGET_NR_signalfd 311
-#define TARGET_NR_timerfd 312
+#define TARGET_NR_timerfd_create 312
#define TARGET_NR_eventfd 313
#define TARGET_NR_fallocate 314
#define TARGET_NR_timerfd_settime 315
@@ -355,3 +355,7 @@
#define TARGET_NR_listen 354
#define TARGET_NR_setsockopt 355
#define TARGET_NR_mlock2 356
+#define TARGET_NR_copy_file_range 357
+#define TARGET_NR_preadv2 358
+#define TARGET_NR_pwritev2 359
+#define TARGET_NR_statx 360
diff --git a/linux-user/sparc64/target_syscall.h b/linux-user/sparc64/target_syscall.h
index 2cbbaae..3073a23 100644
--- a/linux-user/sparc64/target_syscall.h
+++ b/linux-user/sparc64/target_syscall.h
@@ -1,6 +1,8 @@
#ifndef SPARC64_TARGET_SYSCALL_H
#define SPARC64_TARGET_SYSCALL_H
+#include "../sparc/target_errno.h"
+
struct target_pt_regs {
abi_ulong u_regs[16];
abi_ulong tstate;
@@ -10,7 +12,7 @@ struct target_pt_regs {
abi_ulong fprs;
};
-#define UNAME_MACHINE "sun4u"
+#define UNAME_MACHINE "sparc64"
#define UNAME_MINIMUM_RELEASE "2.6.32"
/* SPARC kernels don't define this in their Kconfig, but they have the
@@ -29,5 +31,4 @@ static inline abi_ulong target_shmlba(CPUSPARCState *env)
{
return MAX(TARGET_PAGE_SIZE, 16 * 1024);
}
-
#endif /* SPARC64_TARGET_SYSCALL_H */
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index e482574..af8603f 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -6546,28 +6546,50 @@ static int target_to_host_fcntl_cmd(int cmd)
return -TARGET_EINVAL;
}
-#define TRANSTBL_CONVERT(a) { -1, TARGET_##a, -1, a }
-static const bitmask_transtbl flock_tbl[] = {
- TRANSTBL_CONVERT(F_RDLCK),
- TRANSTBL_CONVERT(F_WRLCK),
- TRANSTBL_CONVERT(F_UNLCK),
- TRANSTBL_CONVERT(F_EXLCK),
- TRANSTBL_CONVERT(F_SHLCK),
- { 0, 0, 0, 0 }
-};
+#define FLOCK_TRANSTBL \
+ switch (type) { \
+ TRANSTBL_CONVERT(F_RDLCK); \
+ TRANSTBL_CONVERT(F_WRLCK); \
+ TRANSTBL_CONVERT(F_UNLCK); \
+ TRANSTBL_CONVERT(F_EXLCK); \
+ TRANSTBL_CONVERT(F_SHLCK); \
+ }
+
+static int target_to_host_flock(int type)
+{
+#define TRANSTBL_CONVERT(a) case TARGET_##a: return a
+ FLOCK_TRANSTBL
+#undef TRANSTBL_CONVERT
+ return -TARGET_EINVAL;
+}
+
+static int host_to_target_flock(int type)
+{
+#define TRANSTBL_CONVERT(a) case a: return TARGET_##a
+ FLOCK_TRANSTBL
+#undef TRANSTBL_CONVERT
+ /* if we don't know how to convert the value coming
+ * from the host we copy to the target field as-is
+ */
+ return type;
+}
static inline abi_long copy_from_user_flock(struct flock64 *fl,
abi_ulong target_flock_addr)
{
struct target_flock *target_fl;
- short l_type;
+ int l_type;
if (!lock_user_struct(VERIFY_READ, target_fl, target_flock_addr, 1)) {
return -TARGET_EFAULT;
}
__get_user(l_type, &target_fl->l_type);
- fl->l_type = target_to_host_bitmask(l_type, flock_tbl);
+ l_type = target_to_host_flock(l_type);
+ if (l_type < 0) {
+ return l_type;
+ }
+ fl->l_type = l_type;
__get_user(fl->l_whence, &target_fl->l_whence);
__get_user(fl->l_start, &target_fl->l_start);
__get_user(fl->l_len, &target_fl->l_len);
@@ -6586,7 +6608,7 @@ static inline abi_long copy_to_user_flock(abi_ulong target_flock_addr,
return -TARGET_EFAULT;
}
- l_type = host_to_target_bitmask(fl->l_type, flock_tbl);
+ l_type = host_to_target_flock(fl->l_type);
__put_user(l_type, &target_fl->l_type);
__put_user(fl->l_whence, &target_fl->l_whence);
__put_user(fl->l_start, &target_fl->l_start);
@@ -6604,14 +6626,18 @@ static inline abi_long copy_from_user_oabi_flock64(struct flock64 *fl,
abi_ulong target_flock_addr)
{
struct target_oabi_flock64 *target_fl;
- short l_type;
+ int l_type;
if (!lock_user_struct(VERIFY_READ, target_fl, target_flock_addr, 1)) {
return -TARGET_EFAULT;
}
__get_user(l_type, &target_fl->l_type);
- fl->l_type = target_to_host_bitmask(l_type, flock_tbl);
+ l_type = target_to_host_flock(l_type);
+ if (l_type < 0) {
+ return l_type;
+ }
+ fl->l_type = l_type;
__get_user(fl->l_whence, &target_fl->l_whence);
__get_user(fl->l_start, &target_fl->l_start);
__get_user(fl->l_len, &target_fl->l_len);
@@ -6630,7 +6656,7 @@ static inline abi_long copy_to_user_oabi_flock64(abi_ulong target_flock_addr,
return -TARGET_EFAULT;
}
- l_type = host_to_target_bitmask(fl->l_type, flock_tbl);
+ l_type = host_to_target_flock(fl->l_type);
__put_user(l_type, &target_fl->l_type);
__put_user(fl->l_whence, &target_fl->l_whence);
__put_user(fl->l_start, &target_fl->l_start);
@@ -6645,14 +6671,18 @@ static inline abi_long copy_from_user_flock64(struct flock64 *fl,
abi_ulong target_flock_addr)
{
struct target_flock64 *target_fl;
- short l_type;
+ int l_type;
if (!lock_user_struct(VERIFY_READ, target_fl, target_flock_addr, 1)) {
return -TARGET_EFAULT;
}
__get_user(l_type, &target_fl->l_type);
- fl->l_type = target_to_host_bitmask(l_type, flock_tbl);
+ l_type = target_to_host_flock(l_type);
+ if (l_type < 0) {
+ return l_type;
+ }
+ fl->l_type = l_type;
__get_user(fl->l_whence, &target_fl->l_whence);
__get_user(fl->l_start, &target_fl->l_start);
__get_user(fl->l_len, &target_fl->l_len);
@@ -6671,7 +6701,7 @@ static inline abi_long copy_to_user_flock64(abi_ulong target_flock_addr,
return -TARGET_EFAULT;
}
- l_type = host_to_target_bitmask(fl->l_type, flock_tbl);
+ l_type = host_to_target_flock(fl->l_type);
__put_user(l_type, &target_fl->l_type);
__put_user(fl->l_whence, &target_fl->l_whence);
__put_user(fl->l_start, &target_fl->l_start);
diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
index 361bb83..e4cd87c 100644
--- a/linux-user/syscall_defs.h
+++ b/linux-user/syscall_defs.h
@@ -2441,6 +2441,15 @@ struct target_statfs64 {
#define TARGET_F_SETLKW 7
#define TARGET_F_GETOWN 11 /* for sockets. */
#define TARGET_F_SETOWN 12 /* for sockets. */
+#elif defined(TARGET_SPARC)
+#define TARGET_F_RDLCK 1
+#define TARGET_F_WRLCK 2
+#define TARGET_F_UNLCK 3
+#define TARGET_F_GETOWN 5 /* for sockets. */
+#define TARGET_F_SETOWN 6 /* for sockets. */
+#define TARGET_F_GETLK 7
+#define TARGET_F_SETLK 8
+#define TARGET_F_SETLKW 9
#else
#define TARGET_F_GETLK 5
#define TARGET_F_SETLK 6
@@ -2634,6 +2643,17 @@ struct target_statfs64 {
#define TARGET_O_SYNC (TARGET___O_SYNC | TARGET_O_DSYNC)
#endif
+#if defined(TARGET_SPARC)
+#define TARGET_ARCH_FLOCK_PAD abi_short __unused;
+#define TARGET_ARCH_FLOCK64_PAD abi_short __unused;
+#elif defined(TARGET_MIPS)
+#define TARGET_ARCH_FLOCK_PAD abi_long pad[4];
+#define TARGET_ARCH_FLOCK64_PAD
+#else
+#define TARGET_ARCH_FLOCK_PAD
+#define TARGET_ARCH_FLOCK64_PAD
+#endif
+
struct target_flock {
short l_type;
short l_whence;
@@ -2643,9 +2663,7 @@ struct target_flock {
abi_long l_sysid;
#endif
int l_pid;
-#if defined(TARGET_MIPS)
- abi_long pad[4];
-#endif
+ TARGET_ARCH_FLOCK_PAD
};
struct target_flock64 {
@@ -2654,6 +2672,7 @@ struct target_flock64 {
abi_llong l_start;
abi_llong l_len;
abi_int l_pid;
+ TARGET_ARCH_FLOCK64_PAD
};
struct target_f_owner_ex {
diff --git a/net/hub.c b/net/hub.c
index 5e84a9a..78b671e 100644
--- a/net/hub.c
+++ b/net/hub.c
@@ -23,8 +23,7 @@
/*
* A hub broadcasts incoming packets to all its ports except the source port.
- * Hubs can be used to provide independent network segments, also confusingly
- * named the QEMU 'vlan' feature.
+ * Hubs can be used to provide independent emulated network segments.
*/
typedef struct NetHub NetHub;
@@ -345,10 +344,10 @@ void net_hub_check_clients(void)
}
}
if (has_host_dev && !has_nic) {
- warn_report("vlan %d with no nics", hub->id);
+ warn_report("hub %d with no nics", hub->id);
}
if (has_nic && !has_host_dev) {
- warn_report("vlan %d is not connected to host network", hub->id);
+ warn_report("hub %d is not connected to host network", hub->id);
}
}
}
diff --git a/net/net.c b/net/net.c
index 29f8398..efb9eaf 100644
--- a/net/net.c
+++ b/net/net.c
@@ -965,7 +965,6 @@ static int net_client_init1(const void *object, bool is_netdev, Error **errp)
const Netdev *netdev;
const char *name;
NetClientState *peer = NULL;
- static bool vlan_warned;
if (is_netdev) {
netdev = object;
@@ -1036,15 +1035,10 @@ static int net_client_init1(const void *object, bool is_netdev, Error **errp)
return -1;
}
- /* Do not add to a vlan if it's a nic with a netdev= parameter. */
+ /* Do not add to a hub if it's a nic with a netdev= parameter. */
if (netdev->type != NET_CLIENT_DRIVER_NIC ||
!opts->u.nic.has_netdev) {
- peer = net_hub_add_port(net->has_vlan ? net->vlan : 0, NULL, NULL);
- }
-
- if (net->has_vlan && !vlan_warned) {
- error_report("'vlan' is deprecated. Please use 'netdev' instead.");
- vlan_warned = true;
+ peer = net_hub_add_port(0, NULL, NULL);
}
}
@@ -1365,7 +1359,7 @@ void qmp_set_link(const char *name, bool up, Error **errp)
* If the peer is a HUBPORT or a backend, we do not change the
* link status.
*
- * This behavior is compatible with qemu vlans where there could be
+ * This behavior is compatible with qemu hubs where there could be
* multiple clients that can still communicate with each other in
* disconnected mode. For now maintain this compatibility.
*/
@@ -1502,11 +1496,12 @@ static int net_param_nic(void *dummy, QemuOpts *opts, Error **errp)
g_free(mac);
if (ret) {
error_setg(errp, "invalid syntax for ethernet address");
- return -1;
+ goto out;
}
if (is_multicast_ether_addr(ni->macaddr.a)) {
error_setg(errp, "NIC cannot have multicast MAC address");
- return -1;
+ ret = -1;
+ goto out;
}
}
qemu_macaddr_default_if_unset(&ni->macaddr);
@@ -1518,6 +1513,7 @@ static int net_param_nic(void *dummy, QemuOpts *opts, Error **errp)
nb_nics++;
}
+out:
g_free(nd_id);
return ret;
}
diff --git a/net/slirp.c b/net/slirp.c
index 8991816..6922524 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -415,7 +415,7 @@ static SlirpState *slirp_lookup(Monitor *mon, const char *hub_id,
if (hub_id) {
nc = net_hub_find_client_by_name(strtol(hub_id, NULL, 0), name);
if (!nc) {
- monitor_printf(mon, "unrecognized (vlan-id, stackname) pair\n");
+ monitor_printf(mon, "unrecognized (hub-id, stackname) pair\n");
return NULL;
}
} else {
@@ -870,9 +870,9 @@ void hmp_info_usernet(Monitor *mon, const QDict *qdict)
QTAILQ_FOREACH(s, &slirp_stacks, entry) {
int id;
- bool got_vlan_id = net_hub_id_for_client(&s->nc, &id) == 0;
- monitor_printf(mon, "VLAN %d (%s):\n",
- got_vlan_id ? id : -1,
+ bool got_hub_id = net_hub_id_for_client(&s->nc, &id) == 0;
+ monitor_printf(mon, "Hub %d (%s):\n",
+ got_hub_id ? id : -1,
s->nc.name);
slirp_connection_info(s->slirp, mon);
}
diff --git a/net/tap.c b/net/tap.c
index 2b3a36f..de05f20 100644
--- a/net/tap.c
+++ b/net/tap.c
@@ -766,10 +766,10 @@ int net_init_tap(const Netdev *netdev, const char *name,
queues = tap->has_queues ? tap->queues : 1;
vhostfdname = tap->has_vhostfd ? tap->vhostfd : NULL;
- /* QEMU vlans does not support multiqueue tap, in this case peer is set.
+ /* QEMU hubs do not support multiqueue tap, in this case peer is set.
* For -netdev, peer is always NULL. */
if (peer && (tap->has_queues || tap->has_fds || tap->has_vhostfds)) {
- error_setg(errp, "Multiqueue tap cannot be used with QEMU vlans");
+ error_setg(errp, "Multiqueue tap cannot be used with hubs");
return -1;
}
diff --git a/pc-bios/s390-ccw/cio.h b/pc-bios/s390-ccw/cio.h
index 55eaeee..1a0795f 100644
--- a/pc-bios/s390-ccw/cio.h
+++ b/pc-bios/s390-ccw/cio.h
@@ -125,7 +125,7 @@ struct tpi_info {
__u32 reserved3 : 12;
__u32 int_type : 3;
__u32 reserved4 : 12;
-} __attribute__ ((packed));
+} __attribute__ ((packed, aligned(4)));
/* channel command word (type 1) */
struct ccw1 {
diff --git a/qapi/block-core.json b/qapi/block-core.json
index c50517b..21c3470 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
@@ -2530,6 +2530,10 @@
# @locking: whether to enable file locking. If set to 'auto', only enable
# when Open File Descriptor (OFD) locking API is available
# (default: auto, since 2.10)
+# @x-check-cache-dropped: whether to check that page cache was dropped on live
+# migration. May cause noticeable delays if the image
+# file is large, do not use in production.
+# (default: off) (since: 2.13)
#
# Since: 2.9
##
@@ -2537,7 +2541,8 @@
'data': { 'filename': 'str',
'*pr-manager': 'str',
'*locking': 'OnOffAuto',
- '*aio': 'BlockdevAioOptions' } }
+ '*aio': 'BlockdevAioOptions',
+ '*x-check-cache-dropped': 'bool' } }
##
# @BlockdevOptionsNull:
diff --git a/qapi/net.json b/qapi/net.json
index 9117c56..b4fe4b6 100644
--- a/qapi/net.json
+++ b/qapi/net.json
@@ -209,7 +209,7 @@
##
# @NetdevTapOptions:
#
-# Connect the host TAP network interface name to the VLAN.
+# Used to configure a host TAP network interface backend.
#
# @ifname: interface name
#
@@ -267,8 +267,8 @@
##
# @NetdevSocketOptions:
#
-# Connect the VLAN to a remote VLAN in another QEMU virtual machine using a TCP
-# socket connection.
+# Socket netdevs are used to establish a network connection to another
+# QEMU virtual machine via a TCP socket.
#
# @fd: file descriptor of an already opened socket
#
@@ -296,7 +296,7 @@
##
# @NetdevL2TPv3Options:
#
-# Connect the VLAN to Ethernet over L2TPv3 Static tunnel
+# Configure an Ethernet over L2TPv3 tunnel.
#
# @src: source address
#
@@ -352,7 +352,7 @@
##
# @NetdevVdeOptions:
#
-# Connect the VLAN to a vde switch running on the host.
+# Connect to a vde switch running on the host.
#
# @sock: socket path
#
@@ -490,8 +490,6 @@
#
# Captures the configuration of a network device; legacy.
#
-# @vlan: vlan number
-#
# @id: identifier for monitor commands
#
# @name: identifier for monitor commands, ignored if @id is present
@@ -499,10 +497,11 @@
# @opts: device type specific properties (legacy)
#
# Since: 1.2
+#
+# 'vlan' - removed with 2.12
##
{ 'struct': 'NetLegacy',
'data': {
- '*vlan': 'int32',
'*id': 'str',
'*name': 'str',
'opts': 'NetLegacyOptions' } }
diff --git a/qemu-doc.texi b/qemu-doc.texi
index 715bd33..0e0e0ae 100644
--- a/qemu-doc.texi
+++ b/qemu-doc.texi
@@ -715,20 +715,12 @@ state is not saved or restored properly (in particular USB).
@node pcsys_network
@section Network emulation
-QEMU can simulate several network cards (PCI or ISA cards on the PC
-target) and can connect them to an arbitrary number of Virtual Local
-Area Networks (VLANs). Host TAP devices can be connected to any QEMU
-VLAN. VLAN can be connected between separate instances of QEMU to
-simulate large networks. For simpler usage, a non privileged user mode
-network stack can replace the TAP device to have a basic network
-connection.
-
-@subsection VLANs
-
-QEMU simulates several VLANs. A VLAN can be symbolised as a virtual
-connection between several network devices. These devices can be for
-example QEMU virtual Ethernet cards or virtual Host ethernet devices
-(TAP devices).
+QEMU can simulate several network cards (e.g. PCI or ISA cards on the PC
+target) and can connect them to a network backend on the host or an emulated
+hub. The various host network backends can either be used to connect the NIC of
+the guest to a real network (e.g. by using a TAP devices or the non-privileged
+user mode network stack), or to other guest instances running in another QEMU
+process (e.g. by using the socket host network backend).
@subsection Using TAP network interfaces
@@ -764,7 +756,7 @@ network). The virtual network configuration is the following:
@example
- QEMU VLAN <------> Firewall/DHCP server <-----> Internet
+ guest (10.0.2.15) <------> Firewall/DHCP server <-----> Internet
| (10.0.2.2)
|
----> DNS server (10.0.2.3)
@@ -799,11 +791,23 @@ When using the @option{'-netdev user,hostfwd=...'} option, TCP or UDP
connections can be redirected from the host to the guest. It allows for
example to redirect X11, telnet or SSH connections.
-@subsection Connecting VLANs between QEMU instances
+@subsection Hubs
+
+QEMU can simulate several hubs. A hub can be thought of as a virtual connection
+between several network devices. These devices can be for example QEMU virtual
+ethernet cards or virtual Host ethernet devices (TAP devices). You can connect
+guest NICs or host network backends to such a hub using the @option{-netdev
+hubport} or @option{-nic hubport} options. The legacy @option{-net} option
+also connects the given device to the emulated hub with ID 0 (i.e. the default
+hub) unless you specify a netdev with @option{-net nic,netdev=xxx} here.
-Using the @option{-net socket} option, it is possible to make VLANs
-that span several QEMU instances. See @ref{sec_invocation} to have a
-basic example.
+@subsection Connecting emulated networks between QEMU instances
+
+Using the @option{-netdev socket} (or @option{-nic socket} or
+@option{-net socket}) option, it is possible to create emulated
+networks that span several QEMU instances.
+See the description of the @option{-netdev socket} option in the
+@ref{sec_invocation,,Invocation chapter} to have a basic example.
@node pcsys_other_devs
@section Other Devices
@@ -2846,15 +2850,6 @@ with ``-device ...,netdev=x''), or ``-nic user,smb=/some/dir''
(for embedded NICs). The new syntax allows different settings to be
provided per NIC.
-@subsection -net vlan (since 2.9.0)
-
-The ``-net vlan=NN'' argument was mostly used to attach separate
-network backends to different virtual NICs. This is the default
-behavior for ``-netdev'' and ``-nic''. You can connect multiple
-``-netdev'' and ``-nic'' devices to the same network using the
-"hubport" network backend, created with ``-netdev hubport,hubid=NN,...''
-and ``-nic hubport,hubid=NN''.
-
@subsection -drive cyls=...,heads=...,secs=...,trans=... (since 2.10.0)
The drive geometry arguments are replaced by the the geometry arguments
diff --git a/qemu-options.hx b/qemu-options.hx
index b2fefd1..abbfa6a 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -2003,7 +2003,7 @@ DEF("netdev", HAS_ARG, QEMU_OPTION_netdev,
" configure a vhost-user network, backed by a chardev 'dev'\n"
#endif
"-netdev hubport,id=str,hubid=n[,netdev=nd]\n"
- " configure a hub port on QEMU VLAN 'n'\n", QEMU_ARCH_ALL)
+ " configure a hub port on the hub with ID 'n'\n", QEMU_ARCH_ALL)
DEF("nic", HAS_ARG, QEMU_OPTION_nic,
"--nic [tap|bridge|"
#ifdef CONFIG_SLIRP
@@ -2028,10 +2028,9 @@ DEF("nic", HAS_ARG, QEMU_OPTION_nic,
" provided a 'user' network connection)\n",
QEMU_ARCH_ALL)
DEF("net", HAS_ARG, QEMU_OPTION_net,
- "-net nic[,vlan=n][,netdev=nd][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]\n"
+ "-net nic[,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]\n"
" configure or create an on-board (or machine default) NIC and\n"
- " connect it either to VLAN 'n' or the netdev 'nd' (for pluggable\n"
- " NICs please use '-device devtype,netdev=nd' instead)\n"
+ " connect it to hub 0 (please use -nic unless you need a hub)\n"
"-net ["
#ifdef CONFIG_SLIRP
"user|"
@@ -2044,7 +2043,7 @@ DEF("net", HAS_ARG, QEMU_OPTION_net,
#ifdef CONFIG_NETMAP
"netmap|"
#endif
- "socket][,vlan=n][,option][,option][,...]\n"
+ "socket][,option][,option][,...]\n"
" old way to initialize a host network interface\n"
" (use the -netdev option if possible instead)\n", QEMU_ARCH_ALL)
STEXI
@@ -2462,17 +2461,14 @@ qemu -m 512 -object memory-backend-file,id=mem,size=512M,mem-path=/hugetlbfs,sha
Create a hub port on the emulated hub with ID @var{hubid}.
The hubport netdev lets you connect a NIC to a QEMU emulated hub instead of a
-single netdev. @code{-net} and @code{-device} with the parameter @option{vlan}
-(deprecated), or @code{-nic hubport} can also be used to connect a
-network device or a NIC to a hub. Alternatively, you can also connect the
-hubport to another netdev with ID @var{nd} by using the @option{netdev=@var{nd}}
-option.
+single netdev. Alternatively, you can also connect the hubport to another
+netdev with ID @var{nd} by using the @option{netdev=@var{nd}} option.
-@item -net nic[,vlan=@var{n}][,netdev=@var{nd}][,macaddr=@var{mac}][,model=@var{type}] [,name=@var{name}][,addr=@var{addr}][,vectors=@var{v}]
+@item -net nic[,netdev=@var{nd}][,macaddr=@var{mac}][,model=@var{type}] [,name=@var{name}][,addr=@var{addr}][,vectors=@var{v}]
@findex -net
Legacy option to configure or create an on-board (or machine default) Network
-Interface Card(NIC) and connect it either to the emulated hub port ("vlan")
-with number @var{n} (@var{n} = 0 is the default), or to the netdev @var{nd}.
+Interface Card(NIC) and connect it either to the emulated hub with ID 0 (i.e.
+the default hub), or to the netdev @var{nd}.
The NIC is an e1000 by default on the PC target. Optionally, the MAC address
can be changed to @var{mac}, the device address set to @var{addr} (PCI cards
only), and a @var{name} can be assigned for use in monitor commands.
@@ -2482,11 +2478,10 @@ that the card should have; this option currently only affects virtio cards; set
NIC is created. QEMU can emulate several different models of network card.
Use @code{-net nic,model=help} for a list of available devices for your target.
-@item -net user|tap|bridge|socket|l2tpv3|vde[,...][,vlan=@var{n}][,name=@var{name}]
+@item -net user|tap|bridge|socket|l2tpv3|vde[,...][,name=@var{name}]
Configure a host network backend (with the options corresponding to the same
-@option{-netdev} option) and connect it to the emulated hub ("vlan") with the
-number @var{n} (default is number 0). Use @var{name} to specify the name of the
-hub port.
+@option{-netdev} option) and connect it to the emulated hub 0 (the default
+hub). Use @var{name} to specify the name of the hub port.
ETEXI
STEXI
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index e73b4ef..cb1b652 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -224,9 +224,8 @@ our $NonptrType;
our $Type;
our $Declare;
-our $UTF8 = qr {
- [\x09\x0A\x0D\x20-\x7E] # ASCII
- | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
+our $NON_ASCII_UTF8 = qr{
+ [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
@@ -235,6 +234,11 @@ our $UTF8 = qr {
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
}x;
+our $UTF8 = qr{
+ [\x09\x0A\x0D\x20-\x7E] # ASCII
+ | $NON_ASCII_UTF8
+}x;
+
# There are still some false positives, but this catches most
# common cases.
our $typeTypedefs = qr{(?x:
@@ -1207,6 +1211,11 @@ sub process {
my $signoff = 0;
my $is_patch = 0;
+ my $in_header_lines = $file ? 0 : 1;
+ my $in_commit_log = 0; #Scanning lines before patch
+ my $reported_maintainer_file = 0;
+ my $non_utf8_charset = 0;
+
our @report = ();
our $cnt_lines = 0;
our $cnt_error = 0;
@@ -1359,7 +1368,6 @@ sub process {
if ($line =~ /^diff --git.*?(\S+)$/) {
$realfile = $1;
$realfile =~ s@^([^/]*)/@@;
-
} elsif ($line =~ /^\+\+\+\s+(\S+)/) {
$realfile = $1;
$realfile =~ s@^([^/]*)/@@;
@@ -1398,6 +1406,8 @@ sub process {
if ($line =~ /^\s*signed-off-by:/i) {
# This is a signoff, if ugly, so do not double report.
$signoff++;
+ $in_commit_log = 0;
+
if (!($line =~ /^\s*Signed-off-by:/)) {
ERROR("The correct form is \"Signed-off-by\"\n" .
$herecurr);
@@ -1408,6 +1418,22 @@ sub process {
}
}
+# Check if MAINTAINERS is being updated. If so, there's probably no need to
+# emit the "does MAINTAINERS need updating?" message on file add/move/delete
+ if ($line =~ /^\s*MAINTAINERS\s*\|/) {
+ $reported_maintainer_file = 1;
+ }
+
+# Check for added, moved or deleted files
+ if (!$reported_maintainer_file && !$in_commit_log &&
+ ($line =~ /^(?:new|deleted) file mode\s*\d+\s*$/ ||
+ $line =~ /^rename (?:from|to) [\w\/\.\-]+\s*$/ ||
+ ($line =~ /\{\s*([\w\/\.\-]*)\s*\=\>\s*([\w\/\.\-]*)\s*\}/ &&
+ (defined($1) || defined($2))))) {
+ $reported_maintainer_file = 1;
+ WARN("added, moved or deleted file(s), does MAINTAINERS need updating?\n" . $herecurr);
+ }
+
# Check for wrappage within a valid hunk of the file
if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
ERROR("patch seems to be corrupt (line wrapped?)\n" .
@@ -1426,6 +1452,28 @@ sub process {
ERROR("Invalid UTF-8, patch and commit message should be encoded in UTF-8\n" . $hereptr);
}
+# Check if it's the start of a commit log
+# (not a header line and we haven't seen the patch filename)
+ if ($in_header_lines && $realfile =~ /^$/ &&
+ !($rawline =~ /^\s+\S/ ||
+ $rawline =~ /^(commit\b|from\b|[\w-]+:).*$/i)) {
+ $in_header_lines = 0;
+ $in_commit_log = 1;
+ }
+
+# Check if there is UTF-8 in a commit log when a mail header has explicitly
+# declined it, i.e defined some charset where it is missing.
+ if ($in_header_lines &&
+ $rawline =~ /^Content-Type:.+charset="(.+)".*$/ &&
+ $1 !~ /utf-8/i) {
+ $non_utf8_charset = 1;
+ }
+
+ if ($in_commit_log && $non_utf8_charset && $realfile =~ /^$/ &&
+ $rawline =~ /$NON_ASCII_UTF8/) {
+ WARN("8-bit UTF-8 used in possible commit log\n" . $herecurr);
+ }
+
# ignore non-hunk lines and lines being removed
next if (!$hunk_line || $line =~ /^-/);
diff --git a/target/m68k/softfloat.c b/target/m68k/softfloat.c
index e41b07d..d093997 100644
--- a/target/m68k/softfloat.c
+++ b/target/m68k/softfloat.c
@@ -103,6 +103,7 @@ floatx80 floatx80_mod(floatx80 a, floatx80 b, float_status *status)
mul64To128(bSig, qTemp, &term0, &term1);
sub128(aSig0, aSig1, term0, term1, &aSig0, &aSig1);
shortShift128Left(aSig0, aSig1, 62, &aSig0, &aSig1);
+ expDiff -= 62;
}
expDiff += 64;
if (0 < expDiff) {
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index 3ee40f0..6629a53 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -686,6 +686,32 @@ static inline uint64_t s390_build_validity_mcic(void)
return mcic;
}
+static inline void s390_do_cpu_full_reset(CPUState *cs, run_on_cpu_data arg)
+{
+ cpu_reset(cs);
+}
+
+static inline void s390_do_cpu_reset(CPUState *cs, run_on_cpu_data arg)
+{
+ S390CPUClass *scc = S390_CPU_GET_CLASS(cs);
+
+ scc->cpu_reset(cs);
+}
+
+static inline void s390_do_cpu_initial_reset(CPUState *cs, run_on_cpu_data arg)
+{
+ S390CPUClass *scc = S390_CPU_GET_CLASS(cs);
+
+ scc->initial_cpu_reset(cs);
+}
+
+static inline void s390_do_cpu_load_normal(CPUState *cs, run_on_cpu_data arg)
+{
+ S390CPUClass *scc = S390_CPU_GET_CLASS(cs);
+
+ scc->load_normal(cs);
+}
+
/* cpu.c */
int s390_get_clock(uint8_t *tod_high, uint64_t *tod_low);
diff --git a/target/s390x/diag.c b/target/s390x/diag.c
index a755837..ac2c40f 100644
--- a/target/s390x/diag.c
+++ b/target/s390x/diag.c
@@ -22,51 +22,6 @@
#include "hw/s390x/ipl.h"
#include "hw/s390x/s390-virtio-ccw.h"
-static int modified_clear_reset(S390CPU *cpu)
-{
- S390CPUClass *scc = S390_CPU_GET_CLASS(cpu);
- CPUState *t;
-
- pause_all_vcpus();
- cpu_synchronize_all_states();
- CPU_FOREACH(t) {
- run_on_cpu(t, s390_do_cpu_full_reset, RUN_ON_CPU_NULL);
- }
- s390_cmma_reset();
- subsystem_reset();
- s390_crypto_reset();
- scc->load_normal(CPU(cpu));
- cpu_synchronize_all_post_reset();
- resume_all_vcpus();
- return 0;
-}
-
-static inline void s390_do_cpu_reset(CPUState *cs, run_on_cpu_data arg)
-{
- S390CPUClass *scc = S390_CPU_GET_CLASS(cs);
-
- scc->cpu_reset(cs);
-}
-
-static int load_normal_reset(S390CPU *cpu)
-{
- S390CPUClass *scc = S390_CPU_GET_CLASS(cpu);
- CPUState *t;
-
- pause_all_vcpus();
- cpu_synchronize_all_states();
- CPU_FOREACH(t) {
- run_on_cpu(t, s390_do_cpu_reset, RUN_ON_CPU_NULL);
- }
- s390_cmma_reset();
- subsystem_reset();
- scc->initial_cpu_reset(CPU(cpu));
- scc->load_normal(CPU(cpu));
- cpu_synchronize_all_post_reset();
- resume_all_vcpus();
- return 0;
-}
-
int handle_diag_288(CPUS390XState *env, uint64_t r1, uint64_t r3)
{
uint64_t func = env->regs[r1];
@@ -101,6 +56,7 @@ int handle_diag_288(CPUS390XState *env, uint64_t r1, uint64_t r3)
void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3, uintptr_t ra)
{
+ CPUState *cs = CPU(s390_env_get_cpu(env));
uint64_t addr = env->regs[r1];
uint64_t subcode = env->regs[r3];
IplParameterBlock *iplb;
@@ -117,22 +73,13 @@ void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3, uintptr_t ra)
switch (subcode) {
case 0:
- modified_clear_reset(s390_env_get_cpu(env));
- if (tcg_enabled()) {
- cpu_loop_exit(CPU(s390_env_get_cpu(env)));
- }
+ s390_ipl_reset_request(cs, S390_RESET_MODIFIED_CLEAR);
break;
case 1:
- load_normal_reset(s390_env_get_cpu(env));
- if (tcg_enabled()) {
- cpu_loop_exit(CPU(s390_env_get_cpu(env)));
- }
+ s390_ipl_reset_request(cs, S390_RESET_LOAD_NORMAL);
break;
case 3:
- s390_reipl_request();
- if (tcg_enabled()) {
- cpu_loop_exit(CPU(s390_env_get_cpu(env)));
- }
+ s390_ipl_reset_request(cs, S390_RESET_REIPL);
break;
case 5:
if ((r1 & 1) || (addr & 0x0fffULL)) {
diff --git a/target/s390x/internal.h b/target/s390x/internal.h
index d911e84..e392a02 100644
--- a/target/s390x/internal.h
+++ b/target/s390x/internal.h
@@ -273,12 +273,6 @@ static inline hwaddr decode_basedisp_s(CPUS390XState *env, uint32_t ipb,
/* Base/displacement are at the same locations. */
#define decode_basedisp_rs decode_basedisp_s
-static inline void s390_do_cpu_full_reset(CPUState *cs, run_on_cpu_data arg)
-{
- cpu_reset(cs);
-}
-
-
/* arch_dump.c */
int s390_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
int cpuid, void *opaque);
diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
index 12b90cf..58e4380 100644
--- a/target/s390x/kvm.c
+++ b/target/s390x/kvm.c
@@ -1767,7 +1767,7 @@ int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
ret = handle_intercept(cpu);
break;
case KVM_EXIT_S390_RESET:
- s390_reipl_request();
+ s390_ipl_reset_request(cs, S390_RESET_REIPL);
break;
case KVM_EXIT_S390_TSCH:
ret = handle_tsch(cpu);
diff --git a/target/s390x/misc_helper.c b/target/s390x/misc_helper.c
index e0b23c1..1f834f3 100644
--- a/target/s390x/misc_helper.c
+++ b/target/s390x/misc_helper.c
@@ -206,7 +206,7 @@ uint32_t HELPER(stsi)(CPUS390XState *env, uint64_t a0, uint64_t r0, uint64_t r1)
const MachineState *ms = MACHINE(qdev_get_machine());
uint16_t total_cpus = 0, conf_cpus = 0, reserved_cpus = 0;
S390CPU *cpu = s390_env_get_cpu(env);
- SysIB sysib = { 0 };
+ SysIB sysib = { };
int i, cc = 0;
if ((r0 & STSI_R0_FC_MASK) > STSI_R0_FC_LEVEL_3) {