uint8_t has_tsc;
} LTT_PACKED_STRUCT;
+/* For version 0.4 */
+
+struct ltt_trace_header_0_4 {
+ 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 has_alignment; /* Event header alignment */
+ uint8_t has_tsc;
+ uint64_t start_monotonic;
+ struct timespec start_time;
+} LTT_PACKED_STRUCT;
struct ltt_block_start_header {
struct {
- struct timeval timestamp;
+ uint64_t timestamp;
uint64_t cycle_count;
+ uint64_t freq;
} begin;
struct {
- struct timeval timestamp;
+ uint64_t timestamp;
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 {
LttTime timestamp;
uint64_t cycle_count;
+ uint64_t freq; /* Frequency in khz */
} begin;
struct {
LttTime timestamp;
uint64_t cycle_count;
+ uint64_t freq; /* Frequency in khz */
} end;
uint32_t lost_size; /* Size unused at the end of the buffer */
/* Timekeeping */
uint64_t tsc; /* Current timestamp counter */
- double nsecs_per_cycle;
+ uint64_t freq; /* Frequency in khz */
+ double nsecs_per_cycle; /* Precalculated from freq */
} LttBuffer;
struct _LttTracefile{
guint8 has_heartbeat;
guint8 has_alignment;
guint8 has_tsc;
+ uint64_t start_monotonic;
+ LttTime start_time;
GData *tracefiles; //tracefiles groups
};
tf->buffer_header_size =
sizeof(struct ltt_block_start_header)
+ sizeof(struct ltt_trace_header_0_3);
+ g_warning("Unsupported trace version : %hhu.%hhu",
+ any->major_version, any->minor_version);
+ return 1;
+ }
+ break;
+ case 4:
+ {
+ struct ltt_trace_header_0_4 *vheader =
+ (struct ltt_trace_header_0_4 *)header;
+ tf->buffer_header_size =
+ sizeof(struct ltt_block_start_header)
+ + sizeof(struct ltt_trace_header_0_4);
+ if(t) {
+ t->start_monotonic = ltt_get_uint64(LTT_GET_BO(tf),
+ &vheader->start_monotonic);
+ t->start_time = ltt_get_time(LTT_GET_BO(tf),
+ &vheader->start_time);
+ }
}
break;
default:
- g_warning("Unsupported trace version : %hhu.%hhu",
+ g_warning("Unsupported trace version : %hhu.%hhu",
any->major_version, any->minor_version);
return 1;
}
header = (struct ltt_block_start_header*)tf->buffer.head;
- tf->buffer.begin.timestamp = ltt_get_time(LTT_GET_BO(tf),
- &header->begin.timestamp);
- tf->buffer.begin.timestamp.tv_nsec *= NSEC_PER_USEC;
+ tf->buffer.begin.timestamp = ltt_time_add(
+ ltt_time_from_uint64(
+ ltt_get_uint64(LTT_GET_BO(tf),
+ &header->begin.timestamp)
+ - tf->trace->start_monotonic),
+ tf->trace->start_time);
//g_debug("block %u begin : %lu.%lu", block_num,
// tf->buffer.begin.timestamp.tv_sec, tf->buffer.begin.timestamp.tv_nsec);
tf->buffer.begin.cycle_count = ltt_get_uint64(LTT_GET_BO(tf),
&header->begin.cycle_count);
- tf->buffer.end.timestamp = ltt_get_time(LTT_GET_BO(tf),
- &header->end.timestamp);
- tf->buffer.end.timestamp.tv_nsec *= NSEC_PER_USEC;
+ tf->buffer.begin.freq = ltt_get_uint64(LTT_GET_BO(tf),
+ &header->begin.freq);
+ tf->buffer.end.timestamp = ltt_time_add(
+ ltt_time_from_uint64(
+ ltt_get_uint64(LTT_GET_BO(tf),
+ &header->end.timestamp)
+ - tf->trace->start_monotonic),
+ tf->trace->start_time);
+
//g_debug("block %u end : %lu.%lu", block_num,
// tf->buffer.end.timestamp.tv_sec, tf->buffer.end.timestamp.tv_nsec);
tf->buffer.end.cycle_count = ltt_get_uint64(LTT_GET_BO(tf),
&header->end.cycle_count);
+ tf->buffer.end.freq = ltt_get_uint64(LTT_GET_BO(tf),
+ &header->end.freq);
tf->buffer.lost_size = ltt_get_uint32(LTT_GET_BO(tf),
- &header->lost_size);
+ &header->lost_size);
tf->buffer.tsc = tf->buffer.begin.cycle_count;
tf->event.tsc = tf->buffer.tsc;
+ tf->buffer.freq = tf->buffer.begin.freq;
/* FIXME
* eventually support variable buffer size : will need a partial pre-read of
/*****************************************************************************
*Function name
* calc_nsecs_per_cycle : calculate nsecs per cycle for current block
+ *
+ * 1.0 / (freq(khz) *1000) * 1000000000
*Input Params
* t : tracefile
****************************************************************************/
-
+/* from timer_tsc.c */
+#define CYC2NS_SCALE_FACTOR 10
static double calc_nsecs_per_cycle(LttTracefile * tf)
{
- LttTime lBufTotalTime; /* Total time for this buffer */
- double lBufTotalNSec; /* Total time for this buffer in nsecs */
- LttCycleCount lBufTotalCycle;/* Total cycles for this buffer */
-
- /* Calculate the total time for this buffer */
- lBufTotalTime = ltt_time_sub(tf->buffer.end.timestamp,
- tf->buffer.begin.timestamp);
-
- /* Calculate the total cycles for this bufffer */
- lBufTotalCycle = tf->buffer.end.cycle_count;
- lBufTotalCycle -= tf->buffer.begin.cycle_count;
-
- /* Convert the total time to double */
- lBufTotalNSec = ltt_time_to_double(lBufTotalTime);
+ //return 1e6 / (double)tf->buffer.freq;
+ guint64 cpu_mhz = tf->buffer.freq / 1000;
+ guint64 cyc2ns_scale = (1000 << CYC2NS_SCALE_FACTOR)/cpu_mhz;
- return lBufTotalNSec / (double)lBufTotalCycle;
-
+ return cyc2ns_scale >> CYC2NS_SCALE_FACTOR;
+ // return 1e6 / (double)tf->buffer.freq;
}
#if 0
void setFieldsOffset(LttTracefile *tf, LttEventType *evT,void *evD)