mirror of
https://github.com/qemu/qemu.git
synced 2024-12-12 05:03:42 +08:00
-----BEGIN PGP SIGNATURE-----
iQEcBAABAgAGBQJX7DaFAAoJEJykq7OBq3PIdcYIAKpvDtiEcYy2pTtSOnO52gLQ VskTdh+aqvR7gkdb6SIfvDfL/wbquVNml9NtMhOC8YcT220Xepq28Yj2nDSLPvMi 54Ing4/cGP67cTN5tTGLzUd52KYrf7HJd9npFOehE3b1yhteCJentPjRy47bfWa1 voKx3sISBzmXBDxArW5eZcyEs5sWNriYOapHMXQB0eYkBTS6Q6qgBFYTKzb7CMXd GhtUIflDxxFwzUnYvH5tv+HLfq7O7TPXNjb+gQty8xzmhT+lJhiRr9dpTSRa6atu zRIcGUWbuTjkdZWcjWSTOTfxxZ2CvYlOnHC34H7FbtERBOPwjJ1vh+q1wvB9Mhw= =Q8Nu -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/stefanha/tags/tracing-pull-request' into staging # gpg: Signature made Wed 28 Sep 2016 22:30:45 BST # gpg: using RSA key 0x9CA4ABB381AB73C8 # gpg: Good signature from "Stefan Hajnoczi <stefanha@redhat.com>" # gpg: aka "Stefan Hajnoczi <stefanha@gmail.com>" # Primary key fingerprint: 8695 A8BF D3F9 7CDA AC35 775A 9CA4 ABB3 81AB 73C8 * remotes/stefanha/tags/tracing-pull-request: trace: Document the execution mode of guest events trace: Add event "guest_cpu_reset" trace: Add event "guest_cpu_enter" trace: Properly initialize dynamic event states in hot-plugged vCPUs trace: move hw/virtio/virtio-balloon.c trace points into correct file trace: move hw/mem/pc-dimm.c trace points into correct file trace: move util/qemu-coroutine*.c trace points into correct file trace: move util/buffer.c trace points into correct file Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
cc9a366d3b
@ -142,6 +142,7 @@ trace-events-y += hw/dma/trace-events
|
||||
trace-events-y += hw/sparc/trace-events
|
||||
trace-events-y += hw/sd/trace-events
|
||||
trace-events-y += hw/isa/trace-events
|
||||
trace-events-y += hw/mem/trace-events
|
||||
trace-events-y += hw/i386/trace-events
|
||||
trace-events-y += hw/9pfs/trace-events
|
||||
trace-events-y += hw/ppc/trace-events
|
||||
|
@ -1116,7 +1116,6 @@ int main(int argc, char **argv)
|
||||
gdbserver_start (gdbstub_port);
|
||||
gdb_handlesig(cpu, 0);
|
||||
}
|
||||
trace_init_vcpu_events();
|
||||
cpu_loop(env);
|
||||
/* never exits */
|
||||
return 0;
|
||||
|
@ -7,10 +7,6 @@ xen_platform_log(char *s) "xen platform: %s"
|
||||
xen_pv_mmio_read(uint64_t addr) "WARNING: read from Xen PV Device MMIO space (address %"PRIx64")"
|
||||
xen_pv_mmio_write(uint64_t addr) "WARNING: write to Xen PV Device MMIO space (address %"PRIx64")"
|
||||
|
||||
# hw/i386/pc.c
|
||||
mhp_pc_dimm_assigned_slot(int slot) "%d"
|
||||
mhp_pc_dimm_assigned_address(uint64_t addr) "0x%"PRIx64
|
||||
|
||||
# hw/i386/x86-iommu.c
|
||||
x86_iommu_iec_notify(bool global, uint32_t index, uint32_t mask) "Notify IEC invalidation: global=%d index=%" PRIu32 " mask=%" PRIu32
|
||||
|
||||
|
5
hw/mem/trace-events
Normal file
5
hw/mem/trace-events
Normal file
@ -0,0 +1,5 @@
|
||||
# See docs/trace-events.txt for syntax documentation.
|
||||
|
||||
# hw/mem/pc-dimm.c
|
||||
mhp_pc_dimm_assigned_slot(int slot) "%d"
|
||||
mhp_pc_dimm_assigned_address(uint64_t addr) "0x%"PRIx64
|
@ -14,3 +14,8 @@ virtio_rng_guest_not_ready(void *rng) "rng %p: guest not ready"
|
||||
virtio_rng_pushed(void *rng, size_t len) "rng %p: %zd bytes pushed"
|
||||
virtio_rng_request(void *rng, size_t size, unsigned quota) "rng %p: %zd bytes requested, %u bytes quota left"
|
||||
|
||||
# hw/virtio/virtio-balloon.c
|
||||
virtio_balloon_handle_output(const char *name, uint64_t gpa) "section name: %s gpa: %"PRIx64
|
||||
virtio_balloon_get_config(uint32_t num_pages, uint32_t actual) "num_pages: %d actual: %d"
|
||||
virtio_balloon_set_config(uint32_t actual, uint32_t oldactual) "actual: %d oldactual: %d"
|
||||
virtio_balloon_to_target(uint64_t target, uint32_t num_pages) "balloon target: %"PRIx64" num_pages: %d"
|
||||
|
@ -1,11 +1,5 @@
|
||||
# See docs/tracing.txt for syntax documentation.
|
||||
|
||||
# io/buffer.c
|
||||
buffer_resize(const char *buf, size_t olen, size_t len) "%s: old %zd, new %zd"
|
||||
buffer_move_empty(const char *buf, size_t len, const char *from) "%s: %zd bytes from %s"
|
||||
buffer_move(const char *buf, size_t len, const char *from) "%s: %zd bytes from %s"
|
||||
buffer_free(const char *buf, size_t len) "%s: capacity %zd"
|
||||
|
||||
# io/task.c
|
||||
qio_task_new(void *task, void *source, void *func, void *opaque) "Task new task=%p source=%p func=%p opaque=%p"
|
||||
qio_task_complete(void *task) "Task complete task=%p"
|
||||
|
@ -4748,7 +4748,6 @@ int main(int argc, char **argv, char **envp)
|
||||
}
|
||||
gdb_handlesig(cpu, 0);
|
||||
}
|
||||
trace_init_vcpu_events();
|
||||
cpu_loop(env);
|
||||
/* never exits */
|
||||
return 0;
|
||||
|
@ -29,6 +29,7 @@
|
||||
#include "qemu/error-report.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "trace.h"
|
||||
|
||||
bool cpu_exists(int64_t id)
|
||||
{
|
||||
@ -245,6 +246,8 @@ void cpu_reset(CPUState *cpu)
|
||||
if (klass->reset != NULL) {
|
||||
(*klass->reset)(cpu);
|
||||
}
|
||||
|
||||
trace_guest_cpu_reset(cpu);
|
||||
}
|
||||
|
||||
static void cpu_common_reset(CPUState *cpu)
|
||||
@ -333,6 +336,9 @@ static void cpu_common_realizefn(DeviceState *dev, Error **errp)
|
||||
cpu_synchronize_post_init(cpu);
|
||||
cpu_resume(cpu);
|
||||
}
|
||||
|
||||
/* NOTE: latest generic point where the cpu is fully realized */
|
||||
trace_init_vcpu(cpu);
|
||||
}
|
||||
|
||||
static void cpu_common_initfn(Object *obj)
|
||||
|
@ -44,3 +44,9 @@ void trace_event_set_vcpu_state_dynamic(CPUState *vcpu,
|
||||
/* should never be called on non-target binaries */
|
||||
abort();
|
||||
}
|
||||
|
||||
void trace_init_vcpu(CPUState *vcpu)
|
||||
{
|
||||
/* should never be called on non-target binaries */
|
||||
abort();
|
||||
}
|
||||
|
33
trace-events
33
trace-events
@ -37,10 +37,6 @@ cpu_out(unsigned int addr, char size, unsigned int val) "addr %#x(%c) value %u"
|
||||
# balloon.c
|
||||
# Since requests are raised via monitor, not many tracepoints are needed.
|
||||
balloon_event(void *opaque, unsigned long addr) "opaque %p addr %lu"
|
||||
virtio_balloon_handle_output(const char *name, uint64_t gpa) "section name: %s gpa: %"PRIx64
|
||||
virtio_balloon_get_config(uint32_t num_pages, uint32_t actual) "num_pages: %d actual: %d"
|
||||
virtio_balloon_set_config(uint32_t actual, uint32_t oldactual) "actual: %d oldactual: %d"
|
||||
virtio_balloon_to_target(uint64_t target, uint32_t num_pages) "balloon target: %"PRIx64" num_pages: %d"
|
||||
|
||||
# vl.c
|
||||
vm_state_notify(int running, int reason) "running %d reason %d"
|
||||
@ -83,19 +79,6 @@ xen_map_cache(uint64_t phys_addr) "want %#"PRIx64
|
||||
xen_remap_bucket(uint64_t index) "index %#"PRIx64
|
||||
xen_map_cache_return(void* ptr) "%p"
|
||||
|
||||
# qemu-coroutine.c
|
||||
qemu_coroutine_enter(void *from, void *to, void *opaque) "from %p to %p opaque %p"
|
||||
qemu_coroutine_yield(void *from, void *to) "from %p to %p"
|
||||
qemu_coroutine_terminate(void *co) "self %p"
|
||||
|
||||
# qemu-coroutine-lock.c
|
||||
qemu_co_queue_run_restart(void *co) "co %p"
|
||||
qemu_co_queue_next(void *nxt) "next %p"
|
||||
qemu_co_mutex_lock_entry(void *mutex, void *self) "mutex %p self %p"
|
||||
qemu_co_mutex_lock_return(void *mutex, void *self) "mutex %p self %p"
|
||||
qemu_co_mutex_unlock_entry(void *mutex, void *self) "mutex %p self %p"
|
||||
qemu_co_mutex_unlock_return(void *mutex, void *self) "mutex %p self %p"
|
||||
|
||||
# monitor.c
|
||||
handle_qmp_command(void *mon, const char *cmd_name) "mon %p cmd_name \"%s\""
|
||||
monitor_protocol_event_handler(uint32_t event, void *qdict) "event=%d data=%p"
|
||||
@ -157,6 +140,19 @@ colo_filter_rewriter_conn_offset(uint32_t offset) ": offset=%u\n"
|
||||
|
||||
### Guest events, keep at bottom
|
||||
|
||||
|
||||
## vCPU
|
||||
|
||||
# Hot-plug a new virtual (guest) CPU
|
||||
#
|
||||
# Targets: all
|
||||
vcpu guest_cpu_enter(void)
|
||||
|
||||
# Reset the state of a virtual (guest) CPU
|
||||
#
|
||||
# Targets: all
|
||||
vcpu guest_cpu_reset(void)
|
||||
|
||||
# @vaddr: Access' virtual address.
|
||||
# @info : Access' information (see below).
|
||||
#
|
||||
@ -173,6 +169,7 @@ colo_filter_rewriter_conn_offset(uint32_t offset) ": offset=%u\n"
|
||||
# bool store : 1; /* wheter it's a store operation */
|
||||
# };
|
||||
#
|
||||
# Mode: user, softmmu
|
||||
# Targets: TCG(all)
|
||||
disable vcpu tcg guest_mem_before(TCGv vaddr, uint8_t info) "info=%d", "vaddr=0x%016"PRIx64" info=%d"
|
||||
|
||||
@ -181,6 +178,7 @@ disable vcpu tcg guest_mem_before(TCGv vaddr, uint8_t info) "info=%d", "vaddr=0x
|
||||
#
|
||||
# Start executing a guest system call in syscall emulation mode.
|
||||
#
|
||||
# Mode: user
|
||||
# Targets: TCG(all)
|
||||
disable vcpu guest_user_syscall(uint64_t num, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5, uint64_t arg6, uint64_t arg7, uint64_t arg8) "num=0x%016"PRIx64" arg1=0x%016"PRIx64" arg2=0x%016"PRIx64" arg3=0x%016"PRIx64" arg4=0x%016"PRIx64" arg5=0x%016"PRIx64" arg6=0x%016"PRIx64" arg7=0x%016"PRIx64" arg8=0x%016"PRIx64
|
||||
|
||||
@ -189,5 +187,6 @@ disable vcpu guest_user_syscall(uint64_t num, uint64_t arg1, uint64_t arg2, uint
|
||||
#
|
||||
# Finish executing a guest system call in syscall emulation mode.
|
||||
#
|
||||
# Mode: user
|
||||
# Targets: TCG(all)
|
||||
disable vcpu guest_user_syscall_ret(uint64_t num, uint64_t ret) "num=0x%016"PRIx64" ret=0x%016"PRIx64
|
||||
|
@ -9,6 +9,7 @@
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "cpu.h"
|
||||
#include "trace.h"
|
||||
#include "trace/control.h"
|
||||
#include "translate-all.h"
|
||||
|
||||
@ -81,3 +82,42 @@ void trace_event_set_vcpu_state_dynamic(CPUState *vcpu,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static bool adding_first_cpu(void)
|
||||
{
|
||||
CPUState *cpu;
|
||||
size_t count = 0;
|
||||
CPU_FOREACH(cpu) {
|
||||
count++;
|
||||
if (count > 1) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void trace_init_vcpu(CPUState *vcpu)
|
||||
{
|
||||
TraceEvent *ev = NULL;
|
||||
|
||||
while ((ev = trace_event_pattern("*", ev)) != NULL) {
|
||||
if (trace_event_is_vcpu(ev) &&
|
||||
trace_event_get_state_static(ev) &&
|
||||
trace_event_get_state_dynamic(ev)) {
|
||||
TraceEventID id = trace_event_get_id(ev);
|
||||
if (adding_first_cpu()) {
|
||||
/* check preconditions */
|
||||
assert(trace_events_dstate[id] == 1);
|
||||
/* disable early-init state ... */
|
||||
trace_events_dstate[id] = 0;
|
||||
trace_events_enabled_count--;
|
||||
/* ... and properly re-enable */
|
||||
trace_event_set_vcpu_state_dynamic(vcpu, ev, true);
|
||||
} else {
|
||||
trace_event_set_vcpu_state_dynamic(vcpu, ev, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
trace_guest_cpu_enter(vcpu);
|
||||
}
|
||||
|
@ -269,22 +269,3 @@ char *trace_opt_parse(const char *optarg)
|
||||
|
||||
return trace_file;
|
||||
}
|
||||
|
||||
void trace_init_vcpu_events(void)
|
||||
{
|
||||
TraceEvent *ev = NULL;
|
||||
while ((ev = trace_event_pattern("*", ev)) != NULL) {
|
||||
if (trace_event_is_vcpu(ev) &&
|
||||
trace_event_get_state_static(ev) &&
|
||||
trace_event_get_state_dynamic(ev)) {
|
||||
TraceEventID id = trace_event_get_id(ev);
|
||||
/* check preconditions */
|
||||
assert(trace_events_dstate[id] == 1);
|
||||
/* disable early-init state ... */
|
||||
trace_events_dstate[id] = 0;
|
||||
trace_events_enabled_count--;
|
||||
/* ... and properly re-enable */
|
||||
trace_event_set_state_dynamic(ev, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -238,6 +238,14 @@ bool trace_init_backends(void);
|
||||
*/
|
||||
void trace_init_file(const char *file);
|
||||
|
||||
/**
|
||||
* trace_init_vcpu:
|
||||
* @vcpu: Added vCPU.
|
||||
*
|
||||
* Set initial dynamic event state for a hot-plugged vCPU.
|
||||
*/
|
||||
void trace_init_vcpu(CPUState *vcpu);
|
||||
|
||||
/**
|
||||
* trace_list_events:
|
||||
*
|
||||
@ -269,17 +277,6 @@ extern QemuOptsList qemu_trace_opts;
|
||||
*/
|
||||
char *trace_opt_parse(const char *optarg);
|
||||
|
||||
/**
|
||||
* trace_init_vcpu_events:
|
||||
*
|
||||
* Re-synchronize initial event state with vCPUs (which can be created after
|
||||
* trace_init_events()).
|
||||
*
|
||||
* Precondition: event states won't be changed between trace_enable_events() and
|
||||
* trace_init_vcpu_events() (e.g., through QMP).
|
||||
*/
|
||||
void trace_init_vcpu_events(void);
|
||||
|
||||
|
||||
#include "trace/control-internal.h"
|
||||
|
||||
|
@ -1,5 +1,24 @@
|
||||
# See docs/tracing.txt for syntax documentation.
|
||||
|
||||
# util/buffer.c
|
||||
buffer_resize(const char *buf, size_t olen, size_t len) "%s: old %zd, new %zd"
|
||||
buffer_move_empty(const char *buf, size_t len, const char *from) "%s: %zd bytes from %s"
|
||||
buffer_move(const char *buf, size_t len, const char *from) "%s: %zd bytes from %s"
|
||||
buffer_free(const char *buf, size_t len) "%s: capacity %zd"
|
||||
|
||||
# util/qemu-coroutine.c
|
||||
qemu_coroutine_enter(void *from, void *to, void *opaque) "from %p to %p opaque %p"
|
||||
qemu_coroutine_yield(void *from, void *to) "from %p to %p"
|
||||
qemu_coroutine_terminate(void *co) "self %p"
|
||||
|
||||
# util/qemu-coroutine-lock.c
|
||||
qemu_co_queue_run_restart(void *co) "co %p"
|
||||
qemu_co_queue_next(void *nxt) "next %p"
|
||||
qemu_co_mutex_lock_entry(void *mutex, void *self) "mutex %p self %p"
|
||||
qemu_co_mutex_lock_return(void *mutex, void *self) "mutex %p self %p"
|
||||
qemu_co_mutex_unlock_entry(void *mutex, void *self) "mutex %p self %p"
|
||||
qemu_co_mutex_unlock_return(void *mutex, void *self) "mutex %p self %p"
|
||||
|
||||
# util/oslib-win32.c
|
||||
# util/oslib-posix.c
|
||||
qemu_memalign(size_t alignment, size_t size, void *ptr) "alignment %zu size %zu ptr %p"
|
||||
|
Loading…
Reference in New Issue
Block a user