xemu/scripts
Fabiano Rosas 82565fb6b3 migration: Fix arrays of pointers in JSON writer
Currently, if an array of pointers contains a NULL pointer, that
pointer will be encoded as '0' in the stream. Since the JSON writer
doesn't define a "pointer" type, that '0' will now be an uint8, which
is different from the original type being pointed to, e.g. struct.

(we're further calling uint8 "nullptr", but that's irrelevant to the
issue)

That mixed-type array shouldn't be compressed, otherwise data is lost
as the code currently makes the whole array have the type of the first
element:

css = {NULL, NULL, ..., 0x5555568a7940, NULL};

{"name": "s390_css", "instance_id": 0, "vmsd_name": "s390_css",
 "version": 1, "fields": [
    ...,
    {"name": "css", "array_len": 256, "type": "nullptr", "size": 1},
    ...,
]}

In the above, the valid pointer at position 254 got lost among the
compressed array of nullptr.

While we could disable the array compression when a NULL pointer is
found, the JSON part of the stream still makes part of downtime, so we
should avoid writing unecessary bytes to it.

Keep the array compression in place, but if NULL and non-NULL pointers
are mixed break the array into several type-contiguous pieces :

css = {NULL, NULL, ..., 0x5555568a7940, NULL};

{"name": "s390_css", "instance_id": 0, "vmsd_name": "s390_css",
 "version": 1, "fields": [
     ...,
     {"name": "css", "array_len": 254, "type": "nullptr", "size": 1},
     {"name": "css", "type": "struct", "struct": {"vmsd_name": "s390_css_img", ... }, "size": 768},
     {"name": "css", "type": "nullptr", "size": 1},
     ...,
]}

Now each type-discontiguous region will become a new JSON entry. The
reader should interpret this as a concatenation of values, all part of
the same field.

Parsing the JSON with analyze-script.py now shows the proper data
being pointed to at the places where the pointer is valid and
"nullptr" where there's NULL:

"s390_css (14)": {
    ...
    "css": [
        "nullptr",
        "nullptr",
        ...
        "nullptr",
        {
            "chpids": [
            {
                "in_use": "0x00",
                "type": "0x00",
                "is_virtual": "0x00"
            },
            ...
            ]
        },
        "nullptr",
    }

Reviewed-by: Peter Xu <peterx@redhat.com>
Message-Id: <20250109185249.23952-7-farosas@suse.de>
Signed-off-by: Fabiano Rosas <farosas@suse.de>
(cherry picked from commit 35049eb0d2fc72bb8c563196ec75b4d6c13fce02)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
2025-01-13 11:25:57 +03:00
..
ci dockerfiles: install bindgen from cargo on Ubuntu 22.04 2024-11-06 17:12:17 +01:00
coccinelle hw: Define new device_class_set_legacy_reset() 2024-09-13 15:31:44 +01:00
codeconverter
coverage
coverity-scan target/cris: Remove the deprecated CRIS target 2024-09-13 20:11:13 +02:00
kvm target/i386: enumerate VMX nested-exception support 2024-06-08 10:33:38 +02:00
modules
oss-fuzz fuzz: disable leak-detection for oss-fuzz builds 2024-05-29 12:41:56 +02:00
performance
qapi qapi: Smarter camel_to_upper() to reduce need for 'prefix' 2024-09-10 13:22:47 +02:00
qemu-guest-agent
qemugdb
qmp
rust rust: add PL011 device model 2024-11-05 14:18:15 +01:00
simplebench
tracetool tracetool: Forbid newline character in event format 2024-06-10 13:05:27 -04:00
analyse-9p-simpletrace.py
analyse-locks-simpletrace.py
analyze-inclusions exec: Rename NEED_CPU_H -> COMPILING_PER_TARGET 2024-04-26 09:49:51 +02:00
analyze-migration.py migration: Fix arrays of pointers in JSON writer 2025-01-13 11:25:57 +03:00
archive-source.sh rust: add PL011 device model 2024-11-05 14:18:15 +01:00
block-coroutine-wrapper.py block-coroutine-wrapper: use qemu_get_current_aio_context() 2023-12-21 22:49:28 +01:00
check_sparse.py
checkpatch.pl scripts/checkpatch.pl: Ignore ObjC #import lines for operator spacing 2024-11-08 06:13:33 +01:00
clean-header-guards.pl
clean-includes scripts/clean-includes: Update exclude list 2024-01-30 21:20:20 +03:00
cleanup-trace-events.pl
cocci-macro-file.h
compare-machine-types.py scripts: add script to compare compatibility properties 2024-04-25 10:12:48 +02:00
cpu-x86-uarch-abi.py scripts: drop comment about autogenerated CPU API file 2024-02-09 12:48:07 +00:00
decodetree.py
device-crash-test
disas-objdump.pl
dump-guest-memory.py
entitlement.sh
extract-vsssdk-headers
feature_to_c.py gdbstub: Add members to identify registers to GDBFeature 2024-02-28 09:10:11 +00:00
fix-multiline-comments.sh
get_maintainer.pl
git-submodule.sh
git.orderfile
hxtool
kernel-doc license: Update deprecated SPDX tag GPL-2.0 to GPL-2.0-only 2024-09-20 10:11:59 +03:00
make-config-poison.sh
make-release rust: add PL011 device model 2024-11-05 14:18:15 +01:00
meson-buildoptions.py
meson-buildoptions.sh * rust: cleanups 2024-11-06 21:27:47 +00:00
meson.build
minikconf.py minikconf: print error entirely on stderr 2024-10-03 19:33:55 +02:00
modinfo-collect.py
modinfo-generate.py
mtest2make.py mtest2make: stop disabling meson test timeouts 2024-01-12 13:23:48 +00:00
nsis.py
probe-gdb-support.py testing: Enhance gdb probe script 2024-10-24 09:56:45 +01:00
python_qmp_updater.py
qapi-gen.py
qemu-binfmt-conf.sh
qemu-gdb.py
qemu-plugin-symbols.py plugins: detect qemu plugin API symbols from header 2024-11-25 10:27:43 +00:00
qemu-stamp.py
qemu-trace-stap
qemu-version.sh
qom-cast-macro-clean-cocci-gen.py
refresh-pxe-roms.sh
render_block_graph.py
replay-dump.py tests/avocado: excercise scripts/replay-dump.py in replay tests 2024-08-16 14:04:19 +01:00
shaderinclude.py
signrom.py
simpletrace.py
symlink-install-tree.py scripts/symlink-install-tree.py: Fix MESONINTROSPECT parsing 2024-10-29 15:04:46 +00:00
tracetool.py tracetool: remove redundant --target-type / --target-name args 2024-03-12 14:52:07 -04:00
u2f-setup-gen.py
undefsym.py
update-linux-headers.sh linux-headers: loongarch: Add kvm_para.h 2024-11-02 15:20:41 +08:00
update-mips-syscall-args.sh
update-syscalltbl.sh linux-user,loongarch: move to syscalltbl file 2024-09-22 09:30:18 +02:00
userfaultfd-wrlat.py
vmstate-static-checker.py
xen-detect.c
xml-preprocess-test.py
xml-preprocess.py