qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] trace: Make trace record fields 64-bit


From: malc
Subject: Re: [Qemu-devel] [PATCH] trace: Make trace record fields 64-bit
Date: Wed, 11 Aug 2010 13:37:34 +0400 (MSD)
User-agent: Alpine 2.00 (LNX 1167 2008-08-23)

On Wed, 11 Aug 2010, Prerna Saxena wrote:

> On 08/09/2010 07:05 PM, Stefan Hajnoczi wrote:
> > Explicitly use 64-bit fields in trace records so that timestamps and
> > magic numbers work for 32-bit host builds.
> > 
> > Signed-off-by: Stefan Hajnoczi<address@hidden>
> > ---
> >   simpletrace.c  |   31 +++++++++++++++++++++----------
> >   simpletrace.h  |   11 ++++++-----
> >   simpletrace.py |    2 +-
> >   tracetool      |    6 +++---
> >   4 files changed, 31 insertions(+), 19 deletions(-)
> > 
> > diff --git a/simpletrace.c b/simpletrace.c
> > index 954cc4e..01acfc5 100644
> > --- a/simpletrace.c
> > +++ b/simpletrace.c
> > @@ -9,18 +9,29 @@
> >    */
> > 
> >   #include<stdlib.h>
> > +#include<stdint.h>
> >   #include<stdio.h>
> >   #include<time.h>
> >   #include "trace.h"
> > 
> > +/** Trace file header event ID */
> > +#define HEADER_EVENT_ID (~(uint64_t)0) /* avoids conflicting with
> > TraceEventIDs */
> > +
> > +/** Trace file magic number */
> > +#define HEADER_MAGIC 0xf2b177cb0aa429b4ULL
> > +
> > +/** Trace file version number, bump if format changes */
> > +#define HEADER_VERSION 0
> > +
> > +/** Trace buffer entry */
> >   typedef struct {
> > -    unsigned long event;
> > -    unsigned long timestamp_ns;
> > -    unsigned long x1;
> > -    unsigned long x2;
> > -    unsigned long x3;
> > -    unsigned long x4;
> > -    unsigned long x5;
> > +    uint64_t event;
> > +    uint64_t timestamp_ns;
> > +    uint64_t x1;
> > +    uint64_t x2;
> > +    uint64_t x3;
> > +    uint64_t x4;
> > +    uint64_t x5;
> >   } TraceRecord;
> > 
> >   enum {
> > @@ -42,9 +53,9 @@ void st_print_trace_file_status(FILE *stream, int
> > (*stream_printf)(FILE *stream,
> >   static bool write_header(FILE *fp)
> >   {
> >       TraceRecord header = {
> > -        .event = -1UL, /* max avoids conflicting with TraceEventIDs */
> > -        .timestamp_ns = 0xf2b177cb0aa429b4, /* magic number */
> > -        .x1 = 0, /* bump this version number if file format changes */
> > +        .event = HEADER_EVENT_ID,
> > +        .timestamp_ns = HEADER_MAGIC,
> > +        .x1 = HEADER_VERSION,
> >       };
> > 
> >       return fwrite(&header, sizeof header, 1, fp) == 1;
> > diff --git a/simpletrace.h b/simpletrace.h
> > index 6a2b8d9..f81aa8e 100644
> > --- a/simpletrace.h
> > +++ b/simpletrace.h
> > @@ -10,6 +10,7 @@
> >   #define SIMPLETRACE_H
> > 
> >   #include<stdbool.h>
> > +#include<stdint.h>
> >   #include<stdio.h>
> > 
> >   typedef unsigned int TraceEventID;
> 
> It would be useful to have :
> 
> typedef uint64_t TraceEventID;
> 
> This ensures that the maximum number of trace events available on both 32 and
> 64 bit builds is same.
> 
> > @@ -20,11 +21,11 @@ typedef struct {
> >   } TraceEvent;
> > 
> >   void trace0(TraceEventID event);
> > -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);
> > -void trace4(TraceEventID event, unsigned long x1, unsigned long x2,
> > unsigned long x3, unsigned long x4);
> > -void trace5(TraceEventID event, unsigned long x1, unsigned long x2,
> > unsigned long x3, unsigned long x4, unsigned long x5);
> > +void trace1(TraceEventID event, uint64_t x1);
> > +void trace2(TraceEventID event, uint64_t x1, uint64_t x2);
> > +void trace3(TraceEventID event, uint64_t x1, uint64_t x2, uint64_t x3);
> > +void trace4(TraceEventID event, uint64_t x1, uint64_t x2, uint64_t x3,
> > uint64_t x4);
> > +void trace5(TraceEventID event, uint64_t x1, uint64_t x2, uint64_t x3,
> > uint64_t x4, uint64_t x5);
> >   void st_print_trace(FILE *stream, int (*stream_printf)(FILE *stream, const
> > char *fmt, ...));
> >   void st_print_trace_events(FILE *stream, int (*stream_printf)(FILE
> > *stream, const char *fmt, ...));
> >   void st_change_trace_event_state(const char *tname, bool tstate);
> > diff --git a/simpletrace.py b/simpletrace.py
> > index 979d911..fdf0eb5 100755
> > --- a/simpletrace.py
> > +++ b/simpletrace.py
> > @@ -17,7 +17,7 @@ header_event_id = 0xffffffffffffffff
> >   header_magic    = 0xf2b177cb0aa429b4
> >   header_version  = 0
> > 
> > -trace_fmt = 'LLLLLLL'
> > +trace_fmt = '=QQQQQQQ'
> >   trace_len = struct.calcsize(trace_fmt)
> >   event_re  =
> > re.compile(r'(disable\s+)?([a-zA-Z0-9_]+)\(([^)]*)\)\s+"([^"]*)"')
> > 
> > diff --git a/tracetool b/tracetool
> > index c5a5bdc..b78cd97 100755
> > --- a/tracetool
> > +++ b/tracetool
> > @@ -151,11 +151,11 @@ EOF
> >       simple_event_num=0
> >   }
> > 
> > -cast_args_to_ulong()
> > +cast_args_to_uint64_t()
> >   {
> >       local arg
> >       for arg in $(get_argnames "$1"); do
> > -        echo -n "(unsigned long)$arg"
> > +        echo -n "(uint64_t)$arg"
> 
> Tested this on a 32 bit host. It throws up some warnings, and we need :
> echo -n "(uint64_t)(uintptr_t)$arg"

Generic echo doesn't have any command line options, please use printf
instead.

> 
> >       done
> >   }
> > 
> > @@ -173,7 +173,7 @@ linetoh_simple()
> >       trace_args="$simple_event_num"
> >       if [ "$argc" -gt 0 ]
> >       then
> > -        trace_args="$trace_args, $(cast_args_to_ulong "$1")"
> > +        trace_args="$trace_args, $(cast_args_to_uint64_t "$1")"
> >       fi
> > 
> >       cat<<EOF
> 
> 
> 

-- 
mailto:address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]