Merge tag 'pull-10.2-maintainer-291025-1' of https://gitlab.com/stsquad/qemu into staging

maintainer updates for 10.2

  - clean-up remaining 32 bit armhf bits in ci
  - rationalise build-environment.yml for Debian and Ubuntu
  - generate a Debian ppc64 package list
  - rationalise gitlab-runner.yml for Debian and Ubuntu
  - new TCG plugin feature to track discontinuities
  - add missing CFI annotation to plugin callbacks
  - drop SBSA_REF from minimal Arm build
  - format string fix for gdbstub syscall response
  - simplify the gdbstub flen handling for semihosting

# -----BEGIN PGP SIGNATURE-----
#
# iQEzBAABCgAdFiEEZoWumedRZ7yvyN81+9DbCVqeKkQFAmkCInQACgkQ+9DbCVqe
# KkSZRwf/ReHIqQMxf8TqthskX8PLGUvsvWMkJptpu0Yc4HyU6DSjdPbU4L0tOmLU
# ss2sb+dZncp1iRxHpqOhPJ+a987RHHzFbz2GQ/nV37D7BTwtq0iID4SxmdfiYOAm
# VVm/WQ0HMjIYY84rzfE6U/3H+FgL+GaPbB0WYa5CtKpMOHMl4gJgoSsxljXQrmYe
# BCC+Z9loVUAnKVVM5BUMP/0Agfn0CUZlUHGEn6RvmNg81dJ5DWCfO9yW1EezLZmc
# PhS/txAWrpTqktPxN4h+um8ILvej5FF8nnNCsxodxD1XZImWsxawxcQAcgQQJGWu
# dFLBMre7QSM1ddIOgdyZt+zuDcpUiA==
# =QEqf
# -----END PGP SIGNATURE-----
# gpg: Signature made Wed 29 Oct 2025 03:19:32 PM CET
# gpg:                using RSA key 6685AE99E75167BCAFC8DF35FBD0DB095A9E2A44
# gpg: Good signature from "Alex Bennée (Master Work Key) <alex.bennee@linaro.org>" [unknown]
# gpg: WARNING: This key is not certified with a trusted signature!
# gpg:          There is no indication that the signature belongs to the owner.
# Primary key fingerprint: 6685 AE99 E751 67BC AFC8  DF35 FBD0 DB09 5A9E 2A44

