1 /* 2 * QMP commands for tracing events. 3 * 4 * Copyright (C) 2014-2016 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 10 #include "qemu/osdep.h" 11 #include "qapi/error.h" 12 #include "qapi/qapi-commands-trace.h" 13 #include "control.h" 14 15 16 static bool check_events(bool ignore_unavailable, bool is_pattern, 17 const char *name, Error **errp) 18 { 19 if (!is_pattern) { 20 TraceEvent *ev = trace_event_name(name); 21 22 /* error for non-existing event */ 23 if (ev == NULL) { 24 error_setg(errp, "unknown event \"%s\"", name); 25 return false; 26 } 27 28 /* error for unavailable event */ 29 if (!ignore_unavailable && !trace_event_get_state_static(ev)) { 30 error_setg(errp, "event \"%s\" is disabled", name); 31 return false; 32 } 33 34 return true; 35 } else { 36 /* error for unavailable events */ 37 TraceEventIter iter; 38 TraceEvent *ev; 39 trace_event_iter_init_pattern(&iter, name); 40 while ((ev = trace_event_iter_next(&iter)) != NULL) { 41 if (!ignore_unavailable && !trace_event_get_state_static(ev)) { 42 error_setg(errp, "event \"%s\" is disabled", trace_event_get_name(ev)); 43 return false; 44 } 45 } 46 return true; 47 } 48 } 49 50 TraceEventInfoList *qmp_trace_event_get_state(const char *name, 51 bool has_vcpu, int64_t vcpu, 52 Error **errp) 53 { 54 TraceEventInfoList *events = NULL; 55 TraceEventIter iter; 56 TraceEvent *ev; 57 bool is_pattern = trace_event_is_pattern(name); 58 59 /* Check events */ 60 if (!check_events(true, is_pattern, name, errp)) { 61 return NULL; 62 } 63 64 /* Get states (all errors checked above) */ 65 trace_event_iter_init_pattern(&iter, name); 66 while ((ev = trace_event_iter_next(&iter)) != NULL) { 67 TraceEventInfo *value; 68 69 value = g_new(TraceEventInfo, 1); 70 value->name = g_strdup(trace_event_get_name(ev)); 71 72 if (!trace_event_get_state_static(ev)) { 73 value->state = TRACE_EVENT_STATE_UNAVAILABLE; 74 } else { 75 if (trace_event_get_state_dynamic(ev)) { 76 value->state = TRACE_EVENT_STATE_ENABLED; 77 } else { 78 value->state = TRACE_EVENT_STATE_DISABLED; 79 } 80 } 81 QAPI_LIST_PREPEND(events, value); 82 } 83 84 return events; 85 } 86 87 void qmp_trace_event_set_state(const char *name, bool enable, 88 bool has_ignore_unavailable, bool ignore_unavailable, 89 bool has_vcpu, int64_t vcpu, 90 Error **errp) 91 { 92 TraceEventIter iter; 93 TraceEvent *ev; 94 bool is_pattern = trace_event_is_pattern(name); 95 96 /* Check events */ 97 if (!check_events(has_ignore_unavailable && ignore_unavailable, 98 is_pattern, name, errp)) { 99 return; 100 } 101 102 /* Apply changes (all errors checked above) */ 103 trace_event_iter_init_pattern(&iter, name); 104 while ((ev = trace_event_iter_next(&iter)) != NULL) { 105 if (!trace_event_get_state_static(ev)) { 106 continue; 107 } 108 trace_event_set_state_dynamic(ev, enable); 109 } 110 } 111