From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=39140 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OWnHf-0002MR-Ff for qemu-devel@nongnu.org; Thu, 08 Jul 2010 05:20:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OWnHd-00008u-SE for qemu-devel@nongnu.org; Thu, 08 Jul 2010 05:20:43 -0400 Received: from mtagate7.de.ibm.com ([195.212.17.167]:38418) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OWnHd-00008Y-H1 for qemu-devel@nongnu.org; Thu, 08 Jul 2010 05:20:41 -0400 Received: from d12nrmr1607.megacenter.de.ibm.com (d12nrmr1607.megacenter.de.ibm.com [9.149.167.49]) by mtagate7.de.ibm.com (8.13.1/8.13.1) with ESMTP id o689KcYl006032 for ; Thu, 8 Jul 2010 09:20:38 GMT Received: from d12av01.megacenter.de.ibm.com (d12av01.megacenter.de.ibm.com [9.149.165.212]) by d12nrmr1607.megacenter.de.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id o689KXxW1552566 for ; Thu, 8 Jul 2010 11:20:38 +0200 Received: from d12av01.megacenter.de.ibm.com (loopback [127.0.0.1]) by d12av01.megacenter.de.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id o689KWUo020262 for ; Thu, 8 Jul 2010 11:20:33 +0200 Date: Thu, 8 Jul 2010 10:20:31 +0100 From: Stefan Hajnoczi Message-ID: <20100708092031.GC2174@stefan-thinkpad.transitives.com> References: <20100630211145.41631855@zephyr> <20100701091839.GB2344@stefan-thinkpad.transitives.com> <20100706133417.1a344397@zephyr> <20100706101001.GA6651@stefan-thinkpad.transitives.com> <20100708105858.7b456295@zephyr> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100708105858.7b456295@zephyr> Subject: [Qemu-devel] Re: [RFC v3][PATCH][Tracing] Fix build errors for target i386-linux-user List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Prerna Saxena Cc: Maneesh Soni , qemu-devel , Ananth Narayan On Thu, Jul 08, 2010 at 10:58:58AM +0530, Prerna Saxena wrote: > [PATCH] Separate monitor command handler interfaces and tracing internals. > > > Signed-off-by: Prerna Saxena > --- > monitor.c | 23 +++++++++++++++++++++++ > simpletrace.c | 51 +++++++++++++++++++++++++++++---------------------- > tracetool | 7 +++++++ > 3 files changed, 59 insertions(+), 22 deletions(-) > > diff --git a/monitor.c b/monitor.c > index 433a3ec..1f89938 100644 > --- a/monitor.c > +++ b/monitor.c > @@ -540,6 +540,29 @@ static void do_change_trace_event_state(Monitor *mon, const QDict *qdict) > bool new_state = qdict_get_bool(qdict, "option"); > change_trace_event_state(tp_name, new_state); > } > + > +void do_info_trace(Monitor *mon) > +{ > + unsigned int i; > + char rec[MAX_TRACE_STR_LEN]; > + unsigned int trace_idx = get_trace_idx(); > + > + for (i = 0; i < trace_idx ; i++) { > + if (format_trace_string(i, rec)) { > + monitor_printf(mon, rec); > + } > + } > +} > + > +void do_info_all_trace_events(Monitor *mon) > +{ > + unsigned int i; > + > + for (i = 0; i < NR_TRACE_EVENTS; i++) { > + monitor_printf(mon, "%s [Event ID %u] : state %u\n", > + trace_list[i].tp_name, i, trace_list[i].state); > + } > +} > #endif > > static void user_monitor_complete(void *opaque, QObject *ret_data) > diff --git a/simpletrace.c b/simpletrace.c > index 57c41fc..c7b1e7e 100644 > --- a/simpletrace.c > +++ b/simpletrace.c > @@ -1,8 +1,8 @@ > #include > #include > -#include "monitor.h" > #include "trace.h" > > +/* Remember to update TRACE_REC_SIZE when changing TraceRecord structure */ I can't see TRACE_REC_SIZE anywhere else in this patch. > typedef struct { > unsigned long event; > unsigned long x1; > @@ -69,27 +69,6 @@ void trace5(TraceEventID event, unsigned long x1, unsigned long x2, unsigned lon > trace(event, x1, x2, x3, x4, x5); > } > > -void do_info_trace(Monitor *mon) > -{ > - unsigned int i; > - > - for (i = 0; i < trace_idx ; i++) { > - monitor_printf(mon, "Event %lu : %lx %lx %lx %lx %lx\n", > - trace_buf[i].event, trace_buf[i].x1, trace_buf[i].x2, > - trace_buf[i].x3, trace_buf[i].x4, trace_buf[i].x5); > - } > -} > - > -void do_info_all_trace_events(Monitor *mon) > -{ > - unsigned int i; > - > - for (i = 0; i < NR_TRACE_EVENTS; i++) { > - monitor_printf(mon, "%s [Event ID %u] : state %u\n", > - trace_list[i].tp_name, i, trace_list[i].state); > - } > -} > - > static TraceEvent* find_trace_event_by_name(const char *tname) > { > unsigned int i; > @@ -115,3 +94,31 @@ void change_trace_event_state(const char *tname, bool tstate) > tp->state = tstate; > } > } > + > +/** > + * Return the current trace index. > + * > + */ > +unsigned int get_trace_idx(void) > +{ > + return trace_idx; > +} format_trace_string() returns NULL if the index is beyond the last valid trace record. monitor.c doesn't need to know how many trace records there are ahead of time, it can just keep printing until it gets NULL. I don't feel strongly about this but wanted to mention it. > + > +/** > + * returns formatted TraceRecord at a given index in the trace buffer. > + * FORMAT : "Event %lu : %lx %lx %lx %lx %lx\n" > + * > + * @idx : index in the buffer for which trace record is returned. > + * @trace_str : output string passed. > + */ > +char* format_trace_string(unsigned int idx, char trace_str[]) > +{ > + TraceRecord rec; > + if (idx >= TRACE_BUF_LEN || sizeof(trace_str) >= MAX_TRACE_STR_LEN) { sizeof(trace_str) == sizeof(char *), not the size of the caller's array in bytes. The fixed size limit can be eliminated using asprintf(3), which allocates a string of the right size while doing the string formatting. The caller of format_trace_string() is then responsible for freeing the string when they are done with it. > + return NULL; > + } > + rec = trace_buf[idx]; Is it necessary to copy the trace record here? > + sprintf(&trace_str[0], "Event %lu : %lx %lx %lx %lx %lx\n", > + rec.event, rec.x1, rec.x2, rec.x3, rec.x4, rec.x5); > + return &trace_str[0]; > +} > diff --git a/tracetool b/tracetool > index c77280d..b7a0499 100755 > --- a/tracetool > +++ b/tracetool > @@ -125,6 +125,11 @@ typedef struct { > bool state; > } TraceEvent; > > +/* Max size of trace string to be displayed via the monitor. > + * Format : "Event %lu : %lx %lx %lx %lx %lx\n" > + */ > +#define MAX_TRACE_STR_LEN 100 > + > void trace1(TraceEventID event, unsigned long x1); > void trace2(TraceEventID event, unsigned long x1, unsigned long x2); > void trace3(TraceEventID event, unsigned long x1, unsigned long x2, unsigned long x3); > @@ -133,6 +138,8 @@ void trace5(TraceEventID event, unsigned long x1, unsigned long x2, unsigned lon > void do_info_trace(Monitor *mon); > void do_info_all_trace_events(Monitor *mon); > void change_trace_event_state(const char *tname, bool tstate); > +unsigned int get_trace_idx(void); > +char* format_trace_string(unsigned int idx, char *trace_str); I think we need to choose a prefix like simpletrace_*() or something more concise (but not "strace_" because it's too confusing). Other subsystems tend to do this: pci_*(), ram_*(), etc. Perhaps let's do it as a separate patch to fix up all of the simple trace backend. > EOF > > simple_event_num=0 > -- > 1.6.2.5 > > > > -- > Prerna Saxena > > Linux Technology Centre, > IBM Systems and Technology Lab, > Bangalore, India > Stefan