fix usertrace
[lttv.git] / ltt / branches / poly / ltt / tracefile.c
index 224d3812871b1944634cd0e335bc0043ff546735..72eb3a6efc0a4af46bb0a21859b373666de68dc7 100644 (file)
@@ -232,7 +232,6 @@ int parse_trace_header(void *header, LttTracefile *tf, LttTrace *t)
     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;
   }
  
 
@@ -260,6 +259,8 @@ int parse_trace_header(void *header, LttTracefile *tf, LttTrace *t)
         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),
@@ -271,7 +272,9 @@ int parse_trace_header(void *header, LttTracefile *tf, LttTrace *t)
           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;
@@ -663,6 +666,7 @@ int get_tracefile_name_number(gchar *raw_name,
   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++) {
@@ -996,6 +1000,9 @@ static int ltt_get_facility_description(LttFacility *f,
                        case LTT_ARCH_TYPE_C2:
                                text = "_c2";
                                break;
+                       case LTT_ARCH_TYPE_POWERPC:
+                               text = "_powerpc";
+                               break;
                        default:
                                g_error("Trace from unsupported architecture.");
                }
@@ -1077,7 +1084,7 @@ static int ltt_process_facility_tracefile(LttTracefile *tf)
           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,
@@ -1090,8 +1097,8 @@ static int ltt_process_facility_tracefile(LttTracefile *tf)
           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),
@@ -1133,7 +1140,7 @@ static int ltt_process_facility_tracefile(LttTracefile *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,
@@ -1147,8 +1154,8 @@ static int ltt_process_facility_tracefile(LttTracefile *tf)
                           &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),
@@ -1997,71 +2004,73 @@ map_error:
 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 */
@@ -2227,10 +2236,11 @@ off_t get_alignment(LttField *field)
     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);
@@ -2242,7 +2252,7 @@ off_t get_alignment(LttField *field)
     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));
@@ -2257,7 +2267,7 @@ off_t get_alignment(LttField *field)
     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);
@@ -2269,8 +2279,8 @@ off_t get_alignment(LttField *field)
     case LTT_NONE:
     default:
       g_error("get_alignment : unknown type");
+      return -1;
   }
-
 }
 
 /*****************************************************************************
@@ -2613,6 +2623,12 @@ void preset_field_type_size(LttTracefile *tf, LttEventType *event_type,
   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:
@@ -2724,6 +2740,9 @@ void preset_field_type_size(LttTracefile *tf, LttEventType *event_type,
         field->fixed_size = FIELD_FIXED;
       }
       break;
+    case LTT_NONE:
+      g_error("unexpected type NONE");
+      break;
   }
 
 }
@@ -2891,6 +2910,13 @@ gint check_fields_compatibility(LttEventType *event_type1,
   }
     
   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:
This page took 0.053854 seconds and 4 git commands to generate.