Lines Matching +full:enum +full:- +full:as +full:- +full:flags

10  *   See the COPYING file in the top-level directory.
12 * SPDX-License-Identifier: GPL-2.0-or-later
21 #include "exec/tb-flush.h"
22 #include "tcg/tcg-op-common.h"
50 bitmap_copy(cpu->plugin_state->event_mask, in plugin_cpu_update__async()
64 enum qemu_plugin_event ev) in plugin_unregister_cb__locked()
66 struct qemu_plugin_cb *cb = ctx->callbacks[ev]; in plugin_unregister_cb__locked()
73 ctx->callbacks[ev] = NULL; in plugin_unregister_cb__locked()
86 static void plugin_vcpu_cb__simple(CPUState *cpu, enum qemu_plugin_event ev) in plugin_vcpu_cb__simple()
97 qemu_plugin_vcpu_simple_cb_t func = cb->f.vcpu_simple; in plugin_vcpu_cb__simple()
99 func(cb->ctx->id, cpu->cpu_index); in plugin_vcpu_cb__simple()
113 static void plugin_cb__simple(enum qemu_plugin_event ev) in plugin_cb__simple()
120 qemu_plugin_simple_cb_t func = cb->f.simple; in plugin_cb__simple()
122 func(cb->ctx->id); in plugin_cb__simple()
136 static void plugin_cb__udata(enum qemu_plugin_event ev) in plugin_cb__udata()
143 qemu_plugin_udata_cb_t func = cb->f.udata; in plugin_cb__udata()
145 func(cb->ctx->id, cb->udata); in plugin_cb__udata()
154 do_plugin_register_cb(qemu_plugin_id_t id, enum qemu_plugin_event ev, in do_plugin_register_cb()
162 if (unlikely(ctx->uninstalling)) { in do_plugin_register_cb()
166 struct qemu_plugin_cb *cb = ctx->callbacks[ev]; in do_plugin_register_cb()
169 cb->f.generic = func; in do_plugin_register_cb()
170 cb->udata = udata; in do_plugin_register_cb()
173 cb->ctx = ctx; in do_plugin_register_cb()
174 cb->f.generic = func; in do_plugin_register_cb()
175 cb->udata = udata; in do_plugin_register_cb()
176 ctx->callbacks[ev] = cb; in do_plugin_register_cb()
189 void plugin_register_cb(qemu_plugin_id_t id, enum qemu_plugin_event ev, in plugin_register_cb()
196 plugin_register_cb_udata(qemu_plugin_id_t id, enum qemu_plugin_event ev, in plugin_register_cb_udata()
212 if (cpu->cpu_index < scoreboard_size) { in plugin_grow_scoreboards__locked()
216 while (cpu->cpu_index >= scoreboard_size) { in plugin_grow_scoreboards__locked()
233 * initialized at the same time, we are safe, as the new in plugin_grow_scoreboards__locked()
238 /* cpus must be stopped, as tb might still use an existing scoreboard. */ in plugin_grow_scoreboards__locked()
240 /* re-acquire lock */ in plugin_grow_scoreboards__locked()
246 g_array_set_size(score->data, scoreboard_size); in plugin_grow_scoreboards__locked()
249 /* force all tb to be flushed, as scoreboard pointers were changed. */ in plugin_grow_scoreboards__locked()
259 assert(cpu->cpu_index != UNASSIGNED_CPU_INDEX); in qemu_plugin_vcpu_init__async()
261 plugin.num_vcpus = MAX(plugin.num_vcpus, cpu->cpu_index + 1); in qemu_plugin_vcpu_init__async()
262 plugin_cpu_update__locked(&cpu->cpu_index, NULL, NULL); in qemu_plugin_vcpu_init__async()
263 success = g_hash_table_insert(plugin.cpu_ht, &cpu->cpu_index, in qemu_plugin_vcpu_init__async()
264 &cpu->cpu_index); in qemu_plugin_vcpu_init__async()
284 assert(cpu->cpu_index != UNASSIGNED_CPU_INDEX); in qemu_plugin_vcpu_exit_hook()
286 success = g_hash_table_remove(plugin.cpu_ht, &cpu->cpu_index); in qemu_plugin_vcpu_exit_hook()
301 args->cb(args->ctx->id, cpu_index); in plugin_vcpu_for_each()
330 g_array_set_size(cbs, cbs->len + 1); in plugin_get_dyn_cb()
331 return &g_array_index(cbs, struct qemu_plugin_dyn_cb, cbs->len - 1); in plugin_get_dyn_cb()
334 static enum plugin_dyn_cb_type op_to_cb_type(enum qemu_plugin_op op) in op_to_cb_type()
347 enum qemu_plugin_mem_rw rw, in plugin_register_inline_op_on_entry()
348 enum qemu_plugin_op op, in plugin_register_inline_op_on_entry()
358 dyn_cb->type = op_to_cb_type(op); in plugin_register_inline_op_on_entry()
359 dyn_cb->inline_insn = inline_cb; in plugin_register_inline_op_on_entry()
364 enum qemu_plugin_cb_flags flags, in plugin_register_dyn_cb__udata() argument
368 [QEMU_PLUGIN_CB_NO_REGS].flags = TCG_CALL_NO_RWG, in plugin_register_dyn_cb__udata()
369 [QEMU_PLUGIN_CB_R_REGS].flags = TCG_CALL_NO_WG, in plugin_register_dyn_cb__udata()
378 assert((unsigned)flags < ARRAY_SIZE(info)); in plugin_register_dyn_cb__udata()
383 .info = &info[flags] }; in plugin_register_dyn_cb__udata()
384 dyn_cb->type = PLUGIN_CB_REGULAR; in plugin_register_dyn_cb__udata()
385 dyn_cb->regular = regular_cb; in plugin_register_dyn_cb__udata()
390 enum qemu_plugin_cb_flags flags, in plugin_register_dyn_cond_cb__udata() argument
391 enum qemu_plugin_cond cond, in plugin_register_dyn_cond_cb__udata()
397 [QEMU_PLUGIN_CB_NO_REGS].flags = TCG_CALL_NO_RWG, in plugin_register_dyn_cond_cb__udata()
398 [QEMU_PLUGIN_CB_R_REGS].flags = TCG_CALL_NO_WG, in plugin_register_dyn_cond_cb__udata()
407 assert((unsigned)flags < ARRAY_SIZE(info)); in plugin_register_dyn_cond_cb__udata()
415 .info = &info[flags] }; in plugin_register_dyn_cond_cb__udata()
416 dyn_cb->type = PLUGIN_CB_COND; in plugin_register_dyn_cond_cb__udata()
417 dyn_cb->cond = cond_cb; in plugin_register_dyn_cond_cb__udata()
422 enum qemu_plugin_cb_flags flags, in plugin_register_vcpu_mem_cb() argument
423 enum qemu_plugin_mem_rw rw, in plugin_register_vcpu_mem_cb()
427 * Expect that the underlying type for enum qemu_plugin_meminfo_t in plugin_register_vcpu_mem_cb()
435 [QEMU_PLUGIN_CB_NO_REGS].flags = TCG_CALL_NO_RWG, in plugin_register_vcpu_mem_cb()
436 [QEMU_PLUGIN_CB_R_REGS].flags = TCG_CALL_NO_WG, in plugin_register_vcpu_mem_cb()
449 assert((unsigned)flags < ARRAY_SIZE(info)); in plugin_register_vcpu_mem_cb()
455 .info = &info[flags] }; in plugin_register_vcpu_mem_cb()
456 dyn_cb->type = PLUGIN_CB_MEM_REGULAR; in plugin_register_vcpu_mem_cb()
457 dyn_cb->regular = regular_cb; in plugin_register_vcpu_mem_cb()
469 enum qemu_plugin_event ev = QEMU_PLUGIN_EV_VCPU_TB_TRANS; in qemu_plugin_tb_trans_cb()
471 /* no plugin_state->event_mask check here; caller should have checked */ in qemu_plugin_tb_trans_cb()
474 qemu_plugin_vcpu_tb_trans_cb_t func = cb->f.vcpu_tb_trans; in qemu_plugin_tb_trans_cb()
476 func(cb->ctx->id, tb); in qemu_plugin_tb_trans_cb()
492 enum qemu_plugin_event ev = QEMU_PLUGIN_EV_VCPU_SYSCALL; in qemu_plugin_vcpu_syscall()
494 if (!test_bit(ev, cpu->plugin_state->event_mask)) { in qemu_plugin_vcpu_syscall()
499 qemu_plugin_vcpu_syscall_cb_t func = cb->f.vcpu_syscall; in qemu_plugin_vcpu_syscall()
501 func(cb->ctx->id, cpu->cpu_index, num, a1, a2, a3, a4, a5, a6, a7, a8); in qemu_plugin_vcpu_syscall()
514 enum qemu_plugin_event ev = QEMU_PLUGIN_EV_VCPU_SYSCALL_RET; in qemu_plugin_vcpu_syscall_ret()
516 if (!test_bit(ev, cpu->plugin_state->event_mask)) { in qemu_plugin_vcpu_syscall_ret()
521 qemu_plugin_vcpu_syscall_ret_cb_t func = cb->f.vcpu_syscall_ret; in qemu_plugin_vcpu_syscall_ret()
523 func(cb->ctx->id, cpu->cpu_index, num, ret); in qemu_plugin_vcpu_syscall_ret()
530 if (cpu->cpu_index < plugin.num_vcpus) { in qemu_plugin_vcpu_idle_cb()
537 if (cpu->cpu_index < plugin.num_vcpus) { in qemu_plugin_vcpu_resume_cb()
574 void exec_inline_op(enum plugin_dyn_cb_type type, in exec_inline_op()
578 char *ptr = cb->entry.score->data->data; in exec_inline_op()
580 cb->entry.score->data); in exec_inline_op()
581 size_t offset = cb->entry.offset; in exec_inline_op()
586 *val += cb->imm; in exec_inline_op()
589 *val = cb->imm; in exec_inline_op()
599 MemOpIdx oi, enum qemu_plugin_mem_rw rw) in qemu_plugin_vcpu_mem_cb()
601 GArray *arr = cpu->neg.plugin_mem_cbs; in qemu_plugin_vcpu_mem_cb()
608 cpu->neg.plugin_mem_value_low = value_low; in qemu_plugin_vcpu_mem_cb()
609 cpu->neg.plugin_mem_value_high = value_high; in qemu_plugin_vcpu_mem_cb()
611 for (i = 0; i < arr->len; i++) { in qemu_plugin_vcpu_mem_cb()
615 switch (cb->type) { in qemu_plugin_vcpu_mem_cb()
617 if (rw & cb->regular.rw) { in qemu_plugin_vcpu_mem_cb()
618 cb->regular.f.vcpu_mem(cpu->cpu_index, in qemu_plugin_vcpu_mem_cb()
620 vaddr, cb->regular.userp); in qemu_plugin_vcpu_mem_cb()
625 if (rw & cb->inline_insn.rw) { in qemu_plugin_vcpu_mem_cb()
626 exec_inline_op(cb->type, &cb->inline_insn, cpu->cpu_index); in qemu_plugin_vcpu_mem_cb()
648 * Handle exit from linux-user. Unlike the normal atexit() mechanism
649 * we need to handle the clean-up manually as it's possible threads
657 enum qemu_plugin_event ev; in qemu_plugin_user_exit()
663 * - start_exclusive(), which acquires qemu_cpu_list_lock, in qemu_plugin_user_exit()
665 * - tb_flush(), which acquires mmap_lock(), must be called in qemu_plugin_user_exit()
671 /* un-register all callbacks except the final AT_EXIT one */ in qemu_plugin_user_exit()
677 plugin_unregister_cb__locked(cb->ctx, ev); in qemu_plugin_user_exit()
694 * Helpers for *-user to ensure locks are sane across fork() events.
744 score->data = g_array_new(FALSE, TRUE, element_size); in plugin_scoreboard_new()
745 g_array_set_size(score->data, plugin.scoreboard_alloc_size); in plugin_scoreboard_new()
760 g_array_free(score->data, TRUE); in plugin_scoreboard_free()