qmp.c 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /*
  2. * QMP commands for tracing events.
  3. *
  4. * Copyright (C) 2014 Lluís Vilanova <vilanova@ac.upc.edu>
  5. *
  6. * This work is licensed under the terms of the GNU GPL, version 2 or later.
  7. * See the COPYING file in the top-level directory.
  8. */
  9. #include "qemu/osdep.h"
  10. #include "qemu/typedefs.h"
  11. #include "qmp-commands.h"
  12. #include "trace/control.h"
  13. TraceEventInfoList *qmp_trace_event_get_state(const char *name, Error **errp)
  14. {
  15. TraceEventInfoList *events = NULL;
  16. bool found = false;
  17. TraceEvent *ev;
  18. ev = NULL;
  19. while ((ev = trace_event_pattern(name, ev)) != NULL) {
  20. TraceEventInfoList *elem = g_new(TraceEventInfoList, 1);
  21. elem->value = g_new(TraceEventInfo, 1);
  22. elem->value->name = g_strdup(trace_event_get_name(ev));
  23. if (!trace_event_get_state_static(ev)) {
  24. elem->value->state = TRACE_EVENT_STATE_UNAVAILABLE;
  25. } else if (!trace_event_get_state_dynamic(ev)) {
  26. elem->value->state = TRACE_EVENT_STATE_DISABLED;
  27. } else {
  28. elem->value->state = TRACE_EVENT_STATE_ENABLED;
  29. }
  30. elem->next = events;
  31. events = elem;
  32. found = true;
  33. }
  34. if (!found && !trace_event_is_pattern(name)) {
  35. error_setg(errp, "unknown event \"%s\"", name);
  36. }
  37. return events;
  38. }
  39. void qmp_trace_event_set_state(const char *name, bool enable,
  40. bool has_ignore_unavailable,
  41. bool ignore_unavailable, Error **errp)
  42. {
  43. bool found = false;
  44. TraceEvent *ev;
  45. /* Check all selected events are dynamic */
  46. ev = NULL;
  47. while ((ev = trace_event_pattern(name, ev)) != NULL) {
  48. found = true;
  49. if (!(has_ignore_unavailable && ignore_unavailable) &&
  50. !trace_event_get_state_static(ev)) {
  51. error_setg(errp, "cannot set dynamic tracing state for \"%s\"",
  52. trace_event_get_name(ev));
  53. return;
  54. }
  55. }
  56. if (!found && !trace_event_is_pattern(name)) {
  57. error_setg(errp, "unknown event \"%s\"", name);
  58. return;
  59. }
  60. /* Apply changes */
  61. ev = NULL;
  62. while ((ev = trace_event_pattern(name, ev)) != NULL) {
  63. if (trace_event_get_state_static(ev)) {
  64. trace_event_set_state_dynamic(ev, enable);
  65. }
  66. }
  67. }