* tag 'pull-10.2-maintainer-291025-1' of https://gitlab.com/stsquad/qemu: (35 commits)
  semihosting: Fix GDB File-I/O FLEN
  gdbstub: Fix %s formatting
  configs: drop SBSA_REF from minimal specification
  plugins/core: add missing QEMU_DISABLE_CFI annotations
  tests: add test with interrupted memory accesses on rv64
  tests: add test for double-traps on rv64
  tests: add plugin asserting correctness of discon event's to_pc
  target/xtensa: call plugin trap callbacks
  target/tricore: call plugin trap callbacks
  target/sparc: call plugin trap callbacks
  target/sh4: call plugin trap callbacks
  target/s390x: call plugin trap callbacks
  target/rx: call plugin trap callbacks
  target/riscv: call plugin trap callbacks
  target/ppc: call plugin trap callbacks
  target/openrisc: call plugin trap callbacks
  target/mips: call plugin trap callbacks
  target/microblaze: call plugin trap callbacks
  target/m68k: call plugin trap callbacks
  target/loongarch: call plugin trap callbacks
  ...

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson
2025-10-30 09:25:15 +01:00
47 changed files with 1031 additions and 37 deletions
@@ -107,7 +107,5 @@ ubuntu-24.04-aarch64-notcg:
rules:
- if: '$CI_PROJECT_NAMESPACE == "qemu-project" && $CI_COMMIT_BRANCH =~ /^staging/'
when: manual
allow_failure: true
- if: "$AARCH64_RUNNER_AVAILABLE"
when: manual
allow_failure: true
@@ -6,4 +6,3 @@
#
CONFIG_ARM_VIRT=y
CONFIG_SBSA_REF=y
+1 -1
View File
@@ -1,6 +1,6 @@
contrib_plugins = ['bbv', 'cache', 'cflow', 'drcov', 'execlog', 'hotblocks',
'hotpages', 'howvec', 'hwprofile', 'ips', 'stoptrigger',
'uftrace']
'traps', 'uftrace']
if host_os != 'windows'
# lockstep uses socket.h
contrib_plugins += 'lockstep'
+83
View File
@@ -0,0 +1,83 @@
/*
* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright (C) 2025, Julian Ganz <neither@nut.email>
*
* Traps - count traps
*
* Count the number of interrupts (asyncronous events), exceptions (synchronous
* events) and host calls (e.g. semihosting) per cpu and report those counts on
* exit.
*/
#include <stdio.h>
#include <qemu-plugin.h>
QEMU_PLUGIN_EXPORT int qemu_plugin_version = QEMU_PLUGIN_VERSION;
typedef struct {
uint64_t interrupts;
uint64_t exceptions;
uint64_t hostcalls;
} TrapCounters;
static struct qemu_plugin_scoreboard *traps;
static void vcpu_discon(qemu_plugin_id_t id, unsigned int vcpu_index,
enum qemu_plugin_discon_type type, uint64_t from_pc,
uint64_t to_pc)
{
TrapCounters *rec = qemu_plugin_scoreboard_find(traps, vcpu_index);
switch (type) {
case QEMU_PLUGIN_DISCON_INTERRUPT:
rec->interrupts++;
break;
case QEMU_PLUGIN_DISCON_EXCEPTION:
rec->exceptions++;
break;
case QEMU_PLUGIN_DISCON_HOSTCALL:
rec->hostcalls++;
break;
default:
g_assert_not_reached();
break;
}
}
static void plugin_exit(qemu_plugin_id_t id, void *p)
{
g_autoptr(GString) report;
report = g_string_new("VCPU, interrupts, exceptions, hostcalls\n");
int max_vcpus = qemu_plugin_num_vcpus();
int vcpu;
for (vcpu = 0; vcpu < max_vcpus; vcpu++) {
TrapCounters *rec = qemu_plugin_scoreboard_find(traps, vcpu);
g_string_append_printf(report,
"% 4d, % 10"PRId64", % 10"PRId64", % 10"PRId64
"\n", vcpu, rec->interrupts, rec->exceptions,
rec->hostcalls);
}
qemu_plugin_outs(report->str);
qemu_plugin_scoreboard_free(traps);
}
QEMU_PLUGIN_EXPORT
int qemu_plugin_install(qemu_plugin_id_t id, const qemu_info_t *info,
int argc, char **argv)
{
if (!info->system_emulation) {
qemu_plugin_outs("Note: interrupts are only reported in system"
" emulation mode.");
}
traps = qemu_plugin_scoreboard_new(sizeof(TrapCounters));
qemu_plugin_register_vcpu_discon_cb(id, QEMU_PLUGIN_DISCON_ALL,
vcpu_discon);
qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
return 0;
}
+8
View File
@@ -1015,6 +1015,14 @@ interesting to generate them around a particular point of execution::
# generate trace around init execution (2 seconds):
$ uftrace dump --chrome --time-range=1753122320~1753122322 > init.json
Count traps
...........
``contrib/plugins/traps.c``
This plugin counts the number of interrupts (asyncronous events), exceptions
(synchronous events) and host calls (e.g. semihosting) per cpu.
Other emulation features
------------------------
-7
View File
@@ -168,13 +168,6 @@ If you've got access to an aarch64 host that can be used as a gitlab-CI
runner, you can set this variable to enable the tests that require this
kind of host. The runner should be tagged with "aarch64".
AARCH32_RUNNER_AVAILABLE
~~~~~~~~~~~~~~~~~~~~~~~~
If you've got access to an armhf host or an arch64 host that can run
aarch32 EL0 code to be used as a gitlab-CI runner, you can set this
variable to enable the tests that require this kind of host. The
runner should be tagged with "aarch32".
S390X_RUNNER_AVAILABLE
~~~~~~~~~~~~~~~~~~~~~~
If you've got access to an IBM Z host that can be used as a gitlab-CI
+1 -1
View File
@@ -127,7 +127,7 @@ void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
case 's':
i64 = va_arg(va, uint64_t);
i32 = va_arg(va, uint32_t);
p += snprintf(p, p_end - p, "%" PRIx64 "/%x" PRIx32, i64, i32);
p += snprintf(p, p_end - p, "%" PRIx64 "/%" PRIx32, i64, i32);
break;
default:
bad_format:
+3
View File
@@ -20,6 +20,9 @@ enum qemu_plugin_event {
QEMU_PLUGIN_EV_VCPU_SYSCALL_RET,
QEMU_PLUGIN_EV_FLUSH,
QEMU_PLUGIN_EV_ATEXIT,
QEMU_PLUGIN_EV_VCPU_INTERRUPT,
QEMU_PLUGIN_EV_VCPU_EXCEPTION,
QEMU_PLUGIN_EV_VCPU_HOSTCALL,
QEMU_PLUGIN_EV_MAX, /* total number of plugin events we support */
};
+13
View File
@@ -59,6 +59,7 @@ union qemu_plugin_cb_sig {
qemu_plugin_udata_cb_t udata;
qemu_plugin_vcpu_simple_cb_t vcpu_simple;
qemu_plugin_vcpu_udata_cb_t vcpu_udata;
qemu_plugin_vcpu_discon_cb_t vcpu_discon;
qemu_plugin_vcpu_tb_trans_cb_t vcpu_tb_trans;
qemu_plugin_vcpu_mem_cb_t vcpu_mem;
qemu_plugin_vcpu_syscall_cb_t vcpu_syscall;
@@ -160,6 +161,9 @@ void qemu_plugin_vcpu_exit_hook(CPUState *cpu);
void qemu_plugin_tb_trans_cb(CPUState *cpu, struct qemu_plugin_tb *tb);
void qemu_plugin_vcpu_idle_cb(CPUState *cpu);
void qemu_plugin_vcpu_resume_cb(CPUState *cpu);
void qemu_plugin_vcpu_interrupt_cb(CPUState *cpu, uint64_t from);
void qemu_plugin_vcpu_exception_cb(CPUState *cpu, uint64_t from);
void qemu_plugin_vcpu_hostcall_cb(CPUState *cpu, uint64_t from);
void
qemu_plugin_vcpu_syscall(CPUState *cpu, int64_t num, uint64_t a1,
uint64_t a2, uint64_t a3, uint64_t a4, uint64_t a5,
@@ -257,6 +261,15 @@ static inline void qemu_plugin_vcpu_idle_cb(CPUState *cpu)
static inline void qemu_plugin_vcpu_resume_cb(CPUState *cpu)
{ }
static inline void qemu_plugin_vcpu_interrupt_cb(CPUState *cpu, uint64_t from)
{ }
static inline void qemu_plugin_vcpu_exception_cb(CPUState *cpu, uint64_t from)
{ }
static inline void qemu_plugin_vcpu_hostcall_cb(CPUState *cpu, uint64_t from)
{ }
static inline void
qemu_plugin_vcpu_syscall(CPUState *cpu, int64_t num, uint64_t a1, uint64_t a2,
uint64_t a3, uint64_t a4, uint64_t a5, uint64_t a6,
+60
View File
@@ -161,6 +161,50 @@ typedef void (*qemu_plugin_vcpu_simple_cb_t)(qemu_plugin_id_t id,
typedef void (*qemu_plugin_vcpu_udata_cb_t)(unsigned int vcpu_index,
void *userdata);
/**
* enum qemu_plugin_discon_type - type of a (potential) PC discontinuity
*
* @QEMU_PLUGIN_DISCON_INTERRUPT: an interrupt, defined across all architectures
* as an asynchronous event, usually originating
* from outside the CPU
* @QEMU_PLUGIN_DISCON_EXCEPTION: an exception, defined across all architectures
* as a synchronous event in response to a
* specific instruction being executed
* @QEMU_PLUGIN_DISCON_HOSTCALL: a host call, functionally a special kind of
* exception that is not handled by code run by
* the vCPU but machinery outside the vCPU
* @QEMU_PLUGIN_DISCON_ALL: all types of disconinuity events currently covered
*/
enum qemu_plugin_discon_type {
QEMU_PLUGIN_DISCON_INTERRUPT = 1 << 0,
QEMU_PLUGIN_DISCON_EXCEPTION = 1 << 1,
QEMU_PLUGIN_DISCON_HOSTCALL = 1 << 2,
QEMU_PLUGIN_DISCON_ALL = -1
};
/**
* typedef qemu_plugin_vcpu_discon_cb_t - vcpu discontinuity callback
* @id: plugin ID
* @vcpu_index: the current vcpu context
* @type: the type of discontinuity
* @from_pc: the source of the discontinuity, e.g. the PC before the
* transition
* @to_pc: the PC pointing to the next instruction to be executed
*
* The exact semantics of @from_pc depends on the @type of discontinuity. For
* interrupts, @from_pc will point to the next instruction which would have
* been executed. For exceptions and host calls, @from_pc will point to the
* instruction that caused the exception or issued the host call. Note that
* in the case of exceptions, the instruction may not be retired and thus not
* observable via general instruction exec callbacks. The same may be the case
* for some host calls such as hypervisor call "exceptions".
*/
typedef void (*qemu_plugin_vcpu_discon_cb_t)(qemu_plugin_id_t id,
unsigned int vcpu_index,
enum qemu_plugin_discon_type type,
uint64_t from_pc, uint64_t to_pc);
/**
* qemu_plugin_uninstall() - Uninstall a plugin
* @id: this plugin's opaque ID
@@ -237,6 +281,22 @@ QEMU_PLUGIN_API
void qemu_plugin_register_vcpu_resume_cb(qemu_plugin_id_t id,
qemu_plugin_vcpu_simple_cb_t cb);
/**
* qemu_plugin_register_vcpu_discon_cb() - register a discontinuity callback
* @id: plugin ID
* @type: types of discontinuities for which to call the callback
* @cb: callback function
*
* The @cb function is called every time a vCPU receives a discontinuity event
* of the specified type(s), after the vCPU was prepared to handle the event.
* Preparation entails updating the PC, usually to some interrupt handler or
* trap vector entry.
*/
QEMU_PLUGIN_API
void qemu_plugin_register_vcpu_discon_cb(qemu_plugin_id_t id,
enum qemu_plugin_discon_type type,
qemu_plugin_vcpu_discon_cb_t cb);
/** struct qemu_plugin_tb - Opaque handle for a translation block */
struct qemu_plugin_tb;
/** struct qemu_plugin_insn - Opaque handle for a translated instruction */
+58
View File
@@ -105,6 +105,30 @@ static void plugin_vcpu_cb__simple(CPUState *cpu, enum qemu_plugin_event ev)
}
}
/*
* Disable CFI checks.
* The callback function has been loaded from an external library so we do not
* have type information
*/
QEMU_DISABLE_CFI
static void plugin_vcpu_cb__discon(CPUState *cpu,
enum qemu_plugin_event ev,
enum qemu_plugin_discon_type type,
uint64_t from)
{
struct qemu_plugin_cb *cb, *next;
uint64_t to = cpu->cc->get_pc(cpu);
if (cpu->cpu_index < plugin.num_vcpus) {
/* iterate safely; plugins might uninstall themselves at any time */
QLIST_FOREACH_SAFE_RCU(cb, &plugin.cb_lists[ev], entry, next) {
qemu_plugin_vcpu_discon_cb_t func = cb->f.vcpu_discon;
func(cb->ctx->id, cpu->cpu_index, type, from, to);
}
}
}
/*
* Disable CFI checks.
* The callback function has been loaded from an external library so we do not
@@ -557,6 +581,24 @@ void qemu_plugin_vcpu_resume_cb(CPUState *cpu)
}
}
void qemu_plugin_vcpu_interrupt_cb(CPUState *cpu, uint64_t from)
{
plugin_vcpu_cb__discon(cpu, QEMU_PLUGIN_EV_VCPU_INTERRUPT,
QEMU_PLUGIN_DISCON_INTERRUPT, from);
}
void qemu_plugin_vcpu_exception_cb(CPUState *cpu, uint64_t from)
{
plugin_vcpu_cb__discon(cpu, QEMU_PLUGIN_EV_VCPU_EXCEPTION,
QEMU_PLUGIN_DISCON_EXCEPTION, from);
}
void qemu_plugin_vcpu_hostcall_cb(CPUState *cpu, uint64_t from)
{
plugin_vcpu_cb__discon(cpu, QEMU_PLUGIN_EV_VCPU_HOSTCALL,
QEMU_PLUGIN_DISCON_HOSTCALL, from);
}
void qemu_plugin_register_vcpu_idle_cb(qemu_plugin_id_t id,
qemu_plugin_vcpu_simple_cb_t cb)
{
@@ -569,6 +611,21 @@ void qemu_plugin_register_vcpu_resume_cb(qemu_plugin_id_t id,
plugin_register_cb(id, QEMU_PLUGIN_EV_VCPU_RESUME, cb);
}
void qemu_plugin_register_vcpu_discon_cb(qemu_plugin_id_t id,
enum qemu_plugin_discon_type type,
qemu_plugin_vcpu_discon_cb_t cb)
{
if (type & QEMU_PLUGIN_DISCON_INTERRUPT) {
plugin_register_cb(id, QEMU_PLUGIN_EV_VCPU_INTERRUPT, cb);
}
if (type & QEMU_PLUGIN_DISCON_EXCEPTION) {
plugin_register_cb(id, QEMU_PLUGIN_EV_VCPU_EXCEPTION, cb);
}
if (type & QEMU_PLUGIN_DISCON_HOSTCALL) {
plugin_register_cb(id, QEMU_PLUGIN_EV_VCPU_HOSTCALL, cb);
}
}
void qemu_plugin_register_flush_cb(qemu_plugin_id_t id,
qemu_plugin_simple_cb_t cb)
{
@@ -611,6 +668,7 @@ void exec_inline_op(enum plugin_dyn_cb_type type,
}
}
QEMU_DISABLE_CFI
void qemu_plugin_vcpu_mem_cb(CPUState *cpu, uint64_t vaddr,
uint64_t value_low,
uint64_t value_high,
+1
View File
@@ -318,6 +318,7 @@ struct qemu_plugin_reset_data {
bool reset;
};
QEMU_DISABLE_CFI
static void plugin_reset_destroy__locked(struct qemu_plugin_reset_data *data)
{
struct qemu_plugin_ctx *ctx = data->ctx;
@@ -19,32 +19,38 @@
- '((ansible_version.major == 2) and (ansible_version.minor >= 8)) or (ansible_version.major >= 3)'
msg: "Unsuitable ansible version, please use version 2.8.0 or later"
- name: Add armhf foreign architecture to aarch64 hosts
command: dpkg --add-architecture armhf
when:
- ansible_facts['distribution'] == 'Ubuntu'
- ansible_facts['architecture'] == 'aarch64'
- name: Update apt cache / upgrade packages via apt
apt:
update_cache: yes
upgrade: yes
when:
- ansible_facts['distribution'] == 'Ubuntu'
- ansible_facts['distribution'] in ['Ubuntu', 'Debian']
# the package lists are updated by "make lcitool-refresh"
- name: Include package lists based on OS and architecture
include_vars:
file: "ubuntu-2404-{{ ansible_facts['architecture'] }}.yaml"
- name: Define package list file path for Ubuntu
set_fact:
package_file: "ubuntu/ubuntu-2404-{{ ansible_facts['architecture'] }}.yaml"
when:
- ansible_facts['distribution'] == 'Ubuntu'
- ansible_facts['distribution_version'] == '24.04'
- name: Install packages for QEMU on Ubuntu 24.04
- name: Define package list file path for Debian
set_fact:
package_file: "debian/debian-{{ ansible_facts['distribution_major_version'] }}-{{ ansible_facts['architecture'] }}.yaml"
when:
- ansible_facts['distribution'] == 'Debian'
- name: Include package lists based on OS and architecture
include_vars:
file: "{{ package_file }}"
when:
- package_file is exists
- name: Install packages for QEMU on Ubuntu/Debian
package:
name: "{{ packages }}"
when:
- ansible_facts['distribution'] == 'Ubuntu'
- ansible_facts['distribution_version'] == '24.04'
- package_file is exists
- packages is defined
@@ -0,0 +1,134 @@
# THIS FILE WAS AUTO-GENERATED
#
# $ lcitool variables --host-arch ppc64le debian-13 qemu
#
# https://gitlab.com/libvirt/libvirt-ci
packages:
- bash
- bc
- bindgen
- bison
- bsdextrautils
- bzip2
- ca-certificates
- ccache
- clang
- dbus
- debianutils
- diffutils
- exuberant-ctags
- findutils
- flex
- gcc
- gcovr
- gettext
- git
- hostname
- libaio-dev
- libasan8
- libasound2-dev
- libattr1-dev
- libbpf-dev
- libbrlapi-dev
- libbz2-dev
- libc6-dev
- libcacard-dev
- libcap-ng-dev
- libcapstone-dev
- libcbor-dev
- libclang-rt-dev
- libcmocka-dev
- libcurl4-gnutls-dev
- libdaxctl-dev
- libdrm-dev
- libepoxy-dev
- libfdt-dev
- libffi-dev
- libfuse3-dev
- libgbm-dev
- libgcrypt20-dev
- libglib2.0-dev
- libglusterfs-dev
- libgnutls28-dev
- libgtk-3-dev
- libgtk-vnc-2.0-dev
- libibverbs-dev
- libiscsi-dev
- libjemalloc-dev
- libjpeg62-turbo-dev
- libjson-c-dev
- liblttng-ust-dev
- liblzo2-dev
- libncursesw5-dev
- libnfs-dev
- libnuma-dev
- libpam0g-dev
- libpcre2-dev
- libpipewire-0.3-dev
- libpixman-1-dev
- libpng-dev
- libpulse-dev
- librbd-dev
- librdmacm-dev
- libsasl2-dev
- libsdl2-dev
- libsdl2-image-dev
- libseccomp-dev
- libselinux1-dev
- libslirp-dev
- libsnappy-dev
- libsndio-dev
- libspice-protocol-dev
- libspice-server-dev
- libssh-dev
- libstd-rust-dev
- libsystemd-dev
- libtasn1-6-dev
- libubsan1
- libudev-dev
- liburing-dev
- libusb-1.0-0-dev
- libusbredirhost-dev
- libvdeplug-dev
- libvirglrenderer-dev
- libvte-2.91-dev
- libxdp-dev
- libzstd-dev
- llvm
- locales
- make
- mtools
- multipath-tools
- ncat
- nettle-dev
- ninja-build
- openssh-client
- pkgconf
- python3
- python3-numpy
- python3-opencv
- python3-pillow
- python3-pip
- python3-setuptools
- python3-sphinx
- python3-sphinx-rtd-theme
- python3-tomli
- python3-venv
- python3-wheel
- python3-yaml
- rpm2cpio
- rustc
- sed
- socat
- sparse
- swtpm
- systemtap-sdt-dev
- tar
- tesseract-ocr
- tesseract-ocr-eng
- vulkan-tools
- xorriso
- zlib1g-dev
- zstd
+3 -3
View File
@@ -56,12 +56,12 @@
url: "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh"
mode: 0755
when:
- ansible_facts['distribution'] == 'Ubuntu'
- ansible_facts['distribution'] in ['Ubuntu', 'Debian']
- name: Run gitlab-runner repo setup script (DEB)
shell: "/root/script.deb.sh"
when:
- ansible_facts['distribution'] == 'Ubuntu'
- ansible_facts['distribution'] in ['Ubuntu', 'Debian']
- name: Install gitlab-runner (DEB)
ansible.builtin.apt:
@@ -69,7 +69,7 @@
update_cache: yes
state: present
when:
- ansible_facts['distribution'] == 'Ubuntu'
- ansible_facts['distribution'] in ['Ubuntu', 'Debian']
# RPM setup
- name: Get gitlab-runner repo setup script (RPM)
@@ -26,7 +26,7 @@ packages:
- git
- hostname
- libaio-dev
- libasan6
- libasan8
- libasound2-dev
- libattr1-dev
- libbpf-dev
@@ -37,7 +37,7 @@ packages:
- libcap-ng-dev
- libcapstone-dev
- libcbor-dev
- libclang-dev
- libclang-rt-dev
- libcmocka-dev
- libcurl4-gnutls-dev
- libdaxctl-dev
@@ -26,7 +26,7 @@ packages:
- git
- hostname
- libaio-dev
- libasan6
- libasan8
- libasound2-dev
- libattr1-dev
- libbpf-dev
@@ -37,7 +37,7 @@ packages:
- libcap-ng-dev
- libcapstone-dev
- libcbor-dev
- libclang-dev
- libclang-rt-dev
- libcmocka-dev
- libcurl4-gnutls-dev
- libdaxctl-dev
+1 -4
View File
@@ -316,10 +316,7 @@ common_semi_flen_fstat_cb(CPUState *cs, uint64_t ret, int err)
&size, 8, 0)) {
ret = -1, err = EFAULT;
} else {
size = be64_to_cpu(size);
if (ret != size) {
ret = -1, err = EOVERFLOW;
}
ret = be64_to_cpu(size);
}
}
common_semi_cb(cs, ret, err);
+13
View File
@@ -27,6 +27,7 @@
#include "exec/helper-proto.h"
#include "qemu/qemu-print.h"
#include "system/memory.h"
#include "qemu/plugin.h"
#define CONVERT_BIT(X, SRC, DST) \
@@ -328,6 +329,7 @@ void alpha_cpu_do_interrupt(CPUState *cs)
{
CPUAlphaState *env = cpu_env(cs);
int i = cs->exception_index;
uint64_t last_pc = env->pc;
if (qemu_loglevel_mask(CPU_LOG_INT)) {
static int count;
@@ -431,6 +433,17 @@ void alpha_cpu_do_interrupt(CPUState *cs)
/* Switch to PALmode. */
env->flags |= ENV_FLAG_PAL_MODE;
switch (i) {
case EXCP_SMP_INTERRUPT:
case EXCP_CLK_INTERRUPT:
case EXCP_DEV_INTERRUPT:
qemu_plugin_vcpu_interrupt_cb(cs, last_pc);
break;
default:
qemu_plugin_vcpu_exception_cb(cs, last_pc);
break;
}
}
bool alpha_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
+24
View File
@@ -34,6 +34,7 @@
#endif
#include "cpregs.h"
#include "target/arm/gtimer.h"
#include "qemu/plugin.h"
#define HELPER_H "tcg/helper.h"
#include "exec/helper-proto.h.inc"
@@ -8783,6 +8784,24 @@ static void take_aarch32_exception(CPUARMState *env, int new_mode,
}
}
void arm_do_plugin_vcpu_discon_cb(CPUState *cs, uint64_t from)
{
switch (cs->exception_index) {
case EXCP_IRQ:
case EXCP_VIRQ:
case EXCP_NMI:
case EXCP_VINMI:
case EXCP_FIQ:
case EXCP_VFIQ:
case EXCP_VFNMI:
case EXCP_VSERR:
qemu_plugin_vcpu_interrupt_cb(cs, from);
break;
default:
qemu_plugin_vcpu_exception_cb(cs, from);
}
}
static void arm_cpu_do_interrupt_aarch32_hyp(CPUState *cs)
{
/*
@@ -9473,6 +9492,7 @@ void arm_cpu_do_interrupt(CPUState *cs)
ARMCPU *cpu = ARM_CPU(cs);
CPUARMState *env = &cpu->env;
unsigned int new_el = env->exception.target_el;
uint64_t last_pc = cs->cc->get_pc(cs);
assert(!arm_feature(env, ARM_FEATURE_M));
@@ -9489,6 +9509,7 @@ void arm_cpu_do_interrupt(CPUState *cs)
if (tcg_enabled() && arm_is_psci_call(cpu, cs->exception_index)) {
arm_handle_psci_call(cpu);
qemu_log_mask(CPU_LOG_INT, "...handled as PSCI call\n");
qemu_plugin_vcpu_hostcall_cb(cs, last_pc);
return;
}
@@ -9500,6 +9521,7 @@ void arm_cpu_do_interrupt(CPUState *cs)
#ifdef CONFIG_TCG
if (cs->exception_index == EXCP_SEMIHOST) {
tcg_handle_semihosting(cs);
qemu_plugin_vcpu_hostcall_cb(cs, last_pc);
return;
}
#endif
@@ -9525,6 +9547,8 @@ void arm_cpu_do_interrupt(CPUState *cs)
if (!kvm_enabled()) {
cpu_set_interrupt(cs, CPU_INTERRUPT_EXITTB);
}
arm_do_plugin_vcpu_discon_cb(cs, last_pc);
}
#endif /* !CONFIG_USER_ONLY */

Some files were not shown because too many files have changed in this diff Show More