t->ltt_minor_version = any->minor_version;
t->flight_recorder = any->flight_recorder;
t->has_heartbeat = any->has_heartbeat;
- t->freq_scale = any->freq_scale;
}
if(t) {
t->start_freq = ltt_get_uint64(LTT_GET_BO(tf),
&vheader->start_freq);
+ t->freq_scale = ltt_get_uint32(LTT_GET_BO(tf),
+ &vheader->freq_scale);
t->start_tsc = ltt_get_uint64(LTT_GET_BO(tf),
&vheader->start_tsc);
t->start_monotonic = ltt_get_uint64(LTT_GET_BO(tf),
t->start_time.tv_nsec *= 1000; /* microsec to nanosec */
t->start_time_from_tsc = ltt_time_from_uint64(
- (double)t->start_tsc * 1000000.0 / (double)t->start_freq);
+ (double)t->start_tsc
+ * (1000000000.0 / tf->trace->freq_scale)
+ / (double)t->start_freq);
}
}
break;
if(i==-1) { /* Either not found or name length is 0 */
/* This is a userspace tracefile */
strncpy(char_name, raw_name, raw_name_len);
+ char_name[raw_name_len] = '\0';
*name = g_quark_from_string(char_name);
*num = 0; /* unknown cpu */
for(i=0;i<raw_name_len;i++) {
case LTT_ARCH_TYPE_C2:
text = "_c2";
break;
+ case LTT_ARCH_TYPE_POWERPC:
+ text = "_powerpc";
+ break;
default:
g_error("Trace from unsupported architecture.");
}
g_debug("Doing LTT_EVENT_FACILITY_LOAD of facility %s",
fac_name);
pos = (tf->event.data + strlen(fac_name) + 1);
- pos += ltt_align((size_t)pos, sizeof(guint32), tf->has_alignment);
+ pos += ltt_align((size_t)pos, tf->trace->arch_size, tf->has_alignment);
fac_load_data = (struct LttFacilityLoad *)pos;
fac = &g_array_index (tf->trace->facilities_by_num, LttFacility,
fac->id = ltt_get_uint32(LTT_GET_BO(tf), &fac_load_data->id);
fac->pointer_size = ltt_get_uint32(LTT_GET_BO(tf),
&fac_load_data->pointer_size);
- fac->int_size = ltt_get_uint32(LTT_GET_BO(tf),
- &fac_load_data->int_size);
+ fac->int_size = ltt_get_uint32(LTT_GET_BO(tf),
+ &fac_load_data->int_size);
fac->long_size = ltt_get_uint32(LTT_GET_BO(tf),
&fac_load_data->long_size);
fac->size_t_size = ltt_get_uint32(LTT_GET_BO(tf),
g_debug("Doing LTT_EVENT_STATE_DUMP_FACILITY_LOAD of facility %s",
fac_name);
pos = (tf->event.data + strlen(fac_name) + 1);
- pos += ltt_align((size_t)pos, sizeof(guint32), tf->has_alignment);
+ pos += ltt_align((size_t)pos, tf->trace->arch_size, tf->has_alignment);
fac_state_dump_load_data = (struct LttStateDumpFacilityLoad *)pos;
fac = &g_array_index (tf->trace->facilities_by_num, LttFacility,
&fac_state_dump_load_data->id);
fac->pointer_size = ltt_get_uint32(LTT_GET_BO(tf),
&fac_state_dump_load_data->pointer_size);
- fac->int_size = ltt_get_uint32(LTT_GET_BO(tf),
- &fac_state_dump_load_data->int_size);
+ fac->int_size = ltt_get_uint32(LTT_GET_BO(tf),
+ &fac_state_dump_load_data->int_size);
fac->long_size = ltt_get_uint32(LTT_GET_BO(tf),
&fac_state_dump_load_data->long_size);
fac->size_t_size = ltt_get_uint32(LTT_GET_BO(tf),
void ltt_update_event_size(LttTracefile *tf)
{
off_t size = 0;
-
- /* Specific handling of core events : necessary to read the facility control
- * tracefile. */
LttFacility *f = ltt_trace_get_facility_by_num(tf->trace,
tf->event.facility_id);
-
- if(likely(tf->event.facility_id == LTT_FACILITY_CORE)) {
- switch((enum ltt_core_events)tf->event.event_id) {
- case LTT_EVENT_FACILITY_LOAD:
- size = strlen((char*)tf->event.data) + 1;
- //g_debug("Update Event facility load of facility %s", (char*)tf->event.data);
- size += ltt_align(size, sizeof(guint32), tf->has_alignment);
- size += sizeof(struct LttFacilityLoad);
- break;
- case LTT_EVENT_FACILITY_UNLOAD:
- //g_debug("Update Event facility unload");
- size = sizeof(struct LttFacilityUnload);
- break;
- case LTT_EVENT_STATE_DUMP_FACILITY_LOAD:
- size = strlen((char*)tf->event.data) + 1;
- size += ltt_align(size, sizeof(guint32), tf->has_alignment);
- //g_debug("Update Event facility load state dump of facility %s",
- // (char*)tf->event.data);
- size += sizeof(struct LttStateDumpFacilityLoad);
- break;
- case LTT_EVENT_HEARTBEAT:
- //g_debug("Update Event heartbeat");
- size = sizeof(TimeHeartbeat);
- break;
- default:
- g_warning("Error in getting event size : tracefile %s, "
- "unknown event id %hhu in core facility.",
- g_quark_to_string(tf->name),
- tf->event.event_id);
- goto event_id_error;
-
- }
- } else {
- if(!f->exists) {
+
+ if(!f->exists) {
+ /* Specific handling of core events : necessary to read the facility control
+ * tracefile. */
+
+ if(likely(tf->event.facility_id == LTT_FACILITY_CORE)) {
+ switch((enum ltt_core_events)tf->event.event_id) {
+ case LTT_EVENT_FACILITY_LOAD:
+ size = strlen((char*)tf->event.data) + 1;
+ //g_debug("Update Event facility load of facility %s", (char*)tf->event.data);
+ size += ltt_align(size, sizeof(guint32), tf->has_alignment);
+ size += sizeof(struct LttFacilityLoad);
+ break;
+ case LTT_EVENT_FACILITY_UNLOAD:
+ //g_debug("Update Event facility unload");
+ size = sizeof(struct LttFacilityUnload);
+ break;
+ case LTT_EVENT_STATE_DUMP_FACILITY_LOAD:
+ size = strlen((char*)tf->event.data) + 1;
+ size += ltt_align(size, sizeof(guint32), tf->has_alignment);
+ //g_debug("Update Event facility load state dump of facility %s",
+ // (char*)tf->event.data);
+ size += sizeof(struct LttStateDumpFacilityLoad);
+ break;
+ case LTT_EVENT_HEARTBEAT:
+ //g_debug("Update Event heartbeat");
+ size = sizeof(TimeHeartbeat);
+ break;
+ default:
+ g_warning("Error in getting event size : tracefile %s, "
+ "unknown event id %hhu in core facility.",
+ g_quark_to_string(tf->name),
+ tf->event.event_id);
+ goto event_id_error;
+
+ }
+ goto no_offset; /* Skip the field computation */
+ } else {
g_warning("Unknown facility %hhu (0x%hhx) in tracefile %s",
tf->event.facility_id,
tf->event.facility_id,
g_quark_to_string(tf->name));
goto facility_error;
}
+ }
- LttEventType *event_type =
- ltt_facility_eventtype_get(f, tf->event.event_id);
-
- if(!event_type) {
- g_warning("Unknown event id %hhu in facility %s in tracefile %s",
- tf->event.event_id,
- g_quark_to_string(f->name),
- g_quark_to_string(tf->name));
- goto event_type_error;
- }
-
- /* Compute the dynamic offsets */
- compute_offsets(tf, f, event_type, &size, tf->event.data);
+ LttEventType *event_type =
+ ltt_facility_eventtype_get(f, tf->event.event_id);
- //g_debug("Event root field : f.e %hhu.%hhu size %zd",
- // tf->event.facility_id,
- // tf->event.event_id, size);
+ if(!event_type) {
+ g_warning("Unknown event id %hhu in facility %s in tracefile %s",
+ tf->event.event_id,
+ g_quark_to_string(f->name),
+ g_quark_to_string(tf->name));
+ goto event_type_error;
}
+ /* Compute the dynamic offsets */
+ compute_offsets(tf, f, event_type, &size, tf->event.data);
+
+ //g_debug("Event root field : f.e %hhu.%hhu size %zd",
+ // tf->event.facility_id,
+ // tf->event.event_id, size);
+
+no_offset:
tf->event.data_size = size;
/* Check consistency between kernel and LTTV structure sizes */
case LTT_FLOAT:
case LTT_ENUM:
/* Align offset on type size */
+ g_assert(field->field_size != 0);
return field->field_size;
break;
case LTT_STRING:
- return 0;
+ return 1;
break;
case LTT_ARRAY:
g_assert(type->fields->len == 1);
case LTT_SEQUENCE:
g_assert(type->fields->len == 2);
{
- off_t localign = 0;
+ off_t localign = 1;
LttField *child = &g_array_index(type->fields, LttField, 0);
localign = max(localign, get_alignment(child));
case LTT_UNION:
{
guint i;
- off_t localign = 0;
+ off_t localign = 1;
for(i=0; i<type->fields->len; i++) {
LttField *child = &g_array_index(type->fields, LttField, i);
case LTT_NONE:
default:
g_error("get_alignment : unknown type");
+ return -1;
}
-
}
/*****************************************************************************
size_t max_size;
switch(type->type_class) {
+ case LTT_INT_FIXED:
+ case LTT_UINT_FIXED:
+ case LTT_CHAR:
+ case LTT_UCHAR:
+ case LTT_SHORT:
+ case LTT_USHORT:
case LTT_INT:
case LTT_UINT:
case LTT_FLOAT:
field->fixed_size = FIELD_FIXED;
}
break;
+ case LTT_NONE:
+ g_error("unexpected type NONE");
+ break;
}
}
}
switch(type1->type_class) {
+ case LTT_INT_FIXED:
+ case LTT_UINT_FIXED:
+ case LTT_POINTER:
+ case LTT_CHAR:
+ case LTT_UCHAR:
+ case LTT_SHORT:
+ case LTT_USHORT:
case LTT_INT:
case LTT_UINT:
case LTT_FLOAT: