Compare commits
24 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
46300ebc38 | ||
|
57d9378af9 | ||
|
55b151b6a6 | ||
|
8f7bb1266f | ||
|
b932f9fbd4 | ||
|
0d2c267638 | ||
|
aea89f4179 | ||
|
46fdbe667d | ||
|
6a2774e8ae | ||
|
d7e7f342c6 | ||
|
38fb9d1edc | ||
|
8c56d9f61a | ||
|
40e04161b3 | ||
|
df0e72dc86 | ||
|
5d9f2461b4 | ||
|
1229d60714 | ||
|
f4564fc8d2 | ||
|
1649e9559b | ||
|
40682cfcea | ||
|
d08c1fd6db | ||
|
1798f38242 | ||
|
fdbeeb454c | ||
|
fa275f2211 | ||
|
3e09472893 |
@@ -158,9 +158,9 @@ build-system-centos:
|
||||
- .native_build_job_template
|
||||
- .native_build_artifact_template
|
||||
needs:
|
||||
job: amd64-centos8-container
|
||||
job: amd64-centos9-container
|
||||
variables:
|
||||
IMAGE: centos8
|
||||
IMAGE: centos9
|
||||
CONFIGURE_ARGS: --disable-nettle --enable-gcrypt --enable-vfio-user-server
|
||||
--enable-modules --enable-trace-backends=dtrace --enable-docs
|
||||
TARGETS: ppc64-softmmu or1k-softmmu s390x-softmmu
|
||||
@@ -173,7 +173,7 @@ check-system-centos:
|
||||
- job: build-system-centos
|
||||
artifacts: true
|
||||
variables:
|
||||
IMAGE: centos8
|
||||
IMAGE: centos9
|
||||
MAKE_CHECK_ARGS: check
|
||||
|
||||
avocado-system-centos:
|
||||
@@ -182,7 +182,7 @@ avocado-system-centos:
|
||||
- job: build-system-centos
|
||||
artifacts: true
|
||||
variables:
|
||||
IMAGE: centos8
|
||||
IMAGE: centos9
|
||||
MAKE_CHECK_ARGS: check-avocado
|
||||
AVOCADO_TAGS: arch:ppc64 arch:or1k arch:390x arch:x86_64 arch:rx
|
||||
arch:sh4 arch:nios2
|
||||
@@ -258,9 +258,9 @@ avocado-system-flaky:
|
||||
build-tcg-disabled:
|
||||
extends: .native_build_job_template
|
||||
needs:
|
||||
job: amd64-centos8-container
|
||||
job: amd64-centos9-container
|
||||
variables:
|
||||
IMAGE: centos8
|
||||
IMAGE: centos9
|
||||
script:
|
||||
- mkdir build
|
||||
- cd build
|
||||
@@ -585,9 +585,9 @@ build-tci:
|
||||
build-without-defaults:
|
||||
extends: .native_build_job_template
|
||||
needs:
|
||||
job: amd64-centos8-container
|
||||
job: amd64-centos9-container
|
||||
variables:
|
||||
IMAGE: centos8
|
||||
IMAGE: centos9
|
||||
CONFIGURE_ARGS:
|
||||
--without-default-devices
|
||||
--without-default-features
|
||||
|
@@ -1,10 +1,10 @@
|
||||
include:
|
||||
- local: '/.gitlab-ci.d/container-template.yml'
|
||||
|
||||
amd64-centos8-container:
|
||||
amd64-centos9-container:
|
||||
extends: .container_job_template
|
||||
variables:
|
||||
NAME: centos8
|
||||
NAME: centos9
|
||||
|
||||
amd64-fedora-container:
|
||||
extends: .container_job_template
|
||||
|
@@ -712,7 +712,7 @@ static void tb_record(TranslationBlock *tb)
|
||||
tb_page_addr_t paddr0 = tb_page_addr0(tb);
|
||||
tb_page_addr_t paddr1 = tb_page_addr1(tb);
|
||||
tb_page_addr_t pindex0 = paddr0 >> TARGET_PAGE_BITS;
|
||||
tb_page_addr_t pindex1 = paddr0 >> TARGET_PAGE_BITS;
|
||||
tb_page_addr_t pindex1 = paddr1 >> TARGET_PAGE_BITS;
|
||||
|
||||
assert(paddr0 != -1);
|
||||
if (unlikely(paddr1 != -1) && pindex0 != pindex1) {
|
||||
@@ -744,7 +744,7 @@ static void tb_remove(TranslationBlock *tb)
|
||||
tb_page_addr_t paddr0 = tb_page_addr0(tb);
|
||||
tb_page_addr_t paddr1 = tb_page_addr1(tb);
|
||||
tb_page_addr_t pindex0 = paddr0 >> TARGET_PAGE_BITS;
|
||||
tb_page_addr_t pindex1 = paddr0 >> TARGET_PAGE_BITS;
|
||||
tb_page_addr_t pindex1 = paddr1 >> TARGET_PAGE_BITS;
|
||||
|
||||
assert(paddr0 != -1);
|
||||
if (unlikely(paddr1 != -1) && pindex0 != pindex1) {
|
||||
|
98
block.c
98
block.c
@@ -86,6 +86,7 @@ static BlockDriverState *bdrv_open_inherit(const char *filename,
|
||||
BlockDriverState *parent,
|
||||
const BdrvChildClass *child_class,
|
||||
BdrvChildRole child_role,
|
||||
bool parse_filename,
|
||||
Error **errp);
|
||||
|
||||
static bool bdrv_recurse_has_child(BlockDriverState *bs,
|
||||
@@ -2047,7 +2048,8 @@ static void parse_json_protocol(QDict *options, const char **pfilename,
|
||||
* block driver has been specified explicitly.
|
||||
*/
|
||||
static int bdrv_fill_options(QDict **options, const char *filename,
|
||||
int *flags, Error **errp)
|
||||
int *flags, bool allow_parse_filename,
|
||||
Error **errp)
|
||||
{
|
||||
const char *drvname;
|
||||
bool protocol = *flags & BDRV_O_PROTOCOL;
|
||||
@@ -2089,7 +2091,7 @@ static int bdrv_fill_options(QDict **options, const char *filename,
|
||||
if (protocol && filename) {
|
||||
if (!qdict_haskey(*options, "filename")) {
|
||||
qdict_put_str(*options, "filename", filename);
|
||||
parse_filename = true;
|
||||
parse_filename = allow_parse_filename;
|
||||
} else {
|
||||
error_setg(errp, "Can't specify 'file' and 'filename' options at "
|
||||
"the same time");
|
||||
@@ -3675,7 +3677,8 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *parent_options,
|
||||
}
|
||||
|
||||
backing_hd = bdrv_open_inherit(backing_filename, reference, options, 0, bs,
|
||||
&child_of_bds, bdrv_backing_role(bs), errp);
|
||||
&child_of_bds, bdrv_backing_role(bs), true,
|
||||
errp);
|
||||
if (!backing_hd) {
|
||||
bs->open_flags |= BDRV_O_NO_BACKING;
|
||||
error_prepend(errp, "Could not open backing file: ");
|
||||
@@ -3712,7 +3715,8 @@ free_exit:
|
||||
static BlockDriverState *
|
||||
bdrv_open_child_bs(const char *filename, QDict *options, const char *bdref_key,
|
||||
BlockDriverState *parent, const BdrvChildClass *child_class,
|
||||
BdrvChildRole child_role, bool allow_none, Error **errp)
|
||||
BdrvChildRole child_role, bool allow_none,
|
||||
bool parse_filename, Error **errp)
|
||||
{
|
||||
BlockDriverState *bs = NULL;
|
||||
QDict *image_options;
|
||||
@@ -3743,7 +3747,8 @@ bdrv_open_child_bs(const char *filename, QDict *options, const char *bdref_key,
|
||||
}
|
||||
|
||||
bs = bdrv_open_inherit(filename, reference, image_options, 0,
|
||||
parent, child_class, child_role, errp);
|
||||
parent, child_class, child_role, parse_filename,
|
||||
errp);
|
||||
if (!bs) {
|
||||
goto done;
|
||||
}
|
||||
@@ -3753,6 +3758,37 @@ done:
|
||||
return bs;
|
||||
}
|
||||
|
||||
static BdrvChild *bdrv_open_child_common(const char *filename,
|
||||
QDict *options, const char *bdref_key,
|
||||
BlockDriverState *parent,
|
||||
const BdrvChildClass *child_class,
|
||||
BdrvChildRole child_role,
|
||||
bool allow_none, bool parse_filename,
|
||||
Error **errp)
|
||||
{
|
||||
BlockDriverState *bs;
|
||||
BdrvChild *child;
|
||||
AioContext *ctx;
|
||||
|
||||
GLOBAL_STATE_CODE();
|
||||
|
||||
bs = bdrv_open_child_bs(filename, options, bdref_key, parent, child_class,
|
||||
child_role, allow_none, parse_filename, errp);
|
||||
if (bs == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bdrv_graph_wrlock(NULL);
|
||||
ctx = bdrv_get_aio_context(bs);
|
||||
aio_context_acquire(ctx);
|
||||
child = bdrv_attach_child(parent, bs, bdref_key, child_class, child_role,
|
||||
errp);
|
||||
aio_context_release(ctx);
|
||||
bdrv_graph_wrunlock(NULL);
|
||||
|
||||
return child;
|
||||
}
|
||||
|
||||
/*
|
||||
* Opens a disk image whose options are given as BlockdevRef in another block
|
||||
* device's options.
|
||||
@@ -3778,31 +3814,15 @@ BdrvChild *bdrv_open_child(const char *filename,
|
||||
BdrvChildRole child_role,
|
||||
bool allow_none, Error **errp)
|
||||
{
|
||||
BlockDriverState *bs;
|
||||
BdrvChild *child;
|
||||
AioContext *ctx;
|
||||
|
||||
GLOBAL_STATE_CODE();
|
||||
|
||||
bs = bdrv_open_child_bs(filename, options, bdref_key, parent, child_class,
|
||||
child_role, allow_none, errp);
|
||||
if (bs == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bdrv_graph_wrlock(NULL);
|
||||
ctx = bdrv_get_aio_context(bs);
|
||||
aio_context_acquire(ctx);
|
||||
child = bdrv_attach_child(parent, bs, bdref_key, child_class, child_role,
|
||||
errp);
|
||||
aio_context_release(ctx);
|
||||
bdrv_graph_wrunlock(NULL);
|
||||
|
||||
return child;
|
||||
return bdrv_open_child_common(filename, options, bdref_key, parent,
|
||||
child_class, child_role, allow_none, false,
|
||||
errp);
|
||||
}
|
||||
|
||||
/*
|
||||
* Wrapper on bdrv_open_child() for most popular case: open primary child of bs.
|
||||
* This does mostly the same as bdrv_open_child(), but for opening the primary
|
||||
* child of a node. A notable difference from bdrv_open_child() is that it
|
||||
* enables filename parsing for protocol names (including json:).
|
||||
*
|
||||
* The caller must hold the lock of the main AioContext and no other AioContext.
|
||||
* @parent can move to a different AioContext in this function. Callers must
|
||||
@@ -3819,8 +3839,8 @@ int bdrv_open_file_child(const char *filename,
|
||||
role = parent->drv->is_filter ?
|
||||
(BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY) : BDRV_CHILD_IMAGE;
|
||||
|
||||
if (!bdrv_open_child(filename, options, bdref_key, parent,
|
||||
&child_of_bds, role, false, errp))
|
||||
if (!bdrv_open_child_common(filename, options, bdref_key, parent,
|
||||
&child_of_bds, role, false, true, errp))
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -3865,7 +3885,8 @@ BlockDriverState *bdrv_open_blockdev_ref(BlockdevRef *ref, Error **errp)
|
||||
|
||||
}
|
||||
|
||||
bs = bdrv_open_inherit(NULL, reference, qdict, 0, NULL, NULL, 0, errp);
|
||||
bs = bdrv_open_inherit(NULL, reference, qdict, 0, NULL, NULL, 0, false,
|
||||
errp);
|
||||
obj = NULL;
|
||||
qobject_unref(obj);
|
||||
visit_free(v);
|
||||
@@ -3962,7 +3983,7 @@ static BlockDriverState * no_coroutine_fn
|
||||
bdrv_open_inherit(const char *filename, const char *reference, QDict *options,
|
||||
int flags, BlockDriverState *parent,
|
||||
const BdrvChildClass *child_class, BdrvChildRole child_role,
|
||||
Error **errp)
|
||||
bool parse_filename, Error **errp)
|
||||
{
|
||||
int ret;
|
||||
BlockBackend *file = NULL;
|
||||
@@ -4011,9 +4032,11 @@ bdrv_open_inherit(const char *filename, const char *reference, QDict *options,
|
||||
}
|
||||
|
||||
/* json: syntax counts as explicit options, as if in the QDict */
|
||||
parse_json_protocol(options, &filename, &local_err);
|
||||
if (local_err) {
|
||||
goto fail;
|
||||
if (parse_filename) {
|
||||
parse_json_protocol(options, &filename, &local_err);
|
||||
if (local_err) {
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
|
||||
bs->explicit_options = qdict_clone_shallow(options);
|
||||
@@ -4038,7 +4061,8 @@ bdrv_open_inherit(const char *filename, const char *reference, QDict *options,
|
||||
parent->open_flags, parent->options);
|
||||
}
|
||||
|
||||
ret = bdrv_fill_options(&options, filename, &flags, &local_err);
|
||||
ret = bdrv_fill_options(&options, filename, &flags, parse_filename,
|
||||
&local_err);
|
||||
if (ret < 0) {
|
||||
goto fail;
|
||||
}
|
||||
@@ -4107,7 +4131,7 @@ bdrv_open_inherit(const char *filename, const char *reference, QDict *options,
|
||||
|
||||
file_bs = bdrv_open_child_bs(filename, options, "file", bs,
|
||||
&child_of_bds, BDRV_CHILD_IMAGE,
|
||||
true, &local_err);
|
||||
true, true, &local_err);
|
||||
if (local_err) {
|
||||
goto fail;
|
||||
}
|
||||
@@ -4270,7 +4294,7 @@ BlockDriverState *bdrv_open(const char *filename, const char *reference,
|
||||
GLOBAL_STATE_CODE();
|
||||
|
||||
return bdrv_open_inherit(filename, reference, options, flags, NULL,
|
||||
NULL, 0, errp);
|
||||
NULL, 0, true, errp);
|
||||
}
|
||||
|
||||
/* Return true if the NULL-terminated @list contains @str */
|
||||
|
@@ -1636,7 +1636,22 @@ qcow2_do_open(BlockDriverState *bs, QDict *options, int flags,
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (open_data_file) {
|
||||
if (open_data_file && (flags & BDRV_O_NO_IO)) {
|
||||
/*
|
||||
* Don't open the data file for 'qemu-img info' so that it can be used
|
||||
* to verify that an untrusted qcow2 image doesn't refer to external
|
||||
* files.
|
||||
*
|
||||
* Note: This still makes has_data_file() return true.
|
||||
*/
|
||||
if (s->incompatible_features & QCOW2_INCOMPAT_DATA_FILE) {
|
||||
s->data_file = NULL;
|
||||
} else {
|
||||
s->data_file = bs->file;
|
||||
}
|
||||
qdict_extract_subqdict(options, NULL, "data-file.");
|
||||
qdict_del(options, "data-file");
|
||||
} else if (open_data_file) {
|
||||
/* Open external data file */
|
||||
bdrv_graph_co_rdunlock();
|
||||
s->data_file = bdrv_co_open_child(NULL, options, "data-file", bs,
|
||||
|
@@ -41,6 +41,7 @@
|
||||
/* init terminal so that we can grab keys */
|
||||
static struct termios oldtty;
|
||||
static int old_fd0_flags;
|
||||
static int old_fd1_flags;
|
||||
static bool stdio_in_use;
|
||||
static bool stdio_allow_signal;
|
||||
static bool stdio_echo_state;
|
||||
@@ -50,6 +51,8 @@ static void term_exit(void)
|
||||
if (stdio_in_use) {
|
||||
tcsetattr(0, TCSANOW, &oldtty);
|
||||
fcntl(0, F_SETFL, old_fd0_flags);
|
||||
fcntl(1, F_SETFL, old_fd1_flags);
|
||||
stdio_in_use = false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -102,6 +105,7 @@ static void qemu_chr_open_stdio(Chardev *chr,
|
||||
|
||||
stdio_in_use = true;
|
||||
old_fd0_flags = fcntl(0, F_GETFL);
|
||||
old_fd1_flags = fcntl(1, F_GETFL);
|
||||
tcgetattr(0, &oldtty);
|
||||
if (!g_unix_set_fd_nonblocking(0, true, NULL)) {
|
||||
error_setg_errno(errp, errno, "Failed to set FD nonblocking");
|
||||
|
@@ -229,15 +229,15 @@ class QAPISchemaGenRSTVisitor(QAPISchemaVisitor):
|
||||
section += dlnode
|
||||
return [section]
|
||||
|
||||
def _nodes_for_arguments(self, doc, boxed_arg_type):
|
||||
def _nodes_for_arguments(self, doc, arg_type):
|
||||
"""Return list of doctree nodes for the arguments section"""
|
||||
if boxed_arg_type:
|
||||
if arg_type and not arg_type.is_implicit():
|
||||
assert not doc.args
|
||||
section = self._make_section('Arguments')
|
||||
dlnode = nodes.definition_list()
|
||||
dlnode += self._make_dlitem(
|
||||
[nodes.Text('The members of '),
|
||||
nodes.literal('', boxed_arg_type.name)],
|
||||
nodes.literal('', arg_type.name)],
|
||||
None)
|
||||
section += dlnode
|
||||
return [section]
|
||||
@@ -341,8 +341,7 @@ class QAPISchemaGenRSTVisitor(QAPISchemaVisitor):
|
||||
allow_preconfig, coroutine):
|
||||
doc = self._cur_doc
|
||||
self._add_doc('Command',
|
||||
self._nodes_for_arguments(doc,
|
||||
arg_type if boxed else None)
|
||||
self._nodes_for_arguments(doc, arg_type)
|
||||
+ self._nodes_for_features(doc)
|
||||
+ self._nodes_for_sections(doc)
|
||||
+ self._nodes_for_if_section(ifcond))
|
||||
@@ -350,8 +349,7 @@ class QAPISchemaGenRSTVisitor(QAPISchemaVisitor):
|
||||
def visit_event(self, name, info, ifcond, features, arg_type, boxed):
|
||||
doc = self._cur_doc
|
||||
self._add_doc('Event',
|
||||
self._nodes_for_arguments(doc,
|
||||
arg_type if boxed else None)
|
||||
self._nodes_for_arguments(doc, arg_type)
|
||||
+ self._nodes_for_features(doc)
|
||||
+ self._nodes_for_sections(doc)
|
||||
+ self._nodes_for_if_section(ifcond))
|
||||
|
@@ -401,7 +401,7 @@ static void virtio_snd_get_qemu_audsettings(audsettings *as,
|
||||
as->nchannels = MIN(AUDIO_MAX_CHANNELS, params->channels);
|
||||
as->fmt = virtio_snd_get_qemu_format(params->format);
|
||||
as->freq = virtio_snd_get_qemu_freq(params->rate);
|
||||
as->endianness = target_words_bigendian() ? 1 : 0;
|
||||
as->endianness = 0; /* Conforming to VIRTIO 1.0: always little endian. */
|
||||
}
|
||||
|
||||
/*
|
||||
|
@@ -1748,6 +1748,13 @@ static void vga_draw_blank(VGACommonState *s, int full_update)
|
||||
if (s->last_scr_width <= 0 || s->last_scr_height <= 0)
|
||||
return;
|
||||
|
||||
if (is_buffer_shared(surface)) {
|
||||
/* unshare buffer, otherwise the blanking corrupts vga vram */
|
||||
surface = qemu_create_displaysurface(s->last_scr_width,
|
||||
s->last_scr_height);
|
||||
dpy_gfx_replace_surface(s->con, surface);
|
||||
}
|
||||
|
||||
w = s->last_scr_width * surface_bytes_per_pixel(surface);
|
||||
d = surface_data(surface);
|
||||
for(i = 0; i < s->last_scr_height; i++) {
|
||||
|
@@ -2709,18 +2709,14 @@ static int32_t virtio_net_flush_tx(VirtIONetQueue *q)
|
||||
out_sg = elem->out_sg;
|
||||
if (out_num < 1) {
|
||||
virtio_error(vdev, "virtio-net header not in first element");
|
||||
virtqueue_detach_element(q->tx_vq, elem, 0);
|
||||
g_free(elem);
|
||||
return -EINVAL;
|
||||
goto detach;
|
||||
}
|
||||
|
||||
if (n->has_vnet_hdr) {
|
||||
if (iov_to_buf(out_sg, out_num, 0, &vhdr, n->guest_hdr_len) <
|
||||
n->guest_hdr_len) {
|
||||
virtio_error(vdev, "virtio-net header incorrect");
|
||||
virtqueue_detach_element(q->tx_vq, elem, 0);
|
||||
g_free(elem);
|
||||
return -EINVAL;
|
||||
goto detach;
|
||||
}
|
||||
if (n->needs_vnet_hdr_swap) {
|
||||
virtio_net_hdr_swap(vdev, (void *) &vhdr);
|
||||
@@ -2751,6 +2747,11 @@ static int32_t virtio_net_flush_tx(VirtIONetQueue *q)
|
||||
n->guest_hdr_len, -1);
|
||||
out_num = sg_num;
|
||||
out_sg = sg;
|
||||
|
||||
if (out_num < 1) {
|
||||
virtio_error(vdev, "virtio-net nothing to send");
|
||||
goto detach;
|
||||
}
|
||||
}
|
||||
|
||||
ret = qemu_sendv_packet_async(qemu_get_subqueue(n->nic, queue_index),
|
||||
@@ -2771,6 +2772,11 @@ drop:
|
||||
}
|
||||
}
|
||||
return num_packets;
|
||||
|
||||
detach:
|
||||
virtqueue_detach_element(q->tx_vq, elem, 0);
|
||||
g_free(elem);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static void virtio_net_tx_timer(void *opaque);
|
||||
|
@@ -4352,7 +4352,7 @@ static uint16_t nvme_io_mgmt_send_ruh_update(NvmeCtrl *n, NvmeRequest *req)
|
||||
NvmeNamespace *ns = req->ns;
|
||||
uint32_t cdw10 = le32_to_cpu(cmd->cdw10);
|
||||
uint16_t ret = NVME_SUCCESS;
|
||||
uint32_t npid = (cdw10 >> 1) + 1;
|
||||
uint32_t npid = (cdw10 >> 16) + 1;
|
||||
unsigned int i = 0;
|
||||
g_autofree uint16_t *pids = NULL;
|
||||
uint32_t maxnpid;
|
||||
|
@@ -892,7 +892,7 @@ static int kvm_virtio_pci_vector_use_one(VirtIOPCIProxy *proxy, int queue_no)
|
||||
}
|
||||
ret = kvm_virtio_pci_vq_vector_use(proxy, vector);
|
||||
if (ret < 0) {
|
||||
goto undo;
|
||||
return ret;
|
||||
}
|
||||
/*
|
||||
* If guest supports masking, set up irqfd now.
|
||||
@@ -902,25 +902,11 @@ static int kvm_virtio_pci_vector_use_one(VirtIOPCIProxy *proxy, int queue_no)
|
||||
ret = kvm_virtio_pci_irqfd_use(proxy, n, vector);
|
||||
if (ret < 0) {
|
||||
kvm_virtio_pci_vq_vector_release(proxy, vector);
|
||||
goto undo;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
undo:
|
||||
|
||||
vector = virtio_queue_vector(vdev, queue_no);
|
||||
if (vector >= msix_nr_vectors_allocated(dev)) {
|
||||
return ret;
|
||||
}
|
||||
if (vdev->use_guest_notifier_mask && k->guest_notifier_mask) {
|
||||
ret = virtio_pci_get_notifier(proxy, queue_no, &n, &vector);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
kvm_virtio_pci_irqfd_release(proxy, n, vector);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
static int kvm_virtio_pci_vector_vq_use(VirtIOPCIProxy *proxy, int nvqs)
|
||||
{
|
||||
|
@@ -322,7 +322,6 @@ static void vring_packed_event_read(VirtIODevice *vdev,
|
||||
/* Make sure flags is seen before off_wrap */
|
||||
smp_rmb();
|
||||
e->off_wrap = virtio_lduw_phys_cached(vdev, cache, off_off);
|
||||
virtio_tswap16s(vdev, &e->flags);
|
||||
}
|
||||
|
||||
static void vring_packed_off_wrap_write(VirtIODevice *vdev,
|
||||
|
@@ -7198,11 +7198,17 @@ static inline int tswapid(int id)
|
||||
#else
|
||||
#define __NR_sys_setresgid __NR_setresgid
|
||||
#endif
|
||||
#ifdef __NR_setgroups32
|
||||
#define __NR_sys_setgroups __NR_setgroups32
|
||||
#else
|
||||
#define __NR_sys_setgroups __NR_setgroups
|
||||
#endif
|
||||
|
||||
_syscall1(int, sys_setuid, uid_t, uid)
|
||||
_syscall1(int, sys_setgid, gid_t, gid)
|
||||
_syscall3(int, sys_setresuid, uid_t, ruid, uid_t, euid, uid_t, suid)
|
||||
_syscall3(int, sys_setresgid, gid_t, rgid, gid_t, egid, gid_t, sgid)
|
||||
_syscall2(int, sys_setgroups, int, size, gid_t *, grouplist)
|
||||
|
||||
void syscall_init(void)
|
||||
{
|
||||
@@ -11790,7 +11796,7 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1,
|
||||
unlock_user(target_grouplist, arg2,
|
||||
gidsetsize * sizeof(target_id));
|
||||
}
|
||||
return get_errno(setgroups(gidsetsize, grouplist));
|
||||
return get_errno(sys_setgroups(gidsetsize, grouplist));
|
||||
}
|
||||
case TARGET_NR_fchown:
|
||||
return get_errno(fchown(arg1, low2highuid(arg2), low2highgid(arg3)));
|
||||
@@ -12126,7 +12132,7 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1,
|
||||
}
|
||||
unlock_user(target_grouplist, arg2, 0);
|
||||
}
|
||||
return get_errno(setgroups(gidsetsize, grouplist));
|
||||
return get_errno(sys_setgroups(gidsetsize, grouplist));
|
||||
}
|
||||
#endif
|
||||
#ifdef TARGET_NR_fchown32
|
||||
|
@@ -46,12 +46,19 @@ void file_start_outgoing_migration(MigrationState *s,
|
||||
|
||||
trace_migration_file_outgoing(filename);
|
||||
|
||||
fioc = qio_channel_file_new_path(filename, O_CREAT | O_WRONLY | O_TRUNC,
|
||||
0600, errp);
|
||||
fioc = qio_channel_file_new_path(filename, O_CREAT | O_WRONLY, 0600, errp);
|
||||
if (!fioc) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (ftruncate(fioc->fd, offset)) {
|
||||
error_setg_errno(errp, errno,
|
||||
"failed to truncate migration file to offset %" PRIx64,
|
||||
offset);
|
||||
object_unref(OBJECT(fioc));
|
||||
return;
|
||||
}
|
||||
|
||||
ioc = QIO_CHANNEL(fioc);
|
||||
if (offset && qio_channel_io_seek(ioc, offset, SEEK_SET, errp) < 0) {
|
||||
return;
|
||||
|
@@ -1660,8 +1660,6 @@
|
||||
#
|
||||
# Takes a synchronous snapshot of a block device.
|
||||
#
|
||||
# For the arguments, see the documentation of BlockdevSnapshotSync.
|
||||
#
|
||||
# Returns:
|
||||
# - nothing on success
|
||||
# - If @device is not a valid block device, DeviceNotFound
|
||||
@@ -1691,8 +1689,6 @@
|
||||
# device, the block device changes to using 'overlay' as its new
|
||||
# active image.
|
||||
#
|
||||
# For the arguments, see the documentation of BlockdevSnapshot.
|
||||
#
|
||||
# Features:
|
||||
#
|
||||
# @allow-write-only-overlay: If present, the check whether this
|
||||
@@ -6029,9 +6025,6 @@
|
||||
# string, or a snapshot with name already exists, the operation will
|
||||
# fail.
|
||||
#
|
||||
# For the arguments, see the documentation of
|
||||
# BlockdevSnapshotInternal.
|
||||
#
|
||||
# Returns:
|
||||
# - nothing on success
|
||||
# - If @device is not a valid block device, GenericError
|
||||
|
@@ -843,7 +843,7 @@ void HELPER(gvec_fcmlah_idx)(void *vd, void *vn, void *vm, void *va,
|
||||
intptr_t index = extract32(desc, SIMD_DATA_SHIFT + 2, 2);
|
||||
uint32_t neg_real = flip ^ neg_imag;
|
||||
intptr_t elements = opr_sz / sizeof(float16);
|
||||
intptr_t eltspersegment = 16 / sizeof(float16);
|
||||
intptr_t eltspersegment = MIN(16 / sizeof(float16), elements);
|
||||
intptr_t i, j;
|
||||
|
||||
/* Shift boolean to the sign bit so we can xor to negate. */
|
||||
@@ -905,7 +905,7 @@ void HELPER(gvec_fcmlas_idx)(void *vd, void *vn, void *vm, void *va,
|
||||
intptr_t index = extract32(desc, SIMD_DATA_SHIFT + 2, 2);
|
||||
uint32_t neg_real = flip ^ neg_imag;
|
||||
intptr_t elements = opr_sz / sizeof(float32);
|
||||
intptr_t eltspersegment = 16 / sizeof(float32);
|
||||
intptr_t eltspersegment = MIN(16 / sizeof(float32), elements);
|
||||
intptr_t i, j;
|
||||
|
||||
/* Shift boolean to the sign bit so we can xor to negate. */
|
||||
|
@@ -1121,8 +1121,8 @@ const FloatRoundMode arm_rmode_to_sf_map[] = {
|
||||
uint64_t HELPER(fjcvtzs)(float64 value, void *vstatus)
|
||||
{
|
||||
float_status *status = vstatus;
|
||||
uint32_t inexact, frac;
|
||||
uint32_t e_old, e_new;
|
||||
uint32_t frac, e_old, e_new;
|
||||
bool inexact;
|
||||
|
||||
e_old = get_float_exception_flags(status);
|
||||
set_float_exception_flags(0, status);
|
||||
@@ -1130,13 +1130,13 @@ uint64_t HELPER(fjcvtzs)(float64 value, void *vstatus)
|
||||
e_new = get_float_exception_flags(status);
|
||||
set_float_exception_flags(e_old | e_new, status);
|
||||
|
||||
if (value == float64_chs(float64_zero)) {
|
||||
/* While not inexact for IEEE FP, -0.0 is inexact for JavaScript. */
|
||||
inexact = 1;
|
||||
} else {
|
||||
/* Normal inexact or overflow or NaN */
|
||||
inexact = e_new & (float_flag_inexact | float_flag_invalid);
|
||||
}
|
||||
/* Normal inexact, denormal with flush-to-zero, or overflow or NaN */
|
||||
inexact = e_new & (float_flag_inexact |
|
||||
float_flag_input_denormal |
|
||||
float_flag_invalid);
|
||||
|
||||
/* While not inexact for IEEE FP, -0.0 is inexact for JavaScript. */
|
||||
inexact |= value == float64_chs(float64_zero);
|
||||
|
||||
/* Pack the result and the env->ZF representation of Z together. */
|
||||
return deposit64(frac, 32, 32, inexact);
|
||||
|
@@ -6097,10 +6097,8 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
||||
if (*eax & 31) {
|
||||
int host_vcpus_per_cache = 1 + ((*eax & 0x3FFC000) >> 14);
|
||||
int vcpus_per_socket = cs->nr_cores * cs->nr_threads;
|
||||
if (cs->nr_cores > 1) {
|
||||
*eax &= ~0xFC000000;
|
||||
*eax |= (pow2ceil(cs->nr_cores) - 1) << 26;
|
||||
}
|
||||
*eax &= ~0xFC000000;
|
||||
*eax |= (pow2ceil(cs->nr_cores) - 1) << 26;
|
||||
if (host_vcpus_per_cache > vcpus_per_socket) {
|
||||
*eax &= ~0x3FFC000;
|
||||
*eax |= (pow2ceil(vcpus_per_socket) - 1) << 14;
|
||||
|
@@ -2662,7 +2662,7 @@ static void gen_enter(DisasContext *s, int esp_addend, int level)
|
||||
}
|
||||
|
||||
/* Copy the FrameTemp value to EBP. */
|
||||
gen_op_mov_reg_v(s, a_ot, R_EBP, s->T1);
|
||||
gen_op_mov_reg_v(s, d_ot, R_EBP, s->T1);
|
||||
|
||||
/* Compute the final value of ESP. */
|
||||
tcg_gen_subi_tl(s->T1, s->T1, esp_addend + size * level);
|
||||
|
@@ -121,7 +121,7 @@ uint64_t helper_sdiv(CPUSPARCState *env, target_ulong a, target_ulong b)
|
||||
return (uint32_t)(b32 < 0 ? INT32_MAX : INT32_MIN) | (-1ull << 32);
|
||||
}
|
||||
|
||||
a64 /= b;
|
||||
a64 /= b32;
|
||||
r = a64;
|
||||
if (unlikely(r != a64)) {
|
||||
return (uint32_t)(a64 < 0 ? INT32_MIN : INT32_MAX) | (-1ull << 32);
|
||||
|
@@ -365,8 +365,7 @@ static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd,
|
||||
* back to the slow path.
|
||||
*/
|
||||
|
||||
intptr_t pc_offset;
|
||||
tcg_target_long val_lo, val_hi, pc_hi, offset_hi;
|
||||
intptr_t src_rx, pc_offset;
|
||||
tcg_target_long hi12, hi32, hi52;
|
||||
|
||||
/* Value fits in signed i32. */
|
||||
@@ -376,24 +375,23 @@ static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd,
|
||||
}
|
||||
|
||||
/* PC-relative cases. */
|
||||
pc_offset = tcg_pcrel_diff(s, (void *)val);
|
||||
if (pc_offset == sextreg(pc_offset, 0, 22) && (pc_offset & 3) == 0) {
|
||||
/* Single pcaddu2i. */
|
||||
tcg_out_opc_pcaddu2i(s, rd, pc_offset >> 2);
|
||||
return;
|
||||
src_rx = (intptr_t)tcg_splitwx_to_rx(s->code_ptr);
|
||||
if ((val & 3) == 0) {
|
||||
pc_offset = val - src_rx;
|
||||
if (pc_offset == sextreg(pc_offset, 0, 22)) {
|
||||
/* Single pcaddu2i. */
|
||||
tcg_out_opc_pcaddu2i(s, rd, pc_offset >> 2);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (pc_offset == (int32_t)pc_offset) {
|
||||
/* Offset within 32 bits; load with pcalau12i + ori. */
|
||||
val_lo = sextreg(val, 0, 12);
|
||||
val_hi = val >> 12;
|
||||
pc_hi = (val - pc_offset) >> 12;
|
||||
offset_hi = val_hi - pc_hi;
|
||||
|
||||
tcg_debug_assert(offset_hi == sextreg(offset_hi, 0, 20));
|
||||
tcg_out_opc_pcalau12i(s, rd, offset_hi);
|
||||
pc_offset = (val >> 12) - (src_rx >> 12);
|
||||
if (pc_offset == sextreg(pc_offset, 0, 20)) {
|
||||
/* Load with pcalau12i + ori. */
|
||||
tcg_target_long val_lo = val & 0xfff;
|
||||
tcg_out_opc_pcalau12i(s, rd, pc_offset);
|
||||
if (val_lo != 0) {
|
||||
tcg_out_opc_ori(s, rd, rd, val_lo & 0xfff);
|
||||
tcg_out_opc_ori(s, rd, rd, val_lo);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@@ -1,15 +1,14 @@
|
||||
# THIS FILE WAS AUTO-GENERATED
|
||||
#
|
||||
# $ lcitool dockerfile --layers all centos-stream-8 qemu
|
||||
# $ lcitool dockerfile --layers all centos-stream-9 qemu
|
||||
#
|
||||
# https://gitlab.com/libvirt/libvirt-ci
|
||||
|
||||
FROM quay.io/centos/centos:stream8
|
||||
FROM quay.io/centos/centos:stream9
|
||||
|
||||
RUN dnf distro-sync -y && \
|
||||
dnf install 'dnf-command(config-manager)' -y && \
|
||||
dnf config-manager --set-enabled -y powertools && \
|
||||
dnf install -y centos-release-advanced-virtualization && \
|
||||
dnf config-manager --set-enabled -y crb && \
|
||||
dnf install -y epel-release && \
|
||||
dnf install -y epel-next-release && \
|
||||
dnf install -y \
|
||||
@@ -42,7 +41,6 @@ RUN dnf distro-sync -y && \
|
||||
glib2-static \
|
||||
glibc-langpack-en \
|
||||
glibc-static \
|
||||
glusterfs-api-devel \
|
||||
gnutls-devel \
|
||||
gtk3-devel \
|
||||
hostname \
|
||||
@@ -82,6 +80,7 @@ RUN dnf distro-sync -y && \
|
||||
lzo-devel \
|
||||
make \
|
||||
mesa-libgbm-devel \
|
||||
meson \
|
||||
mtools \
|
||||
ncurses-devel \
|
||||
nettle-devel \
|
||||
@@ -95,25 +94,25 @@ RUN dnf distro-sync -y && \
|
||||
pixman-devel \
|
||||
pkgconfig \
|
||||
pulseaudio-libs-devel \
|
||||
python38 \
|
||||
python38-PyYAML \
|
||||
python38-numpy \
|
||||
python38-pip \
|
||||
python38-setuptools \
|
||||
python38-wheel \
|
||||
python3 \
|
||||
python3-PyYAML \
|
||||
python3-numpy \
|
||||
python3-pillow \
|
||||
python3-pip \
|
||||
python3-sphinx \
|
||||
python3-sphinx_rtd_theme \
|
||||
python3-tomli \
|
||||
rdma-core-devel \
|
||||
sed \
|
||||
snappy-devel \
|
||||
socat \
|
||||
spice-protocol \
|
||||
spice-server-devel \
|
||||
swtpm \
|
||||
systemd-devel \
|
||||
systemtap-sdt-devel \
|
||||
tar \
|
||||
usbredir-devel \
|
||||
util-linux \
|
||||
virglrenderer-devel \
|
||||
vte291-devel \
|
||||
which \
|
||||
xfsprogs-devel \
|
||||
@@ -131,18 +130,11 @@ RUN dnf distro-sync -y && \
|
||||
ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/g++ && \
|
||||
ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc
|
||||
|
||||
RUN /usr/bin/pip3.8 install \
|
||||
meson==0.63.2 \
|
||||
pillow \
|
||||
sphinx \
|
||||
sphinx-rtd-theme \
|
||||
tomli
|
||||
|
||||
ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
|
||||
ENV LANG "en_US.UTF-8"
|
||||
ENV MAKE "/usr/bin/make"
|
||||
ENV NINJA "/usr/bin/ninja"
|
||||
ENV PYTHON "/usr/bin/python3.8"
|
||||
ENV PYTHON "/usr/bin/python3"
|
||||
# As a final step configure the user (if env is defined)
|
||||
ARG USER
|
||||
ARG UID
|
@@ -1,66 +1,50 @@
|
||||
mappings:
|
||||
flake8:
|
||||
CentOSStream8:
|
||||
OpenSUSELeap15:
|
||||
|
||||
meson:
|
||||
CentOSStream8:
|
||||
OpenSUSELeap15:
|
||||
|
||||
python3:
|
||||
CentOSStream8: python38
|
||||
OpenSUSELeap15: python311-base
|
||||
|
||||
python3-PyYAML:
|
||||
CentOSStream8: python38-PyYAML
|
||||
OpenSUSELeap15:
|
||||
|
||||
python3-devel:
|
||||
CentOSStream8: python38-devel
|
||||
OpenSUSELeap15: python311-devel
|
||||
|
||||
python3-docutils:
|
||||
CentOSStream8:
|
||||
OpenSUSELeap15:
|
||||
|
||||
python3-numpy:
|
||||
CentOSStream8: python38-numpy
|
||||
OpenSUSELeap15:
|
||||
|
||||
python3-opencv:
|
||||
CentOSStream8:
|
||||
OpenSUSELeap15:
|
||||
|
||||
python3-pillow:
|
||||
CentOSStream8:
|
||||
OpenSUSELeap15:
|
||||
|
||||
python3-pip:
|
||||
CentOSStream8: python38-pip
|
||||
OpenSUSELeap15: python311-pip
|
||||
|
||||
python3-pillow:
|
||||
CentOSStream8:
|
||||
OpenSUSELeap15:
|
||||
|
||||
python3-selinux:
|
||||
CentOSStream8:
|
||||
OpenSUSELeap15:
|
||||
|
||||
python3-setuptools:
|
||||
CentOSStream8: python38-setuptools
|
||||
OpenSUSELeap15: python311-setuptools
|
||||
|
||||
python3-sphinx:
|
||||
CentOSStream8:
|
||||
OpenSUSELeap15:
|
||||
|
||||
python3-sphinx-rtd-theme:
|
||||
CentOSStream8:
|
||||
OpenSUSELeap15:
|
||||
|
||||
python3-sqlite3:
|
||||
CentOSStream8: python38
|
||||
OpenSUSELeap15: python311
|
||||
|
||||
python3-tomli:
|
||||
@@ -69,15 +53,11 @@ mappings:
|
||||
Fedora:
|
||||
Debian12:
|
||||
OpenSUSELeap15:
|
||||
# Not available for Python 3.8
|
||||
CentOSStream8:
|
||||
|
||||
python3-venv:
|
||||
CentOSStream8: python38
|
||||
OpenSUSELeap15: python311-base
|
||||
|
||||
python3-wheel:
|
||||
CentOSStream8: python38-wheel
|
||||
OpenSUSELeap15: python311-pip
|
||||
|
||||
pypi_mappings:
|
||||
|
@@ -125,7 +125,7 @@ try:
|
||||
# Standard native builds
|
||||
#
|
||||
generate_dockerfile("alpine", "alpine-318")
|
||||
generate_dockerfile("centos8", "centos-stream-8")
|
||||
generate_dockerfile("centos9", "centos-stream-9")
|
||||
generate_dockerfile("debian", "debian-12",
|
||||
trailer="".join(debian12_extras))
|
||||
generate_dockerfile("fedora", "fedora-38")
|
||||
|
@@ -326,12 +326,14 @@ $QEMU_IMG amend -o "data_file=foo" "$TEST_IMG"
|
||||
echo
|
||||
_make_test_img -o "compat=1.1,data_file=$TEST_IMG.data" 64M
|
||||
$QEMU_IMG amend -o "data_file=foo" "$TEST_IMG"
|
||||
_img_info --format-specific
|
||||
$QEMU_IO -c "read 0 4k" "$TEST_IMG" 2>&1 | _filter_testdir | _filter_imgfmt
|
||||
$QEMU_IO -c "open -o data-file.filename=$TEST_IMG.data,file.filename=$TEST_IMG" -c "read 0 4k" | _filter_qemu_io
|
||||
TEST_IMG="data-file.filename=$TEST_IMG.data,file.filename=$TEST_IMG" _img_info --format-specific --image-opts
|
||||
|
||||
echo
|
||||
$QEMU_IMG amend -o "data_file=" --image-opts "data-file.filename=$TEST_IMG.data,file.filename=$TEST_IMG"
|
||||
_img_info --format-specific
|
||||
$QEMU_IO -c "read 0 4k" "$TEST_IMG" 2>&1 | _filter_testdir | _filter_imgfmt
|
||||
$QEMU_IO -c "open -o data-file.filename=$TEST_IMG.data,file.filename=$TEST_IMG" -c "read 0 4k" | _filter_qemu_io
|
||||
TEST_IMG="data-file.filename=$TEST_IMG.data,file.filename=$TEST_IMG" _img_info --format-specific --image-opts
|
||||
|
||||
echo
|
||||
|
@@ -545,7 +545,9 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
||||
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864 data_file=TEST_DIR/t.IMGFMT.data
|
||||
qemu-img: Cannot downgrade an image with a data file
|
||||
image: TEST_DIR/t.IMGFMT
|
||||
image: TEST_DIR/t.IMGFMT
|
||||
file format: IMGFMT
|
||||
virtual size: 64 MiB (67108864 bytes)
|
||||
cluster_size: 65536
|
||||
Format specific information:
|
||||
compat: 1.1
|
||||
@@ -560,7 +562,9 @@ Format specific information:
|
||||
|
||||
=== Testing version downgrade with extended L2 entries ===
|
||||
|
||||
=== Testing version downgrade with extended L2 entries ===
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
||||
qemu-img: Cannot downgrade an image with incompatible features 0x10 set
|
||||
|
||||
=== Try changing the external data file ===
|
||||
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
||||
|
@@ -215,9 +215,22 @@ $QEMU_IMG convert -f $IMGFMT -O $IMGFMT -n -C "$TEST_IMG.src" "$TEST_IMG"
|
||||
$QEMU_IMG compare -f $IMGFMT -F $IMGFMT "$TEST_IMG.src" "$TEST_IMG"
|
||||
|
||||
# blkdebug doesn't support copy offloading, so this tests the error path
|
||||
$QEMU_IMG amend -f $IMGFMT -o "data_file=blkdebug::$TEST_IMG.data" "$TEST_IMG"
|
||||
$QEMU_IMG convert -f $IMGFMT -O $IMGFMT -n -C "$TEST_IMG.src" "$TEST_IMG"
|
||||
$QEMU_IMG compare -f $IMGFMT -F $IMGFMT "$TEST_IMG.src" "$TEST_IMG"
|
||||
test_img_with_blkdebug="json:{
|
||||
'driver': 'qcow2',
|
||||
'file': {
|
||||
'driver': 'file',
|
||||
'filename': '$TEST_IMG'
|
||||
},
|
||||
'data-file': {
|
||||
'driver': 'blkdebug',
|
||||
'image': {
|
||||
'driver': 'file',
|
||||
'filename': '$TEST_IMG.data'
|
||||
}
|
||||
}
|
||||
}"
|
||||
$QEMU_IMG convert -f $IMGFMT -O $IMGFMT -n -C "$TEST_IMG.src" "$test_img_with_blkdebug"
|
||||
$QEMU_IMG compare -f $IMGFMT -F $IMGFMT "$TEST_IMG.src" "$test_img_with_blkdebug"
|
||||
|
||||
echo
|
||||
echo "=== Flushing should flush the data file ==="
|
||||
|
@@ -60,8 +60,16 @@ _make_test_img -o cluster_size=2M,data_file="$TEST_IMG.orig" \
|
||||
# "write" 2G of data without using any space.
|
||||
# (qemu-img create does not like it, though, because null-co does not
|
||||
# support image creation.)
|
||||
$QEMU_IMG amend -o data_file="json:{'driver':'null-co',,'size':'4294967296'}" \
|
||||
"$TEST_IMG"
|
||||
test_img_with_null_data="json:{
|
||||
'driver': '$IMGFMT',
|
||||
'file': {
|
||||
'filename': '$TEST_IMG'
|
||||
},
|
||||
'data-file': {
|
||||
'driver': 'null-co',
|
||||
'size':'4294967296'
|
||||
}
|
||||
}"
|
||||
|
||||
# This gives us a range of:
|
||||
# 2^31 - 512 + 768 - 1 = 2^31 + 255 > 2^31
|
||||
@@ -74,7 +82,7 @@ $QEMU_IMG amend -o data_file="json:{'driver':'null-co',,'size':'4294967296'}" \
|
||||
# on L2 boundaries, we need large L2 tables; hence the cluster size of
|
||||
# 2 MB. (Anything from 256 kB should work, though, because then one L2
|
||||
# table covers 8 GB.)
|
||||
$QEMU_IO -c "write 768 $((2 ** 31 - 512))" "$TEST_IMG" | _filter_qemu_io
|
||||
$QEMU_IO -c "write 768 $((2 ** 31 - 512))" "$test_img_with_null_data" | _filter_qemu_io
|
||||
|
||||
_check_test_img
|
||||
|
||||
|
@@ -41,8 +41,9 @@ endif
|
||||
|
||||
# Pauth Tests
|
||||
ifneq ($(CROSS_CC_HAS_ARMV8_3),)
|
||||
AARCH64_TESTS += pauth-1 pauth-2 pauth-4 pauth-5
|
||||
AARCH64_TESTS += pauth-1 pauth-2 pauth-4 pauth-5 test-2375
|
||||
pauth-%: CFLAGS += -march=armv8.3-a
|
||||
test-2375: CFLAGS += -march=armv8.3-a
|
||||
run-pauth-1: QEMU_OPTS += -cpu max
|
||||
run-pauth-2: QEMU_OPTS += -cpu max
|
||||
# Choose a cpu with FEAT_Pauth but without FEAT_FPAC for pauth-[45].
|
||||
|
21
tests/tcg/aarch64/test-2375.c
Normal file
21
tests/tcg/aarch64/test-2375.c
Normal file
@@ -0,0 +1,21 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/* Copyright (c) 2024 Linaro Ltd */
|
||||
/* See https://gitlab.com/qemu-project/qemu/-/issues/2375 */
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int r, z;
|
||||
|
||||
asm("msr fpcr, %2\n\t"
|
||||
"fjcvtzs %w0, %d3\n\t"
|
||||
"cset %1, eq"
|
||||
: "=r"(r), "=r"(z)
|
||||
: "r"(0x01000000L), /* FZ = 1 */
|
||||
"w"(0xfcff00L)); /* denormal */
|
||||
|
||||
assert(r == 0);
|
||||
assert(z == 0);
|
||||
return 0;
|
||||
}
|
@@ -26,8 +26,8 @@ class CentosVM(basevm.BaseVM):
|
||||
export SRC_ARCHIVE=/dev/vdb;
|
||||
sudo chmod a+r $SRC_ARCHIVE;
|
||||
tar -xf $SRC_ARCHIVE;
|
||||
make docker-test-block@centos8 {verbose} J={jobs} NETWORK=1;
|
||||
make docker-test-quick@centos8 {verbose} J={jobs} NETWORK=1;
|
||||
make docker-test-block@centos9 {verbose} J={jobs} NETWORK=1;
|
||||
make docker-test-quick@centos9 {verbose} J={jobs} NETWORK=1;
|
||||
"""
|
||||
|
||||
def build_image(self, img):
|
||||
|
@@ -150,6 +150,7 @@ void gd_egl_refresh(DisplayChangeListener *dcl)
|
||||
vc, vc->window ? vc->window : vc->gfx.drawing_area);
|
||||
|
||||
if (vc->gfx.guest_fb.dmabuf && vc->gfx.guest_fb.dmabuf->draw_submitted) {
|
||||
gd_egl_draw(vc);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@@ -126,6 +126,7 @@ void gd_gl_area_refresh(DisplayChangeListener *dcl)
|
||||
gd_update_monitor_refresh_rate(vc, vc->window ? vc->window : vc->gfx.drawing_area);
|
||||
|
||||
if (vc->gfx.guest_fb.dmabuf && vc->gfx.guest_fb.dmabuf->draw_submitted) {
|
||||
gd_gl_area_draw(vc);
|
||||
return;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user