static int ltt_seek_next_event(LttTracefile *tf);
static void __attribute__((constructor)) init(void);
static void ltt_update_event_size(LttTracefile *tf);
+
+/* Enable event debugging */
+static int a_event_debug = 0;
+
+void ltt_event_debug(int state)
+{
+ a_event_debug = state;
+}
+
//void precompute_offsets(LttFacility *fac, LttEventType *event);
#if 0
/* 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;
- tf->has_alignment = any->has_alignment;
+ tf->alignment = any->alignment;
tf->has_heartbeat = any->has_heartbeat;
if(t) {
// t->compact_facilities = NULL;
}
-
switch(any->major_version) {
case 0:
goto event_id_error;
} else {
- void *pos;
+ char *pos;
const char *marker_name, *format;
uint16_t id;
guint8 int_size, long_size, pointer_size, size_t_size, alignment;
// FIXME align
switch((enum marker_id)tf->event.event_id) {
case MARKER_ID_SET_MARKER_ID:
- marker_name = (char*)(tf->event.data);
+ marker_name = pos = tf->event.data;
g_debug("Doing MARKER_ID_SET_MARKER_ID of marker %s", marker_name);
- pos = (tf->event.data + strlen(marker_name) + 1);
- pos += ltt_align((size_t)pos, tf->trace->arch_size, tf->has_alignment);
- pos += ltt_align((size_t)pos, sizeof(uint16_t), tf->has_alignment);
+ pos += strlen(marker_name) + 1;
+ //remove genevent compatibility
+ //pos += ltt_align((size_t)pos, tf->trace->arch_size, tf->alignment);
+ pos += ltt_align((size_t)pos, sizeof(uint16_t), tf->alignment);
id = ltt_get_uint16(LTT_GET_BO(tf), pos);
+ g_debug("In MARKER_ID_SET_MARKER_ID of marker %s id %hu",
+ marker_name, id);
pos += sizeof(guint16);
int_size = *(guint8*)pos;
pos += sizeof(guint8);
pointer_size, size_t_size, alignment);
break;
case MARKER_ID_SET_MARKER_FORMAT:
- marker_name = (char*)(tf->event.data);
+ marker_name = pos = tf->event.data;
g_debug("Doing MARKER_ID_SET_MARKER_FORMAT of marker %s",
marker_name);
- pos = (tf->event.data + strlen(marker_name) + 1);
- pos += ltt_align((size_t)pos, tf->trace->arch_size, tf->has_alignment);
- format = (const char*)pos;
+ pos += strlen(marker_name) + 1;
+ //break genevent.
+ //pos += ltt_align((size_t)pos, tf->trace->arch_size, tf->alignment);
+ format = pos;
pos += strlen(format) + 1;
- pos += ltt_align((size_t)pos, tf->trace->arch_size, tf->has_alignment);
+ //break genevent
+ //pos += ltt_align((size_t)pos, tf->trace->arch_size, tf->alignment);
marker_format_event(tf->trace, g_quark_from_string(marker_name),
format);
/* get information from dictionnary TODO */
t->num_cpu = group->len;
+ ret = allocate_marker_data(t);
+ if (ret)
+ g_error("Error in allocating marker data");
+
for(i=0; i<group->len; i++) {
tf = &g_array_index (group, LttTracefile, i);
if(ltt_process_facility_tracefile(tf))
/* Error handling */
facilities_error:
- g_datalist_clear(&t->facilities_by_name);
- g_array_free(t->facilities_by_num, TRUE);
+ destroy_marker_data(t);
find_error:
g_datalist_clear(&t->tracefiles);
open_error:
return 0;
}
+static void print_debug_event_header(LttEvent *ev, void *start_pos, void *end_pos)
+{
+ unsigned int offset = 0;
+ int i, j;
+
+ g_printf("Event header (tracefile %s offset %llx):\n",
+ g_quark_to_string(ev->tracefile->name),
+ ((uint64_t)ev->tracefile->buffer.index * ev->tracefile->buf_size)
+ + (long)start_pos - (long)ev->tracefile->buffer.head);
+
+ while (offset < (long)end_pos - (long)start_pos) {
+ g_printf("%8lx", (long)start_pos - (long)ev->tracefile->buffer.head + offset);
+ g_printf(" ");
+
+ for (i = 0; i < 4 ; i++) {
+ for (j = 0; j < 4; j++) {
+ if (offset + ((i * 4) + j) <
+ (long)end_pos - (long)start_pos)
+ g_printf("%02hhX",
+ ((char*)ev->tracefile->buffer.head)[ev->offset + offset + ((i * 4) + j)]);
+ else
+ g_printf(" ");
+ g_printf(" ");
+ }
+ if (i < 4)
+ g_printf(" ");
+ }
+ offset+=16;
+ g_printf("\n");
+ }
+}
+
/* same as ltt_tracefile_read, but does not seek to the next event nor call
* event specific operation. */
{
void * pos;
LttEvent *event;
+ void *pos_aligned;
event = &tf->event;
pos = tf->buffer.head + event->offset;
/* Align the head */
if(!tf->compact)
- pos += ltt_align((size_t)pos, tf->trace->arch_size, tf->has_alignment);
+ pos += ltt_align((size_t)pos, tf->trace->arch_size, tf->alignment);
else {
g_assert(tf->has_heartbeat);
- pos += ltt_align((size_t)pos, sizeof(uint32_t), tf->has_alignment);
+ pos += ltt_align((size_t)pos, sizeof(uint32_t), tf->alignment);
}
+ pos_aligned = pos;
if(tf->has_heartbeat) {
event->timestamp = ltt_get_uint32(LTT_GET_BO(tf),
} else {
/* Compact event */
}
+
+ if (a_event_debug)
+ print_debug_event_header(event, pos_aligned, pos);
+
/* Align the head */
if(!tf->compact)
- pos += ltt_align((size_t)pos, tf->trace->arch_size, tf->has_alignment);
+ pos += ltt_align((size_t)pos, tf->trace->arch_size, tf->alignment);
event->data = pos;
}
+static void print_debug_event_data(LttEvent *ev)
+{
+ unsigned int offset = 0;
+ int i, j;
+
+ if (!max(ev->event_size, ev->data_size))
+ return;
+
+ g_printf("Event data (tracefile %s offset %llx):\n",
+ g_quark_to_string(ev->tracefile->name),
+ ((uint64_t)ev->tracefile->buffer.index * ev->tracefile->buf_size)
+ + (long)ev->data - (long)ev->tracefile->buffer.head);
+
+ while (offset < max(ev->event_size, ev->data_size)) {
+ g_printf("%8lx", (long)ev->data + offset
+ - (long)ev->tracefile->buffer.head);
+ g_printf(" ");
+
+ for (i = 0; i < 4 ; i++) {
+ for (j = 0; j < 4; j++) {
+ if (offset + ((i * 4) + j) < max(ev->event_size, ev->data_size))
+ g_printf("%02hhX", ((char*)ev->data)[offset + ((i * 4) + j)]);
+ else
+ g_printf(" ");
+ g_printf(" ");
+ }
+ if (i < 4)
+ g_printf(" ");
+ }
+
+ g_printf(" ");
+
+ for (i = 0; i < 4; i++) {
+ for (j = 0; j < 4; j++) {
+ if (offset + ((i * 4) + j) < max(ev->event_size, ev->data_size)) {
+ if (isprint(((char*)ev->data)[offset + ((i * 4) + j)]))
+ g_printf("%c", ((char*)ev->data)[offset + ((i * 4) + j)]);
+ else
+ g_printf(".");
+ } else
+ g_printf(" ");
+ }
+ }
+ offset+=16;
+ g_printf("\n");
+ }
+}
+
/* It will update the fields offsets too */
void ltt_update_event_size(LttTracefile *tf)
{
switch((enum marker_id)tf->event.event_id) {
case MARKER_ID_SET_MARKER_ID:
size = strlen((char*)tf->event.data) + 1;
- //g_debug("marker %s id set", (char*)tf->event.data);
- size += ltt_align(size, sizeof(guint16), tf->has_alignment);
+ g_debug("marker %s id set", (char*)tf->event.data);
+ size += ltt_align(size, sizeof(guint16), tf->alignment);
size += sizeof(guint16);
size += sizeof(guint8);
size += sizeof(guint8);
size += sizeof(guint8);
break;
case MARKER_ID_SET_MARKER_FORMAT:
- //g_debug("marker %s format set", (char*)tf->event.data);
+ g_debug("marker %s format set", (char*)tf->event.data);
size = strlen((char*)tf->event.data) + 1;
- size += strlen((char*)tf->event.data) + 1;
+ size += strlen((char*)tf->event.data + size) + 1;
break;
case MARKER_ID_HEARTBEAT_32:
- //g_debug("Update Event heartbeat 32 bits");
- size = ltt_align(size, sizeof(guint32), tf->has_alignment);
- size += sizeof(guint32);
+ g_debug("Update Event heartbeat 32 bits");
break;
case MARKER_ID_HEARTBEAT_64:
- //g_debug("Update Event heartbeat 64 bits");
+ g_debug("Update Event heartbeat 64 bits");
tscdata = (char*)(tf->event.data);
tf->event.tsc = ltt_get_uint64(LTT_GET_BO(tf), tscdata);
tf->buffer.tsc = tf->event.tsc;
tf->event.event_time = ltt_interpolate_time(tf, &tf->event);
- size = ltt_align(size, sizeof(guint64), tf->has_alignment);
+ size = ltt_align(size, sizeof(guint64), tf->alignment);
size += sizeof(guint64);
break;
- default:
- info = marker_get_info_from_id(tf->trace, tf->event.event_id);
- g_assert(info != NULL);
- if (info->size != -1) {
- size = info->size;
- } else {
- size = marker_update_fields_offsets(marker_get_info_from_id(tf->trace,
- tf->event.event_id), tf->event.data);
- }
+ }
+
+ info = marker_get_info_from_id(tf->trace, tf->event.event_id);
+ if (tf->event.event_id >= MARKER_CORE_IDS)
+ g_assert(info != NULL);
+
+ /* Do not update field offsets of core markers when initially reading the
+ * facility tracefile when the infos about these markers do not exist yet.
+ */
+ if (likely(info && info->fields)) {
+ if (info->size != -1)
+ size = info->size;
+ else
+ size = marker_update_fields_offsets(marker_get_info_from_id(tf->trace,
+ tf->event.event_id), tf->event.data);
}
tf->event.data_size = size;
/* Event size too big to fit in the event size field */
tf->event.event_size = tf->event.data_size;
}
+
+ if (a_event_debug)
+ print_debug_event_data(&tf->event);
+
if (tf->event.data_size != tf->event.event_size) {
struct marker_info *info = marker_get_info_from_id(tf->trace,
tf->event.event_id);