X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Fltt%2Ftracefile.c;h=c9564bf444e8fa8540c72989a77f1f2f7179dce9;hb=823820eb1852619c9a24af4a01622356214c01b4;hp=20ba35dec91d9ccb1a628485299824d129e08212;hpb=79257ba540581e198c9d9b047fe0738a25c324ff;p=lttv.git diff --git a/ltt/branches/poly/ltt/tracefile.c b/ltt/branches/poly/ltt/tracefile.c index 20ba35de..c9564bf4 100644 --- a/ltt/branches/poly/ltt/tracefile.c +++ b/ltt/branches/poly/ltt/tracefile.c @@ -191,6 +191,73 @@ guint ltt_trace_get_num_cpu(LttTrace *t) } +/* trace can be NULL + * + * Return value : 0 success, 1 bad tracefile + */ +int parse_trace_header(void *header, LttTracefile *tf, LttTrace *t) +{ + guint32 *magic_number = (guint32*)header; + struct ltt_trace_header_any *any = (struct ltt_trace_header_any *)header; + + if(*magic_number == LTT_MAGIC_NUMBER) + tf->reverse_bo = 0; + else if(*magic_number == LTT_REV_MAGIC_NUMBER) + tf->reverse_bo = 1; + else /* invalid magic number, bad tracefile ! */ + return 1; + + /* Get float byte order : might be different from int byte order + * (or is set to 0 if the trace has no float (kernel trace)) */ + tf->float_word_order = any->float_word_order; + + if(t) { + t->arch_type = ltt_get_uint32(LTT_GET_BO(tf), + &any->arch_type); + t->arch_variant = ltt_get_uint32(LTT_GET_BO(tf), + &any->arch_variant); + t->arch_size = any->arch_size; + t->ltt_major_version = any->major_version; + t->ltt_minor_version = any->minor_version; + t->flight_recorder = any->flight_recorder; + t->has_heartbeat = any->has_heartbeat; + t->has_alignment = any->has_alignment; + t->has_tsc = any->has_tsc; + } + + + switch(any->major_version) { + + case 0: + switch(any->minor_version) { + case 3: + { + struct ltt_trace_header_0_3 *header_0_3 = + (struct ltt_trace_header_0_3 *)header; + tf->buffer_header_size = + sizeof(struct ltt_block_start_header) + + sizeof(struct ltt_trace_header_0_3); + } + break; + default: + g_warning("Unsupported trace version : %hhu.%hhu", + any->major_version, any->minor_version); + return 1; + } + break; + + default: + g_warning("Unsupported trace version : %hhu.%hhu", + any->major_version, any->minor_version); + return 1; + } + + + return 0; +} + + + /***************************************************************************** *Function name * ltt_tracefile_open : open a trace file, construct a LttTracefile @@ -224,7 +291,9 @@ gint ltt_tracefile_open(LttTrace *t, gchar * fileName, LttTracefile *tf) } // Is the file large enough to contain a trace - if(lTDFStat.st_size < (off_t)(sizeof(struct ltt_block_start_header))){ + if(lTDFStat.st_size < + (off_t)(sizeof(struct ltt_block_start_header + + sizeof(ltt_trace_header_any)))){ g_print("The input data file %s does not contain a trace\n", fileName); goto close_file; } @@ -232,7 +301,8 @@ gint ltt_tracefile_open(LttTrace *t, gchar * fileName, LttTracefile *tf) /* Temporarily map the buffer start header to get trace information */ /* Multiple of pages aligned head */ tf->buffer.head = mmap(0, - PAGE_ALIGN(sizeof(struct ltt_block_start_header)), PROT_READ, + PAGE_ALIGN(sizeof(struct ltt_block_start_header + + sizeof(struct ltt_trace_header_any))), PROT_READ, MAP_PRIVATE, tf->fd, 0); if(tf->buffer.head == MAP_FAILED) { perror("Error in allocating memory for buffer of tracefile"); @@ -242,15 +312,7 @@ gint ltt_tracefile_open(LttTrace *t, gchar * fileName, LttTracefile *tf) header = (struct ltt_block_start_header*)tf->buffer.head; - if(header->trace.magic_number == LTT_MAGIC_NUMBER) - tf->reverse_bo = 0; - else if(header->trace.magic_number == LTT_REV_MAGIC_NUMBER) - tf->reverse_bo = 1; - else /* invalid magic number, bad tracefile ! */ - goto unmap_file; - /* Get float byte order : might be different from int byte order - * (or is set to 0 if the trace has no float (kernel trace)) */ - tf->float_word_order = header->trace.float_word_order; + if(parse_trace_header(header->trace, tf, NULL)) goto unmap_file; //store the size of the file tf->file_size = lTDFStat.st_size; @@ -258,9 +320,11 @@ gint ltt_tracefile_open(LttTrace *t, gchar * fileName, LttTracefile *tf) tf->num_blocks = tf->file_size / tf->buf_size; if(munmap(tf->buffer.head, - PAGE_ALIGN(sizeof(struct ltt_block_start_header)))) { + PAGE_ALIGN(sizeof(struct ltt_block_start_header + + sizeof(struct ltt_trace_header_any))))) { g_warning("unmap size : %u\n", - PAGE_ALIGN(sizeof(struct ltt_block_start_header))); + PAGE_ALIGN(sizeof(struct ltt_block_start_header + + sizeof(struct ltt_trace_header_any)))); perror("munmap error"); g_assert(0); } @@ -277,9 +341,11 @@ gint ltt_tracefile_open(LttTrace *t, gchar * fileName, LttTracefile *tf) /* Error */ unmap_file: if(munmap(tf->buffer.head, - PAGE_ALIGN(sizeof(struct ltt_block_start_header)))) { + PAGE_ALIGN(sizeof(struct ltt_block_start_header + + sizeof(struct ltt_trace_header_any))))) { g_warning("unmap size : %u\n", - PAGE_ALIGN(sizeof(struct ltt_block_start_header))); + PAGE_ALIGN(sizeof(struct ltt_block_start_header + + sizeof(struct ltt_trace_header_any)))); perror("munmap error"); g_assert(0); } @@ -1048,15 +1114,7 @@ LttTrace *ltt_trace_open(const gchar *pathname) g_assert(group->len > 0); tf = &g_array_index (group, LttTracefile, 0); header = (struct ltt_block_start_header*)tf->buffer.head; - t->arch_type = ltt_get_uint32(LTT_GET_BO(tf), &header->trace.arch_type); - t->arch_variant = ltt_get_uint32(LTT_GET_BO(tf), &header->trace.arch_variant); - t->arch_size = header->trace.arch_size; - t->ltt_major_version = header->trace.major_version; - t->ltt_minor_version = header->trace.minor_version; - t->flight_recorder = header->trace.flight_recorder; - t->has_heartbeat = header->trace.has_heartbeat; - t->has_alignment = header->trace.has_alignment; - t->has_tsc = header->trace.has_tsc; + g_assert(parse_trace_header(header->trace, tf, t) == 0); t->num_cpu = group->len; @@ -1802,7 +1860,8 @@ static int ltt_seek_next_event(LttTracefile *tf) /* seek over the buffer header if we are at the buffer start */ if(tf->event.offset == 0) { - tf->event.offset += sizeof(struct ltt_block_start_header); + tf->event.offset += sizeof(struct ltt_block_start_header + + tf->buffer_header_size); if(tf->event.offset == tf->buf_size - tf->buffer.lost_size) { ret = ERANGE;