[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v5 15/22] instrument: Add event 'guest_cpu_exit'
From: |
Lluís Vilanova |
Subject: |
[Qemu-devel] [PATCH v5 15/22] instrument: Add event 'guest_cpu_exit' |
Date: |
Wed, 13 Sep 2017 01:02:16 +0300 |
User-agent: |
StGit/0.18 |
Signed-off-by: Lluís Vilanova <address@hidden>
---
instrument/control.c | 9 +++++++++
instrument/events.h | 3 +++
instrument/events.inc.h | 11 +++++++++++
instrument/load.c | 17 +++++++++++++++++
instrument/qemu-instr/control.h | 11 +++++++++++
stubs/instrument.c | 1 +
trace/control.c | 4 +++-
7 files changed, 55 insertions(+), 1 deletion(-)
diff --git a/instrument/control.c b/instrument/control.c
index 20ddffdc28..0be8065409 100644
--- a/instrument/control.c
+++ b/instrument/control.c
@@ -124,3 +124,12 @@ SYM_PUBLIC void qi_event_set_guest_cpu_enter(void
(*fn)(QICPU vcpu))
ERROR_IF(!instr_get_state(), "called outside instrumentation");
instr_set_event(guest_cpu_enter, fn);
}
+
+
+void (*instr_event__guest_cpu_exit)(QICPU vcpu);
+
+SYM_PUBLIC void qi_event_set_guest_cpu_exit(void (*fn)(QICPU vcpu))
+{
+ ERROR_IF(!instr_get_state(), "called outside instrumentation");
+ instr_set_event(guest_cpu_exit, fn);
+}
diff --git a/instrument/events.h b/instrument/events.h
index 947f120aa9..c743cb8180 100644
--- a/instrument/events.h
+++ b/instrument/events.h
@@ -36,6 +36,9 @@ extern void *instr_event__fini_data;
extern void (*instr_event__guest_cpu_enter)(QICPU vcpu);
static inline void instr_guest_cpu_enter(CPUState *vcpu);
+extern void (*instr_event__guest_cpu_exit)(QICPU vcpu);
+static inline void instr_guest_cpu_exit(CPUState *vcpu);
+
#include "instrument/events.inc.h"
diff --git a/instrument/events.inc.h b/instrument/events.inc.h
index e3f8024716..c88df7e42f 100644
--- a/instrument/events.inc.h
+++ b/instrument/events.inc.h
@@ -20,3 +20,14 @@ static inline void instr_guest_cpu_enter(CPUState *vcpu)
instr_set_state(INSTR_STATE_DISABLE);
}
}
+
+static inline void instr_guest_cpu_exit(CPUState *vcpu)
+{
+ void (*cb)(QICPU vcpu) = instr_get_event(guest_cpu_exit);
+ if (cb) {
+ QICPU vcpu_ = instr_cpu_to_qicpu(vcpu);
+ instr_set_state(INSTR_STATE_ENABLE);
+ (*cb)(vcpu_);
+ instr_set_state(INSTR_STATE_DISABLE);
+ }
+}
diff --git a/instrument/load.c b/instrument/load.c
index 218bca74b2..6808d361b5 100644
--- a/instrument/load.c
+++ b/instrument/load.c
@@ -11,7 +11,9 @@
#include "qemu-common.h"
#include <dlfcn.h>
+#include "cpu.h"
#include "exec/cpu-common.h"
+#include "exec/exec-all.h"
#include "instrument/control.h"
#include "instrument/events.h"
#include "instrument/load.h"
@@ -127,6 +129,13 @@ out:
return res;
}
+
+static void instr_unload__cb(CPUState *cpu, void *data)
+{
+ tb_flush_sync(cpu);
+ instr_guest_cpu_exit(cpu);
+}
+
InstrUnloadError instr_unload(const char *id)
{
InstrUnloadError res;
@@ -139,6 +148,10 @@ InstrUnloadError instr_unload(const char *id)
goto out;
}
+ InstrCPUStop info;
+ cpu_list_lock();
+ instr_cpu_stop_all_begin(&info, instr_unload__cb, NULL);
+
qi_fini_fn fini_fn = instr_get_event(fini_fn);
if (fini_fn) {
void *fini_data = instr_get_event(fini_data);
@@ -147,6 +160,10 @@ InstrUnloadError instr_unload(const char *id)
instr_set_event(fini_fn, NULL);
instr_set_event(guest_cpu_enter, NULL);
+ instr_set_event(guest_cpu_exit, NULL);
+
+ instr_cpu_stop_all_end(&info);
+ cpu_list_unlock();
/* this should never fail */
if (dlclose(handle->dlhandle) < 0) {
diff --git a/instrument/qemu-instr/control.h b/instrument/qemu-instr/control.h
index f61e7a2b6e..107ee8afe0 100644
--- a/instrument/qemu-instr/control.h
+++ b/instrument/qemu-instr/control.h
@@ -85,6 +85,17 @@ void qi_set_fini(qi_fini_fn fn, void *data);
*/
void qi_event_set_guest_cpu_enter(void (*fn)(QICPU vcpu));
+/*
+ * Hot-unplug a virtual (guest) CPU.
+ *
+ * Also triggered on each CPU when an instrumentation library is unloaded.
+ *
+ * Mode: user, softmmu
+ * Targets: all
+ * Time: exec
+ */
+void qi_event_set_guest_cpu_exit(void (*fn)(QICPU vcpu));
+
#ifdef __cplusplus
}
#endif
diff --git a/stubs/instrument.c b/stubs/instrument.c
index 6b59ba9a7a..c4b1c791d9 100644
--- a/stubs/instrument.c
+++ b/stubs/instrument.c
@@ -47,3 +47,4 @@ void qmp_instr_unload(const char *id, Error **errp)
__thread InstrState instr_cur_state;
void (*instr_event__guest_cpu_enter)(QICPU *vcpu);
+void (*instr_event__guest_cpu_exit)(QICPU *vcpu);
diff --git a/trace/control.c b/trace/control.c
index 82d8989c4d..946a0af818 100644
--- a/trace/control.c
+++ b/trace/control.c
@@ -1,13 +1,14 @@
/*
* Interface for configuring and controlling the state of tracing events.
*
- * Copyright (C) 2011-2016 Lluís Vilanova <address@hidden>
+ * Copyright (C) 2011-2017 Lluís Vilanova <address@hidden>
*
* This work is licensed under the terms of the GNU GPL, version 2 or later.
* See the COPYING file in the top-level directory.
*/
#include "qemu/osdep.h"
+#include "instrument/events.h"
#include "trace/control.h"
#include "qemu/help_option.h"
#ifdef CONFIG_TRACE_SIMPLE
@@ -272,6 +273,7 @@ void trace_fini_vcpu(CPUState *vcpu)
TraceEventIter iter;
TraceEvent *ev;
+ instr_guest_cpu_exit(vcpu);
trace_guest_cpu_exit(vcpu);
trace_event_iter_init(&iter, NULL);
- [Qemu-devel] [PATCH v5 05/22] instrument: [bsd-user] Add command line library loader, (continued)
- [Qemu-devel] [PATCH v5 05/22] instrument: [bsd-user] Add command line library loader, Lluís Vilanova, 2017/09/12
- [Qemu-devel] [PATCH v5 06/22] instrument: [softmmu] Add command line library loader, Lluís Vilanova, 2017/09/12
- [Qemu-devel] [PATCH v5 07/22] instrument: [qapi] Add library loader, Lluís Vilanova, 2017/09/12
- [Qemu-devel] [PATCH v5 08/22] instrument: [hmp] Add library loader, Lluís Vilanova, 2017/09/12
- [Qemu-devel] [PATCH v5 09/22] instrument: Add basic control interface, Lluís Vilanova, 2017/09/12
- [Qemu-devel] [PATCH v5 10/22] instrument: Add support for tracing events, Lluís Vilanova, 2017/09/12
- [Qemu-devel] [PATCH v5 11/22] instrument: Track vCPUs, Lluís Vilanova, 2017/09/12
- [Qemu-devel] [PATCH v5 12/22] instrument: Add event 'guest_cpu_enter', Lluís Vilanova, 2017/09/12
- [Qemu-devel] [PATCH v5 13/22] instrument: Support synchronous modification of vCPU state, Lluís Vilanova, 2017/09/12
- [Qemu-devel] [PATCH v5 14/22] exec: Add function to synchronously flush TB on a stopped vCPU, Lluís Vilanova, 2017/09/12
- [Qemu-devel] [PATCH v5 15/22] instrument: Add event 'guest_cpu_exit',
Lluís Vilanova <=
- [Qemu-devel] [PATCH v5 16/22] instrument: Add event 'guest_cpu_reset', Lluís Vilanova, 2017/09/12
- [Qemu-devel] [PATCH v5 17/22] trace: Introduce a proper structure to describe memory accesses, Lluís Vilanova, 2017/09/12
- [Qemu-devel] [PATCH v5 18/22] instrument: Add event 'guest_mem_before_trans', Lluís Vilanova, 2017/09/12
- [Qemu-devel] [PATCH v5 19/22] instrument: Add event 'guest_mem_before_exec', Lluís Vilanova, 2017/09/12
- [Qemu-devel] [PATCH v5 20/22] instrument: Add event 'guest_user_syscall', Lluís Vilanova, 2017/09/12
- [Qemu-devel] [PATCH v5 21/22] instrument: Add event 'guest_user_syscall_ret', Lluís Vilanova, 2017/09/12
- [Qemu-devel] [PATCH v5 22/22] instrument: Add API to manipulate guest memory, Lluís Vilanova, 2017/09/12
- Re: [Qemu-devel] [PATCH v5 00/22] instrument: Add basic event instrumentation, no-reply, 2017/09/12
- Re: [Qemu-devel] [PATCH v5 00/22] instrument: Add basic event instrumentation, no-reply, 2017/09/12