X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=trunk%2Flttv%2Fltt%2Fltt-private.h;h=357a4cc713512f5f55fa239759811088c0b20de1;hb=0c2f49848e239920c666c0052d20ea5e23c5c6e7;hp=b26d078ef16a46834c9798c9da32528ece117723;hpb=d5662043c1570c860ee97af8d6cdd95af95a8c50;p=lttv.git diff --git a/trunk/lttv/ltt/ltt-private.h b/trunk/lttv/ltt/ltt-private.h index b26d078e..357a4cc7 100644 --- a/trunk/lttv/ltt/ltt-private.h +++ b/trunk/lttv/ltt/ltt-private.h @@ -41,101 +41,75 @@ #define NSEC_PER_USEC 1000 -#define LTT_PACKED_STRUCT __attribute__ ((packed)) - -/* Hardcoded facilities */ -#define LTT_FACILITY_CORE 0 - /* Byte ordering */ #define LTT_GET_BO(t) ((t)->reverse_bo) -#define LTT_HAS_FLOAT(t) ((t)->float_word_order!=0) +#define LTT_HAS_FLOAT(t) ((t)->float_word_order ! =0) #define LTT_GET_FLOAT_BO(t) \ - (((t)->float_word_order==__BYTE_ORDER)?0:1) + (((t)->float_word_order == __BYTE_ORDER) ? 0 : 1) #define SEQUENCE_AVG_ELEMENTS 1000 - -/* Hardcoded core events */ -enum ltt_core_events { - LTT_EVENT_FACILITY_LOAD, - LTT_EVENT_FACILITY_UNLOAD, - LTT_EVENT_HEARTBEAT, - LTT_EVENT_HEARTBEAT_FULL, - LTT_EVENT_STATE_DUMP_FACILITY_LOAD -}; - + +/* + * offsetof taken from Linux kernel. + */ +#undef offsetof +#ifdef __compiler_offsetof +#define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER) +#else +#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) +#endif typedef guint8 uint8_t; typedef guint16 uint16_t; typedef guint32 uint32_t; typedef guint64 uint64_t; -struct ltt_event_header_hb { - uint32_t timestamp; - uint16_t event_id; - uint16_t event_size; -} LTT_PACKED_STRUCT; - -struct ltt_event_header_nohb { - uint64_t timestamp; - uint16_t event_id; - uint16_t event_size; -} LTT_PACKED_STRUCT; - - -/* Block and trace headers */ - -struct ltt_trace_header_any { - uint32_t magic_number; - uint32_t arch_type; - uint32_t arch_variant; - uint32_t float_word_order; - uint8_t arch_size; - uint8_t major_version; - uint8_t minor_version; - uint8_t flight_recorder; - uint8_t has_heartbeat; - uint8_t alignment; /* Event header alignment */ - uint32_t freq_scale; -} LTT_PACKED_STRUCT; - -struct ltt_trace_header_1_0 { - uint32_t magic_number; - uint32_t arch_type; - uint32_t arch_variant; - uint32_t float_word_order; - uint8_t arch_size; - uint8_t major_version; - uint8_t minor_version; - uint8_t flight_recorder; - uint8_t has_heartbeat; - uint8_t alignment; /* Event header alignment */ - uint8_t tsc_lsb_truncate; - uint8_t tscbits; - uint8_t compact_data_shift; - uint32_t freq_scale; - uint64_t start_freq; - uint64_t start_tsc; - uint64_t start_monotonic; - uint64_t start_time_sec; - uint64_t start_time_usec; -} LTT_PACKED_STRUCT; +/* Subbuffer header */ +struct ltt_subbuffer_header_2_2 { + uint64_t cycle_count_begin; /* Cycle count at subbuffer start */ + uint64_t cycle_count_end; /* Cycle count at subbuffer end */ + uint32_t magic_number; /* + * Trace magic number. + * contains endianness information. + */ + uint8_t major_version; + uint8_t minor_version; + uint8_t arch_size; /* Architecture pointer size */ + uint8_t alignment; /* LTT data alignment */ + uint64_t start_time_sec; /* NTP-corrected start time */ + uint64_t start_time_usec; + uint64_t start_freq; /* + * Frequency at trace start, + * used all along the trace. + */ + uint32_t freq_scale; /* Frequency scaling */ + uint32_t lost_size; /* Size unused at end of subbuffer */ + uint32_t buf_size; /* Size of this subbuffer */ + uint32_t events_lost; /* + * Events lost in this subbuffer since + * the beginning of the trace. + * (may overflow) + */ + uint32_t subbuf_corrupt; /* + * Corrupted (lost) subbuffers since + * the begginig of the trace. + * (may overflow) + */ + char header_end[0]; /* End of header */ +}; +typedef struct ltt_subbuffer_header_2_2 ltt_subbuffer_header_t; -struct ltt_block_start_header { - struct { - uint64_t cycle_count; - uint64_t freq; - } begin; - struct { - uint64_t cycle_count; - uint64_t freq; - } end; - uint32_t lost_size; /* Size unused at the end of the buffer */ - uint32_t buf_size; /* The size of this sub-buffer */ - struct ltt_trace_header_any trace[0]; -} LTT_PACKED_STRUCT; - +/* + * Return header size without padding after the structure. Don't use packed + * structure because gcc generates inefficient code on some architectures + * (powerpc, mips..) + */ +static inline size_t ltt_subbuffer_header_size(void) +{ + return offsetof(ltt_subbuffer_header_t, header_end); +} enum field_status { FIELD_UNKNOWN, FIELD_VARIABLE, FIELD_FIXED }; @@ -158,7 +132,6 @@ typedef struct _LttBuffer { /* Timekeeping */ uint64_t tsc; /* Current timestamp counter */ uint64_t freq; /* Frequency in khz */ - //double nsecs_per_cycle; /* Precalculated from freq */ guint32 cyc2ns_scale; } LttBuffer; @@ -180,15 +153,13 @@ struct LttTracefile { size_t alignment; //alignment of events in the tracefile. // 0 or the architecture size in bytes. - guint8 has_heartbeat; size_t buffer_header_size; - int compact; //compact tracefile ? - uint8_t tsc_lsb_truncate; uint8_t tscbits; - uint8_t tsc_msb_cutoff; - uint8_t compact_event_bits; + uint8_t eventbits; uint64_t tsc_mask; - uint64_t tsc_mask_next_bit; //next MSB after the mask + uint64_t tsc_mask_next_bit; //next MSB after the mask< + uint32_t events_lost; + uint32_t subbuf_corrupt; /* Current event */ LttEvent event; //Event currently accessible in the trace @@ -196,18 +167,6 @@ struct LttTracefile { /* Current block */ LttBuffer buffer; //current buffer guint32 buf_size; /* The size of blocks */ - - /* Time flow */ - //unsigned int count; //the number of overflow of cycle count - //double nsec_per_cycle; //Nsec per cycle - //TimeHeartbeat * last_heartbeat; //last heartbeat - - //LttCycleCount cycles_per_nsec_reciprocal; // Optimisation for speed - //void * last_event_pos; - - //LttTime prev_block_end_time; //the end time of previous block - //LttTime prev_event_time; //the time of the previous event - //LttCycleCount pre_cycle_count; //previous cycle count of the event }; /* The characteristics of the system on which the trace was obtained @@ -231,18 +190,6 @@ struct LttSystemDescription { LttTime trace_end; }; -/***************************************************************************** - macro for size of some data types - *****************************************************************************/ -// alignment -> dynamic! - -//#define TIMESTAMP_SIZE sizeof(guint32) -//#define EVENT_ID_SIZE sizeof(guint16) -//#define EVENT_HEADER_SIZE (TIMESTAMP_SIZE + EVENT_ID_SIZE) - - -//off_t get_alignment(LttField *field); - /* Calculate the offset needed to align the type. * If alignment is 0, alignment is disactivated. * else, the function returns the offset needed to