Various misc and testing fixes:
- Expand CODING_STYLE.rst a little more - usb-host build fix - allow check-softfloat unit tests without TCG - simplify mips imm_branch so compiler isn't confused - mark ppc64abi32 for deprecation - more compiler soothing in pch_rev_id - allow acceptance to skip missing binaries - more a bunch of plugins to contrib -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEZoWumedRZ7yvyN81+9DbCVqeKkQFAl9Z9wkACgkQ+9DbCVqe KkRbkQf9HLRDEUSy/1LqbU7ncHzgCmnlzC0MKCqn/L3e+M916naO3xhu0tbJN9Ks nxu9irY1mGrj/gK+gJ9lr50GOvcc8XCFTpE82MisMRWWFeVRt3vYLAql7WcY0ioM K6jMMfoVswmVetP034llQhsAt9zvFimL89kp4O4i2Mjw5shsBIPfharXnnhL4EgS ykKmUdLWxAJPSOJJA71IAFP9UzMYfXg7/NHFK1SMVOWZjMT18aoa6YDzBpbr4KzX 4vOvgGK3tBlVuOooSew7By6iR5oBPa5GP7O9Z78osCsyvzJMPcoNxQZyvgnS0Tda q6+/QeF9/ooDPkg5Jq6Z8EAsY0q+XA== =PIOR -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/stsquad/tags/pull-testing-fixes-100920-1' into staging Various misc and testing fixes: - Expand CODING_STYLE.rst a little more - usb-host build fix - allow check-softfloat unit tests without TCG - simplify mips imm_branch so compiler isn't confused - mark ppc64abi32 for deprecation - more compiler soothing in pch_rev_id - allow acceptance to skip missing binaries - more a bunch of plugins to contrib # gpg: Signature made Thu 10 Sep 2020 10:51:05 BST # gpg: using RSA key 6685AE99E75167BCAFC8DF35FBD0DB095A9E2A44 # gpg: Good signature from "Alex Bennée (Master Work Key) <alex.bennee@linaro.org>" [full] # Primary key fingerprint: 6685 AE99 E751 67BC AFC8 DF35 FBD0 DB09 5A9E 2A44 * remotes/stsquad/tags/pull-testing-fixes-100920-1: plugins: move the more involved plugins to contrib tests/acceptance: Add Test.fetch_asset(cancel_on_missing=True) tests: bump avocado version hw/i386: make explicit clearing of pch_rev_id configure: don't enable ppc64abi32-linux-user by default docs/system/deprecated: mark ppc64abi32-linux-user for deprecation target/mips: simplify gen_compute_imm_branch logic tests/meson.build: fp tests don't need CONFIG_TCG usb-host: restrict workaround to new libusb versions CODING_STYLE.rst: flesh out our naming conventions. Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
3d9f371b01
@ -138,7 +138,7 @@ jobs:
|
|||||||
|
|
||||||
|
|
||||||
# Just build tools and run minimal unit and softfloat checks
|
# Just build tools and run minimal unit and softfloat checks
|
||||||
- name: "GCC check-softfloat (user)"
|
- name: "GCC check-unit and check-softfloat"
|
||||||
env:
|
env:
|
||||||
- BASE_CONFIG="--enable-tools"
|
- BASE_CONFIG="--enable-tools"
|
||||||
- CONFIG="--disable-user --disable-system"
|
- CONFIG="--disable-user --disable-system"
|
||||||
|
@ -109,8 +109,41 @@ names are lower_case_with_underscores_ending_with_a_t, like the POSIX
|
|||||||
uint64_t and family. Note that this last convention contradicts POSIX
|
uint64_t and family. Note that this last convention contradicts POSIX
|
||||||
and is therefore likely to be changed.
|
and is therefore likely to be changed.
|
||||||
|
|
||||||
When wrapping standard library functions, use the prefix ``qemu_`` to alert
|
Variable Naming Conventions
|
||||||
readers that they are seeing a wrapped version; otherwise avoid this prefix.
|
---------------------------
|
||||||
|
|
||||||
|
A number of short naming conventions exist for variables that use
|
||||||
|
common QEMU types. For example, the architecture independent CPUState
|
||||||
|
is often held as a ``cs`` pointer variable, whereas the concrete
|
||||||
|
CPUArchState is usually held in a pointer called ``env``.
|
||||||
|
|
||||||
|
Likewise, in device emulation code the common DeviceState is usually
|
||||||
|
called ``dev``.
|
||||||
|
|
||||||
|
Function Naming Conventions
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
Wrapped version of standard library or GLib functions use a ``qemu_``
|
||||||
|
prefix to alert readers that they are seeing a wrapped version, for
|
||||||
|
example ``qemu_strtol`` or ``qemu_mutex_lock``. Other utility functions
|
||||||
|
that are widely called from across the codebase should not have any
|
||||||
|
prefix, for example ``pstrcpy`` or bit manipulation functions such as
|
||||||
|
``find_first_bit``.
|
||||||
|
|
||||||
|
The ``qemu_`` prefix is also used for functions that modify global
|
||||||
|
emulator state, for example ``qemu_add_vm_change_state_handler``.
|
||||||
|
However, if there is an obvious subsystem-specific prefix it should be
|
||||||
|
used instead.
|
||||||
|
|
||||||
|
Public functions from a file or subsystem (declared in headers) tend
|
||||||
|
to have a consistent prefix to show where they came from. For example,
|
||||||
|
``tlb_`` for functions from ``cputlb.c`` or ``cpu_`` for functions
|
||||||
|
from cpus.c.
|
||||||
|
|
||||||
|
If there are two versions of a function to be called with or without a
|
||||||
|
lock held, the function that expects the lock to be already held
|
||||||
|
usually uses the suffix ``_locked``.
|
||||||
|
|
||||||
|
|
||||||
Block structure
|
Block structure
|
||||||
===============
|
===============
|
||||||
|
@ -2750,7 +2750,8 @@ M: Alex Bennée <alex.bennee@linaro.org>
|
|||||||
S: Maintained
|
S: Maintained
|
||||||
F: docs/devel/tcg-plugins.rst
|
F: docs/devel/tcg-plugins.rst
|
||||||
F: plugins/
|
F: plugins/
|
||||||
F: tests/plugin
|
F: tests/plugin/
|
||||||
|
F: contrib/plugins/
|
||||||
|
|
||||||
AArch64 TCG target
|
AArch64 TCG target
|
||||||
M: Richard Henderson <richard.henderson@linaro.org>
|
M: Richard Henderson <richard.henderson@linaro.org>
|
||||||
|
11
Makefile
11
Makefile
@ -106,6 +106,12 @@ config-host.mak: $(SRC_PATH)/configure $(SRC_PATH)/pc-bios $(SRC_PATH)/VERSION
|
|||||||
# Force configure to re-run if the API symbols are updated
|
# Force configure to re-run if the API symbols are updated
|
||||||
ifeq ($(CONFIG_PLUGIN),y)
|
ifeq ($(CONFIG_PLUGIN),y)
|
||||||
config-host.mak: $(SRC_PATH)/plugins/qemu-plugins.symbols
|
config-host.mak: $(SRC_PATH)/plugins/qemu-plugins.symbols
|
||||||
|
|
||||||
|
.PHONY: plugins
|
||||||
|
plugins:
|
||||||
|
$(call quiet-command,\
|
||||||
|
$(MAKE) $(SUBDIR_MAKEFLAGS) -C contrib/plugins V="$(V)", \
|
||||||
|
"BUILD", "example plugins")
|
||||||
endif
|
endif
|
||||||
|
|
||||||
else
|
else
|
||||||
@ -258,6 +264,11 @@ help:
|
|||||||
$(call print-help,cscope,Generate cscope index)
|
$(call print-help,cscope,Generate cscope index)
|
||||||
$(call print-help,sparse,Run sparse on the QEMU source)
|
$(call print-help,sparse,Run sparse on the QEMU source)
|
||||||
@echo ''
|
@echo ''
|
||||||
|
ifeq ($(CONFIG_PLUGIN),y)
|
||||||
|
@echo 'Plugin targets:'
|
||||||
|
$(call print-help,plugins,Build the example TCG plugins)
|
||||||
|
@echo ''
|
||||||
|
endif
|
||||||
@echo 'Cleaning targets:'
|
@echo 'Cleaning targets:'
|
||||||
$(call print-help,clean,Remove most generated files but keep the config)
|
$(call print-help,clean,Remove most generated files but keep the config)
|
||||||
$(call print-help,distclean,Remove all generated files)
|
$(call print-help,distclean,Remove all generated files)
|
||||||
|
48
configure
vendored
48
configure
vendored
@ -542,6 +542,8 @@ gettext=""
|
|||||||
bogus_os="no"
|
bogus_os="no"
|
||||||
malloc_trim=""
|
malloc_trim=""
|
||||||
|
|
||||||
|
deprecated_features=""
|
||||||
|
|
||||||
# parse CC options first
|
# parse CC options first
|
||||||
for opt do
|
for opt do
|
||||||
optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
|
optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
|
||||||
@ -1720,26 +1722,25 @@ if [ "$bsd_user" = "yes" ]; then
|
|||||||
mak_wilds="${mak_wilds} $source_path/default-configs/*-bsd-user.mak"
|
mak_wilds="${mak_wilds} $source_path/default-configs/*-bsd-user.mak"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test -z "$target_list_exclude"; then
|
if test -z "$target_list_exclude" -a -z "$target_list"; then
|
||||||
for config in $mak_wilds; do
|
# if the user doesn't specify anything lets skip deprecating stuff
|
||||||
default_target_list="${default_target_list} $(basename "$config" .mak)"
|
target_list_exclude=ppc64abi32-linux-user
|
||||||
done
|
fi
|
||||||
else
|
|
||||||
exclude_list=$(echo "$target_list_exclude" | sed -e 's/,/ /g')
|
exclude_list=$(echo "$target_list_exclude" | sed -e 's/,/ /g')
|
||||||
for config in $mak_wilds; do
|
for config in $mak_wilds; do
|
||||||
target="$(basename "$config" .mak)"
|
target="$(basename "$config" .mak)"
|
||||||
exclude="no"
|
exclude="no"
|
||||||
for excl in $exclude_list; do
|
for excl in $exclude_list; do
|
||||||
if test "$excl" = "$target"; then
|
if test "$excl" = "$target"; then
|
||||||
exclude="yes"
|
exclude="yes"
|
||||||
break;
|
break;
|
||||||
fi
|
|
||||||
done
|
|
||||||
if test "$exclude" = "no"; then
|
|
||||||
default_target_list="${default_target_list} $target"
|
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
fi
|
if test "$exclude" = "no"; then
|
||||||
|
default_target_list="${default_target_list} $target"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
# Enumerate public trace backends for --help output
|
# Enumerate public trace backends for --help output
|
||||||
trace_backend_list=$(echo $(grep -le '^PUBLIC = True$' "$source_path"/scripts/tracetool/backend/*.py | sed -e 's/^.*\/\(.*\)\.py$/\1/'))
|
trace_backend_list=$(echo $(grep -le '^PUBLIC = True$' "$source_path"/scripts/tracetool/backend/*.py | sed -e 's/^.*\/\(.*\)\.py$/\1/'))
|
||||||
@ -7557,7 +7558,7 @@ TARGET_SYSTBL=""
|
|||||||
case "$target_name" in
|
case "$target_name" in
|
||||||
i386)
|
i386)
|
||||||
mttcg="yes"
|
mttcg="yes"
|
||||||
gdb_xml_files="i386-32bit.xml"
|
gdb_xml_files="i386-32bit.xml"
|
||||||
TARGET_SYSTBL_ABI=i386
|
TARGET_SYSTBL_ABI=i386
|
||||||
TARGET_SYSTBL=syscall_32.tbl
|
TARGET_SYSTBL=syscall_32.tbl
|
||||||
;;
|
;;
|
||||||
@ -7667,6 +7668,7 @@ case "$target_name" in
|
|||||||
TARGET_SYSTBL_ABI=common,nospu,32
|
TARGET_SYSTBL_ABI=common,nospu,32
|
||||||
echo "TARGET_ABI32=y" >> $config_target_mak
|
echo "TARGET_ABI32=y" >> $config_target_mak
|
||||||
gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
|
gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
|
||||||
|
deprecated_features="ppc64abi32 ${deprecated_features}"
|
||||||
;;
|
;;
|
||||||
riscv32)
|
riscv32)
|
||||||
TARGET_BASE_ARCH=riscv
|
TARGET_BASE_ARCH=riscv
|
||||||
@ -7853,6 +7855,7 @@ DIRS="$DIRS tests/qtest tests/qemu-iotests tests/vm tests/fp tests/qgraph"
|
|||||||
DIRS="$DIRS docs docs/interop fsdev scsi"
|
DIRS="$DIRS docs docs/interop fsdev scsi"
|
||||||
DIRS="$DIRS pc-bios/optionrom pc-bios/s390-ccw"
|
DIRS="$DIRS pc-bios/optionrom pc-bios/s390-ccw"
|
||||||
DIRS="$DIRS roms/seabios"
|
DIRS="$DIRS roms/seabios"
|
||||||
|
DIRS="$DIRS contrib/plugins/"
|
||||||
LINKS="Makefile"
|
LINKS="Makefile"
|
||||||
LINKS="$LINKS tests/tcg/lm32/Makefile"
|
LINKS="$LINKS tests/tcg/lm32/Makefile"
|
||||||
LINKS="$LINKS tests/tcg/Makefile.target"
|
LINKS="$LINKS tests/tcg/Makefile.target"
|
||||||
@ -7864,6 +7867,7 @@ LINKS="$LINKS .gdbinit scripts" # scripts needed by relative path in .gdbinit
|
|||||||
LINKS="$LINKS tests/acceptance tests/data"
|
LINKS="$LINKS tests/acceptance tests/data"
|
||||||
LINKS="$LINKS tests/qemu-iotests/check"
|
LINKS="$LINKS tests/qemu-iotests/check"
|
||||||
LINKS="$LINKS python"
|
LINKS="$LINKS python"
|
||||||
|
LINKS="$LINKS contrib/plugins/Makefile "
|
||||||
UNLINK="pc-bios/keymaps"
|
UNLINK="pc-bios/keymaps"
|
||||||
for bios_file in \
|
for bios_file in \
|
||||||
$source_path/pc-bios/*.bin \
|
$source_path/pc-bios/*.bin \
|
||||||
@ -8011,6 +8015,12 @@ fi
|
|||||||
touch ninjatool.stamp
|
touch ninjatool.stamp
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if test -n "${deprecated_features}"; then
|
||||||
|
echo "Warning, deprecated features enabled."
|
||||||
|
echo "Please see docs/system/deprecated.rst"
|
||||||
|
echo " features: ${deprecated_features}"
|
||||||
|
fi
|
||||||
|
|
||||||
# Save the configure command line for later reuse.
|
# Save the configure command line for later reuse.
|
||||||
cat <<EOD >config.status
|
cat <<EOD >config.status
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
42
contrib/plugins/Makefile
Normal file
42
contrib/plugins/Makefile
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
# -*- Mode: makefile -*-
|
||||||
|
#
|
||||||
|
# This Makefile example is fairly independent from the main makefile
|
||||||
|
# so users can take and adapt it for their build. We only really
|
||||||
|
# include config-host.mak so we don't have to repeat probing for
|
||||||
|
# cflags that the main configure has already done for us.
|
||||||
|
#
|
||||||
|
|
||||||
|
BUILD_DIR := $(CURDIR)/../..
|
||||||
|
|
||||||
|
include $(BUILD_DIR)/config-host.mak
|
||||||
|
|
||||||
|
VPATH += $(SRC_PATH)/contrib/plugins
|
||||||
|
|
||||||
|
NAMES :=
|
||||||
|
NAMES += hotblocks
|
||||||
|
NAMES += hotpages
|
||||||
|
NAMES += howvec
|
||||||
|
NAMES += lockstep
|
||||||
|
|
||||||
|
SONAMES := $(addsuffix .so,$(addprefix lib,$(NAMES)))
|
||||||
|
|
||||||
|
# The main QEMU uses Glib extensively so it's perfectly fine to use it
|
||||||
|
# in plugins (which many example do).
|
||||||
|
CFLAGS = $(GLIB_CFLAGS)
|
||||||
|
CFLAGS += -fPIC
|
||||||
|
CFLAGS += $(if $(findstring no-psabi,$(QEMU_CFLAGS)),-Wpsabi)
|
||||||
|
CFLAGS += -I$(SRC_PATH)/include/qemu
|
||||||
|
|
||||||
|
all: $(SONAMES)
|
||||||
|
|
||||||
|
%.o: %.c
|
||||||
|
$(CC) $(CFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
|
lib%.so: %.o
|
||||||
|
$(CC) -shared -Wl,-soname,$@ -o $@ $^ $(LDLIBS)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.o *.so *.d
|
||||||
|
rm -Rf .libs
|
||||||
|
|
||||||
|
.PHONY: all clean
|
@ -134,3 +134,149 @@ longer want to instrument the code. This operation is asynchronous
|
|||||||
which means callbacks may still occur after the uninstall operation is
|
which means callbacks may still occur after the uninstall operation is
|
||||||
requested. The plugin isn't completely uninstalled until the safe work
|
requested. The plugin isn't completely uninstalled until the safe work
|
||||||
has executed while all vCPUs are quiescent.
|
has executed while all vCPUs are quiescent.
|
||||||
|
|
||||||
|
Example Plugins
|
||||||
|
===============
|
||||||
|
|
||||||
|
There are a number of plugins included with QEMU and you are
|
||||||
|
encouraged to contribute your own plugins plugins upstream. There is a
|
||||||
|
`contrib/plugins` directory where they can go.
|
||||||
|
|
||||||
|
- tests/plugins
|
||||||
|
|
||||||
|
These are some basic plugins that are used to test and exercise the
|
||||||
|
API during the `make check-tcg` target.
|
||||||
|
|
||||||
|
- contrib/plugins/hotblocks.c
|
||||||
|
|
||||||
|
The hotblocks plugin allows you to examine the where hot paths of
|
||||||
|
execution are in your program. Once the program has finished you will
|
||||||
|
get a sorted list of blocks reporting the starting PC, translation
|
||||||
|
count, number of instructions and execution count. This will work best
|
||||||
|
with linux-user execution as system emulation tends to generate
|
||||||
|
re-translations as blocks from different programs get swapped in and
|
||||||
|
out of system memory.
|
||||||
|
|
||||||
|
If your program is single-threaded you can use the `inline` option for
|
||||||
|
slightly faster (but not thread safe) counters.
|
||||||
|
|
||||||
|
Example::
|
||||||
|
|
||||||
|
./aarch64-linux-user/qemu-aarch64 \
|
||||||
|
-plugin contrib/plugins/libhotblocks.so -d plugin \
|
||||||
|
./tests/tcg/aarch64-linux-user/sha1
|
||||||
|
SHA1=15dd99a1991e0b3826fede3deffc1feba42278e6
|
||||||
|
collected 903 entries in the hash table
|
||||||
|
pc, tcount, icount, ecount
|
||||||
|
0x0000000041ed10, 1, 5, 66087
|
||||||
|
0x000000004002b0, 1, 4, 66087
|
||||||
|
...
|
||||||
|
|
||||||
|
- contrib/plugins/hotpages.c
|
||||||
|
|
||||||
|
Similar to hotblocks but this time tracks memory accesses::
|
||||||
|
|
||||||
|
./aarch64-linux-user/qemu-aarch64 \
|
||||||
|
-plugin contrib/plugins/libhotpages.so -d plugin \
|
||||||
|
./tests/tcg/aarch64-linux-user/sha1
|
||||||
|
SHA1=15dd99a1991e0b3826fede3deffc1feba42278e6
|
||||||
|
Addr, RCPUs, Reads, WCPUs, Writes
|
||||||
|
0x000055007fe000, 0x0001, 31747952, 0x0001, 8835161
|
||||||
|
0x000055007ff000, 0x0001, 29001054, 0x0001, 8780625
|
||||||
|
0x00005500800000, 0x0001, 687465, 0x0001, 335857
|
||||||
|
0x0000000048b000, 0x0001, 130594, 0x0001, 355
|
||||||
|
0x0000000048a000, 0x0001, 1826, 0x0001, 11
|
||||||
|
|
||||||
|
- contrib/plugins/howvec.c
|
||||||
|
|
||||||
|
This is an instruction classifier so can be used to count different
|
||||||
|
types of instructions. It has a number of options to refine which get
|
||||||
|
counted. You can give an argument for a class of instructions to break
|
||||||
|
it down fully, so for example to see all the system registers
|
||||||
|
accesses::
|
||||||
|
|
||||||
|
./aarch64-softmmu/qemu-system-aarch64 $(QEMU_ARGS) \
|
||||||
|
-append "root=/dev/sda2 systemd.unit=benchmark.service" \
|
||||||
|
-smp 4 -plugin ./contrib/plugins/libhowvec.so,arg=sreg -d plugin
|
||||||
|
|
||||||
|
which will lead to a sorted list after the class breakdown::
|
||||||
|
|
||||||
|
Instruction Classes:
|
||||||
|
Class: UDEF not counted
|
||||||
|
Class: SVE (68 hits)
|
||||||
|
Class: PCrel addr (47789483 hits)
|
||||||
|
Class: Add/Sub (imm) (192817388 hits)
|
||||||
|
Class: Logical (imm) (93852565 hits)
|
||||||
|
Class: Move Wide (imm) (76398116 hits)
|
||||||
|
Class: Bitfield (44706084 hits)
|
||||||
|
Class: Extract (5499257 hits)
|
||||||
|
Class: Cond Branch (imm) (147202932 hits)
|
||||||
|
Class: Exception Gen (193581 hits)
|
||||||
|
Class: NOP not counted
|
||||||
|
Class: Hints (6652291 hits)
|
||||||
|
Class: Barriers (8001661 hits)
|
||||||
|
Class: PSTATE (1801695 hits)
|
||||||
|
Class: System Insn (6385349 hits)
|
||||||
|
Class: System Reg counted individually
|
||||||
|
Class: Branch (reg) (69497127 hits)
|
||||||
|
Class: Branch (imm) (84393665 hits)
|
||||||
|
Class: Cmp & Branch (110929659 hits)
|
||||||
|
Class: Tst & Branch (44681442 hits)
|
||||||
|
Class: AdvSimd ldstmult (736 hits)
|
||||||
|
Class: ldst excl (9098783 hits)
|
||||||
|
Class: Load Reg (lit) (87189424 hits)
|
||||||
|
Class: ldst noalloc pair (3264433 hits)
|
||||||
|
Class: ldst pair (412526434 hits)
|
||||||
|
Class: ldst reg (imm) (314734576 hits)
|
||||||
|
Class: Loads & Stores (2117774 hits)
|
||||||
|
Class: Data Proc Reg (223519077 hits)
|
||||||
|
Class: Scalar FP (31657954 hits)
|
||||||
|
Individual Instructions:
|
||||||
|
Instr: mrs x0, sp_el0 (2682661 hits) (op=0xd5384100/ System Reg)
|
||||||
|
Instr: mrs x1, tpidr_el2 (1789339 hits) (op=0xd53cd041/ System Reg)
|
||||||
|
Instr: mrs x2, tpidr_el2 (1513494 hits) (op=0xd53cd042/ System Reg)
|
||||||
|
Instr: mrs x0, tpidr_el2 (1490823 hits) (op=0xd53cd040/ System Reg)
|
||||||
|
Instr: mrs x1, sp_el0 (933793 hits) (op=0xd5384101/ System Reg)
|
||||||
|
Instr: mrs x2, sp_el0 (699516 hits) (op=0xd5384102/ System Reg)
|
||||||
|
Instr: mrs x4, tpidr_el2 (528437 hits) (op=0xd53cd044/ System Reg)
|
||||||
|
Instr: mrs x30, ttbr1_el1 (480776 hits) (op=0xd538203e/ System Reg)
|
||||||
|
Instr: msr ttbr1_el1, x30 (480713 hits) (op=0xd518203e/ System Reg)
|
||||||
|
Instr: msr vbar_el1, x30 (480671 hits) (op=0xd518c01e/ System Reg)
|
||||||
|
...
|
||||||
|
|
||||||
|
To find the argument shorthand for the class you need to examine the
|
||||||
|
source code of the plugin at the moment, specifically the `*opt`
|
||||||
|
argument in the InsnClassExecCount tables.
|
||||||
|
|
||||||
|
- contrib/plugins/lockstep.c
|
||||||
|
|
||||||
|
This is a debugging tool for developers who want to find out when and
|
||||||
|
where execution diverges after a subtle change to TCG code generation.
|
||||||
|
It is not an exact science and results are likely to be mixed once
|
||||||
|
asynchronous events are introduced. While the use of -icount can
|
||||||
|
introduce determinism to the execution flow it doesn't always follow
|
||||||
|
the translation sequence will be exactly the same. Typically this is
|
||||||
|
caused by a timer firing to service the GUI causing a block to end
|
||||||
|
early. However in some cases it has proved to be useful in pointing
|
||||||
|
people at roughly where execution diverges. The only argument you need
|
||||||
|
for the plugin is a path for the socket the two instances will
|
||||||
|
communicate over::
|
||||||
|
|
||||||
|
|
||||||
|
./sparc-softmmu/qemu-system-sparc -monitor none -parallel none \
|
||||||
|
-net none -M SS-20 -m 256 -kernel day11/zImage.elf \
|
||||||
|
-plugin ./contrib/plugins/liblockstep.so,arg=lockstep-sparc.sock \
|
||||||
|
-d plugin,nochain
|
||||||
|
|
||||||
|
which will eventually report::
|
||||||
|
|
||||||
|
qemu-system-sparc: warning: nic lance.0 has no peer
|
||||||
|
@ 0x000000ffd06678 vs 0x000000ffd001e0 (2/1 since last)
|
||||||
|
@ 0x000000ffd07d9c vs 0x000000ffd06678 (3/1 since last)
|
||||||
|
Δ insn_count @ 0x000000ffd07d9c (809900609) vs 0x000000ffd06678 (809900612)
|
||||||
|
previously @ 0x000000ffd06678/10 (809900609 insns)
|
||||||
|
previously @ 0x000000ffd001e0/4 (809900599 insns)
|
||||||
|
previously @ 0x000000ffd080ac/2 (809900595 insns)
|
||||||
|
previously @ 0x000000ffd08098/5 (809900593 insns)
|
||||||
|
previously @ 0x000000ffd080c0/1 (809900588 insns)
|
||||||
|
|
||||||
|
@ -424,6 +424,13 @@ linux-user mode) is deprecated and will be removed in a future version
|
|||||||
of QEMU. Support for this CPU was removed from the upstream Linux
|
of QEMU. Support for this CPU was removed from the upstream Linux
|
||||||
kernel in 2018, and has also been dropped from glibc.
|
kernel in 2018, and has also been dropped from glibc.
|
||||||
|
|
||||||
|
``ppc64abi32`` CPUs (since 5.2.0)
|
||||||
|
'''''''''''''''''''''''''''''''''
|
||||||
|
|
||||||
|
The ``ppc64abi32`` architecture has a number of issues which regularly
|
||||||
|
trip up our CI testing and is suspected to be quite broken. For that
|
||||||
|
reason the maintainers strongly suspect no one actually uses it.
|
||||||
|
|
||||||
Related binaries
|
Related binaries
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
|
@ -930,7 +930,7 @@ void igd_passthrough_isa_bridge_create(PCIBus *bus, uint16_t gpu_dev_id)
|
|||||||
struct PCIDevice *bridge_dev;
|
struct PCIDevice *bridge_dev;
|
||||||
int i, num;
|
int i, num;
|
||||||
uint16_t pch_dev_id = 0xffff;
|
uint16_t pch_dev_id = 0xffff;
|
||||||
uint8_t pch_rev_id;
|
uint8_t pch_rev_id = 0;
|
||||||
|
|
||||||
num = ARRAY_SIZE(igd_combo_id_infos);
|
num = ARRAY_SIZE(igd_combo_id_infos);
|
||||||
for (i = 0; i < num; i++) {
|
for (i = 0; i < num; i++) {
|
||||||
|
@ -943,7 +943,7 @@ static int usb_host_open(USBHostDevice *s, libusb_device *dev, int hostfd)
|
|||||||
usb_host_ep_update(s);
|
usb_host_ep_update(s);
|
||||||
|
|
||||||
libusb_speed = libusb_get_device_speed(dev);
|
libusb_speed = libusb_get_device_speed(dev);
|
||||||
#ifdef CONFIG_LINUX
|
#if LIBUSB_API_VERSION >= 0x01000107 && defined(CONFIG_LINUX)
|
||||||
if (hostfd && libusb_speed == 0) {
|
if (hostfd && libusb_speed == 0) {
|
||||||
/*
|
/*
|
||||||
* Workaround libusb bug: libusb_get_device_speed() does not
|
* Workaround libusb bug: libusb_get_device_speed() does not
|
||||||
|
@ -20028,8 +20028,7 @@ static void gen_pool32axf_nanomips_insn(CPUMIPSState *env, DisasContext *ctx)
|
|||||||
static void gen_compute_imm_branch(DisasContext *ctx, uint32_t opc,
|
static void gen_compute_imm_branch(DisasContext *ctx, uint32_t opc,
|
||||||
int rt, int32_t imm, int32_t offset)
|
int rt, int32_t imm, int32_t offset)
|
||||||
{
|
{
|
||||||
TCGCond cond;
|
TCGCond cond = TCG_COND_ALWAYS;
|
||||||
int bcond_compute = 0;
|
|
||||||
TCGv t0 = tcg_temp_new();
|
TCGv t0 = tcg_temp_new();
|
||||||
TCGv t1 = tcg_temp_new();
|
TCGv t1 = tcg_temp_new();
|
||||||
|
|
||||||
@ -20046,7 +20045,6 @@ static void gen_compute_imm_branch(DisasContext *ctx, uint32_t opc,
|
|||||||
/* Treat as NOP */
|
/* Treat as NOP */
|
||||||
goto out;
|
goto out;
|
||||||
} else {
|
} else {
|
||||||
bcond_compute = 1;
|
|
||||||
cond = TCG_COND_EQ;
|
cond = TCG_COND_EQ;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -20065,7 +20063,6 @@ static void gen_compute_imm_branch(DisasContext *ctx, uint32_t opc,
|
|||||||
tcg_gen_shri_tl(t0, t0, imm);
|
tcg_gen_shri_tl(t0, t0, imm);
|
||||||
tcg_gen_andi_tl(t0, t0, 1);
|
tcg_gen_andi_tl(t0, t0, 1);
|
||||||
tcg_gen_movi_tl(t1, 0);
|
tcg_gen_movi_tl(t1, 0);
|
||||||
bcond_compute = 1;
|
|
||||||
if (opc == NM_BBEQZC) {
|
if (opc == NM_BBEQZC) {
|
||||||
cond = TCG_COND_EQ;
|
cond = TCG_COND_EQ;
|
||||||
} else {
|
} else {
|
||||||
@ -20080,7 +20077,6 @@ static void gen_compute_imm_branch(DisasContext *ctx, uint32_t opc,
|
|||||||
} else if (rt == 0 && imm != 0) {
|
} else if (rt == 0 && imm != 0) {
|
||||||
/* Unconditional branch */
|
/* Unconditional branch */
|
||||||
} else {
|
} else {
|
||||||
bcond_compute = 1;
|
|
||||||
cond = TCG_COND_NE;
|
cond = TCG_COND_NE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -20088,24 +20084,20 @@ static void gen_compute_imm_branch(DisasContext *ctx, uint32_t opc,
|
|||||||
if (rt == 0 && imm == 0) {
|
if (rt == 0 && imm == 0) {
|
||||||
/* Unconditional branch */
|
/* Unconditional branch */
|
||||||
} else {
|
} else {
|
||||||
bcond_compute = 1;
|
|
||||||
cond = TCG_COND_GE;
|
cond = TCG_COND_GE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case NM_BLTIC:
|
case NM_BLTIC:
|
||||||
bcond_compute = 1;
|
|
||||||
cond = TCG_COND_LT;
|
cond = TCG_COND_LT;
|
||||||
break;
|
break;
|
||||||
case NM_BGEIUC:
|
case NM_BGEIUC:
|
||||||
if (rt == 0 && imm == 0) {
|
if (rt == 0 && imm == 0) {
|
||||||
/* Unconditional branch */
|
/* Unconditional branch */
|
||||||
} else {
|
} else {
|
||||||
bcond_compute = 1;
|
|
||||||
cond = TCG_COND_GEU;
|
cond = TCG_COND_GEU;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case NM_BLTIUC:
|
case NM_BLTIUC:
|
||||||
bcond_compute = 1;
|
|
||||||
cond = TCG_COND_LTU;
|
cond = TCG_COND_LTU;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -20118,7 +20110,7 @@ static void gen_compute_imm_branch(DisasContext *ctx, uint32_t opc,
|
|||||||
clear_branch_hflags(ctx);
|
clear_branch_hflags(ctx);
|
||||||
ctx->base.is_jmp = DISAS_NORETURN;
|
ctx->base.is_jmp = DISAS_NORETURN;
|
||||||
|
|
||||||
if (bcond_compute == 0) {
|
if (cond == TCG_COND_ALWAYS) {
|
||||||
/* Uncoditional compact branch */
|
/* Uncoditional compact branch */
|
||||||
gen_goto_tb(ctx, 0, ctx->btarget);
|
gen_goto_tb(ctx, 0, ctx->btarget);
|
||||||
} else {
|
} else {
|
||||||
|
@ -50,7 +50,7 @@ RUN_TCG_TARGET_RULES=$(patsubst %,run-tcg-tests-%, $(TARGET_DIRS))
|
|||||||
$(foreach PROBE_TARGET,$(TARGET_DIRS), \
|
$(foreach PROBE_TARGET,$(TARGET_DIRS), \
|
||||||
$(eval -include $(SRC_PATH)/tests/tcg/Makefile.prereqs))
|
$(eval -include $(SRC_PATH)/tests/tcg/Makefile.prereqs))
|
||||||
|
|
||||||
build-tcg-tests-%: $(if $(CONFIG_PLUGIN),plugins)
|
build-tcg-tests-%: $(if $(CONFIG_PLUGIN),test-plugins)
|
||||||
$(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) \
|
$(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) \
|
||||||
-f $(SRC_PATH)/tests/tcg/Makefile.qemu \
|
-f $(SRC_PATH)/tests/tcg/Makefile.qemu \
|
||||||
SRC_PATH=$(SRC_PATH) \
|
SRC_PATH=$(SRC_PATH) \
|
||||||
@ -127,7 +127,7 @@ check-acceptance: check-venv $(TESTS_RESULTS_DIR) get-vm-images
|
|||||||
--show=$(AVOCADO_SHOW) run --job-results-dir=$(TESTS_RESULTS_DIR) \
|
--show=$(AVOCADO_SHOW) run --job-results-dir=$(TESTS_RESULTS_DIR) \
|
||||||
--filter-by-tags-include-empty --filter-by-tags-include-empty-key \
|
--filter-by-tags-include-empty --filter-by-tags-include-empty-key \
|
||||||
$(AVOCADO_TAGS) \
|
$(AVOCADO_TAGS) \
|
||||||
$(if $(GITLAB_CI),,--failfast=on) tests/acceptance, \
|
$(if $(GITLAB_CI),,--failfast) tests/acceptance, \
|
||||||
"AVOCADO", "tests/acceptance")
|
"AVOCADO", "tests/acceptance")
|
||||||
|
|
||||||
# Consolidated targets
|
# Consolidated targets
|
||||||
|
@ -192,3 +192,15 @@ class Test(avocado.Test):
|
|||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
for vm in self._vms.values():
|
for vm in self._vms.values():
|
||||||
vm.shutdown()
|
vm.shutdown()
|
||||||
|
|
||||||
|
def fetch_asset(self, name,
|
||||||
|
asset_hash=None, algorithm=None,
|
||||||
|
locations=None, expire=None,
|
||||||
|
find_only=False, cancel_on_missing=True):
|
||||||
|
return super(Test, self).fetch_asset(name,
|
||||||
|
asset_hash=asset_hash,
|
||||||
|
algorithm=algorithm,
|
||||||
|
locations=locations,
|
||||||
|
expire=expire,
|
||||||
|
find_only=find_only,
|
||||||
|
cancel_on_missing=cancel_on_missing)
|
||||||
|
@ -259,8 +259,9 @@ test('decodetree', sh,
|
|||||||
workdir: meson.current_source_dir() / 'decode',
|
workdir: meson.current_source_dir() / 'decode',
|
||||||
suite: 'decodetree')
|
suite: 'decodetree')
|
||||||
|
|
||||||
|
subdir('fp')
|
||||||
|
|
||||||
if 'CONFIG_TCG' in config_host
|
if 'CONFIG_TCG' in config_host
|
||||||
subdir('fp')
|
|
||||||
if 'CONFIG_PLUGIN' in config_host
|
if 'CONFIG_PLUGIN' in config_host
|
||||||
subdir('plugin')
|
subdir('plugin')
|
||||||
endif
|
endif
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
t = []
|
t = []
|
||||||
foreach i : ['bb', 'empty', 'insn', 'mem', 'hotblocks', 'howvec', 'hotpages', 'lockstep']
|
foreach i : ['bb', 'empty', 'insn', 'mem']
|
||||||
t += shared_module(i, files(i + '.c'),
|
t += shared_module(i, files(i + '.c'),
|
||||||
include_directories: '../../include/qemu',
|
include_directories: '../../include/qemu',
|
||||||
dependencies: glib)
|
dependencies: glib)
|
||||||
endforeach
|
endforeach
|
||||||
alias_target('plugins', t)
|
alias_target('test-plugins', t)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
# Add Python module requirements, one per line, to be installed
|
# Add Python module requirements, one per line, to be installed
|
||||||
# in the tests/venv Python virtual environment. For more info,
|
# in the tests/venv Python virtual environment. For more info,
|
||||||
# refer to: https://pip.pypa.io/en/stable/user_guide/#id1
|
# refer to: https://pip.pypa.io/en/stable/user_guide/#id1
|
||||||
avocado-framework==76.0
|
avocado-framework==81.0
|
||||||
pycdlib==1.9.0
|
pycdlib==1.9.0
|
||||||
|
@ -129,8 +129,7 @@ ifeq ($(CONFIG_PLUGIN),y)
|
|||||||
PLUGIN_SRC=$(SRC_PATH)/tests/plugin
|
PLUGIN_SRC=$(SRC_PATH)/tests/plugin
|
||||||
PLUGIN_LIB=../../plugin
|
PLUGIN_LIB=../../plugin
|
||||||
VPATH+=$(PLUGIN_LIB)
|
VPATH+=$(PLUGIN_LIB)
|
||||||
PLUGINS=$(filter-out liblockstep.so,\
|
PLUGINS=$(patsubst %.c, lib%.so, $(notdir $(wildcard $(PLUGIN_SRC)/*.c)))
|
||||||
$(patsubst %.c, lib%.so, $(notdir $(wildcard $(PLUGIN_SRC)/*.c))))
|
|
||||||
|
|
||||||
# We need to ensure expand the run-plugin-TEST-with-PLUGIN
|
# We need to ensure expand the run-plugin-TEST-with-PLUGIN
|
||||||
# pre-requistes manually here as we can't use stems to handle it. We
|
# pre-requistes manually here as we can't use stems to handle it. We
|
||||||
|
Loading…
x
Reference in New Issue
Block a user