plugins: define qemu_plugin_u64
Additionally to the scoreboard, we define a qemu_plugin_u64, which is a simple struct holding a pointer to a scoreboard, and a given offset. This allows to have a scoreboard containing structs, without having to bring offset to operate on a specific field. Since most of the plugins are simply collecting a sum of per-cpu values, qemu_plugin_u64 directly support this operation as well. All inline operations defined later will use a qemu_plugin_u64 as input. New functions: - qemu_plugin_u64_add - qemu_plugin_u64_get - qemu_plugin_u64_set - qemu_plugin_u64_sum New macros: - qemu_plugin_scoreboard_u64 - qemu_plugin_scoreboard_u64_in_struct Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org> Message-Id: <20240304130036.124418-3-pierrick.bouvier@linaro.org> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20240305121005.3528075-16-alex.bennee@linaro.org>
This commit is contained in:
parent
a3c2cf0b89
commit
8042e2eadf
@ -225,6 +225,17 @@ struct qemu_plugin_insn;
|
||||
/** struct qemu_plugin_scoreboard - Opaque handle for a scoreboard */
|
||||
struct qemu_plugin_scoreboard;
|
||||
|
||||
/**
|
||||
* typedef qemu_plugin_u64 - uint64_t member of an entry in a scoreboard
|
||||
*
|
||||
* This field allows to access a specific uint64_t member in one given entry,
|
||||
* located at a specified offset. Inline operations expect this as entry.
|
||||
*/
|
||||
typedef struct {
|
||||
struct qemu_plugin_scoreboard *score;
|
||||
size_t offset;
|
||||
} qemu_plugin_u64;
|
||||
|
||||
/**
|
||||
* enum qemu_plugin_cb_flags - type of callback
|
||||
*
|
||||
@ -784,4 +795,45 @@ QEMU_PLUGIN_API
|
||||
void *qemu_plugin_scoreboard_find(struct qemu_plugin_scoreboard *score,
|
||||
unsigned int vcpu_index);
|
||||
|
||||
/* Macros to define a qemu_plugin_u64 */
|
||||
#define qemu_plugin_scoreboard_u64(score) \
|
||||
(qemu_plugin_u64) {score, 0}
|
||||
#define qemu_plugin_scoreboard_u64_in_struct(score, type, member) \
|
||||
(qemu_plugin_u64) {score, offsetof(type, member)}
|
||||
|
||||
/**
|
||||
* qemu_plugin_u64_add() - add a value to a qemu_plugin_u64 for a given vcpu
|
||||
* @entry: entry to query
|
||||
* @vcpu_index: entry index
|
||||
* @added: value to add
|
||||
*/
|
||||
QEMU_PLUGIN_API
|
||||
void qemu_plugin_u64_add(qemu_plugin_u64 entry, unsigned int vcpu_index,
|
||||
uint64_t added);
|
||||
|
||||
/**
|
||||
* qemu_plugin_u64_get() - get value of a qemu_plugin_u64 for a given vcpu
|
||||
* @entry: entry to query
|
||||
* @vcpu_index: entry index
|
||||
*/
|
||||
QEMU_PLUGIN_API
|
||||
uint64_t qemu_plugin_u64_get(qemu_plugin_u64 entry, unsigned int vcpu_index);
|
||||
|
||||
/**
|
||||
* qemu_plugin_u64_set() - set value of a qemu_plugin_u64 for a given vcpu
|
||||
* @entry: entry to query
|
||||
* @vcpu_index: entry index
|
||||
* @val: new value
|
||||
*/
|
||||
QEMU_PLUGIN_API
|
||||
void qemu_plugin_u64_set(qemu_plugin_u64 entry, unsigned int vcpu_index,
|
||||
uint64_t val);
|
||||
|
||||
/**
|
||||
* qemu_plugin_u64_sum() - return sum of all vcpu entries in a scoreboard
|
||||
* @entry: entry to sum
|
||||
*/
|
||||
QEMU_PLUGIN_API
|
||||
uint64_t qemu_plugin_u64_sum(qemu_plugin_u64 entry);
|
||||
|
||||
#endif /* QEMU_QEMU_PLUGIN_H */
|
||||
|
@ -484,3 +484,37 @@ void *qemu_plugin_scoreboard_find(struct qemu_plugin_scoreboard *score,
|
||||
char *base_ptr = score->data->data;
|
||||
return base_ptr + vcpu_index * g_array_get_element_size(score->data);
|
||||
}
|
||||
|
||||
static uint64_t *plugin_u64_address(qemu_plugin_u64 entry,
|
||||
unsigned int vcpu_index)
|
||||
{
|
||||
char *ptr = qemu_plugin_scoreboard_find(entry.score, vcpu_index);
|
||||
return (uint64_t *)(ptr + entry.offset);
|
||||
}
|
||||
|
||||
void qemu_plugin_u64_add(qemu_plugin_u64 entry, unsigned int vcpu_index,
|
||||
uint64_t added)
|
||||
{
|
||||
*plugin_u64_address(entry, vcpu_index) += added;
|
||||
}
|
||||
|
||||
uint64_t qemu_plugin_u64_get(qemu_plugin_u64 entry,
|
||||
unsigned int vcpu_index)
|
||||
{
|
||||
return *plugin_u64_address(entry, vcpu_index);
|
||||
}
|
||||
|
||||
void qemu_plugin_u64_set(qemu_plugin_u64 entry, unsigned int vcpu_index,
|
||||
uint64_t val)
|
||||
{
|
||||
*plugin_u64_address(entry, vcpu_index) = val;
|
||||
}
|
||||
|
||||
uint64_t qemu_plugin_u64_sum(qemu_plugin_u64 entry)
|
||||
{
|
||||
uint64_t total = 0;
|
||||
for (int i = 0, n = qemu_plugin_num_vcpus(); i < n; ++i) {
|
||||
total += qemu_plugin_u64_get(entry, i);
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
@ -44,6 +44,10 @@
|
||||
qemu_plugin_tb_get_insn;
|
||||
qemu_plugin_tb_n_insns;
|
||||
qemu_plugin_tb_vaddr;
|
||||
qemu_plugin_u64_add;
|
||||
qemu_plugin_u64_get;
|
||||
qemu_plugin_u64_set;
|
||||
qemu_plugin_u64_sum;
|
||||
qemu_plugin_uninstall;
|
||||
qemu_plugin_vcpu_for_each;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user