fix syscall table
[lttv.git] / ltt / branches / poly / lttv / lttv / state.c
index 6dd2663f10bd49d1fd51ad1bab614e3ca30b97ac..6aae5ad9e6658c7655d4a7f6e5b7f2824b67953c 100644 (file)
@@ -1355,7 +1355,9 @@ typedef struct _LttvNameTables {
   GQuark *trap_names;
   guint nb_traps;
   GQuark *irq_names;
+  guint nb_irqs;
   GQuark *soft_irq_names;
+  guint nb_softirqs;
 } LttvNameTables;
 
 
@@ -1413,6 +1415,12 @@ create_name_tables(LttvTraceState *tcs)
 
     for(i = 0 ; i < nb ; i++) {
       name_tables->syscall_names[i] = ltt_enum_string_get(t, i);
+      if(!name_tables->syscall_names[i]) {
+        GString *string = g_string_new("");
+        g_string_printf(string, "syscall %u", i);
+        name_tables->syscall_names[i] = g_quark_from_string(string->str);
+        g_string_free(string, TRUE);
+      }
     }
 
     //name_tables->syscall_names = g_new(GQuark, 256);
@@ -1474,12 +1482,14 @@ create_name_tables(LttvTraceState *tcs)
     }
     */
 
+    name_tables->nb_irqs = 256;
     name_tables->irq_names = g_new(GQuark, 256);
     for(i = 0 ; i < 256 ; i++) {
       g_string_printf(fe_name, "irq %d", i);
       name_tables->irq_names[i] = g_quark_from_string(fe_name->str);
     }
   } else {
+    name_tables->nb_irqs = 0;
     name_tables->irq_names = NULL;
   }
   /*
@@ -1489,6 +1499,7 @@ create_name_tables(LttvTraceState *tcs)
   }
   */
 
+  name_tables->nb_softirqs = 256;
   name_tables->soft_irq_names = g_new(GQuark, 256);
   for(i = 0 ; i < 256 ; i++) {
     g_string_printf(fe_name, "softirq %d", i);
@@ -1518,6 +1529,8 @@ get_name_tables(LttvTraceState *tcs)
   tcs->nb_traps = name_tables->nb_traps;
   tcs->irq_names = name_tables->irq_names;
   tcs->soft_irq_names = name_tables->soft_irq_names;
+  tcs->nb_irqs = name_tables->nb_irqs;
+  tcs->nb_softirqs = name_tables->nb_softirqs;
 }
 
 
@@ -1943,9 +1956,19 @@ static gboolean irq_entry(void *hook_data, void *call_data)
   LttField *f = thf->f1;
 
   LttvExecutionSubmode submode;
+  guint64 irq = ltt_event_get_unsigned(e, f);
+  guint64 nb_irqs = ((LttvTraceState *)(s->parent.t_context))->nb_irqs;
+  GString *string;
 
-  submode = ((LttvTraceState *)(s->parent.t_context))->irq_names[
-      ltt_event_get_unsigned(e, f)];
+  if(irq < nb_irqs) {
+    submode = ((LttvTraceState *)(s->parent.t_context))->irq_names[irq];
+  } else {
+    /* Fixup an incomplete irq table */
+    GString *string = g_string_new("");
+    g_string_printf(string, "irq %llu", irq);
+    submode = g_quark_from_string(string->str);
+    g_string_free(string, TRUE);
+  }
 
   /* Do something with the info about being in user or system mode when int? */
   push_state(s, LTTV_STATE_IRQ, submode);
@@ -1983,9 +2006,19 @@ static gboolean soft_irq_entry(void *hook_data, void *call_data)
   LttField *f = thf->f1;
 
   LttvExecutionSubmode submode;
+  guint64 softirq = ltt_event_get_unsigned(e, f);
+  guint64 nb_softirqs = ((LttvTraceState *)(s->parent.t_context))->nb_softirqs;
+  GString *string;
 
-  submode = ((LttvTraceState *)(s->parent.t_context))->soft_irq_names[
-      ltt_event_get_long_unsigned(e, f)];
+  if(softirq < nb_softirqs) {
+    submode = ((LttvTraceState *)(s->parent.t_context))->soft_irq_names[softirq];
+  } else {
+    /* Fixup an incomplete irq table */
+    GString *string = g_string_new("");
+    g_string_printf(string, "softirq %llu", softirq);
+    submode = g_quark_from_string(string->str);
+    g_string_free(string, TRUE);
+  }
 
   /* Do something with the info about being in user or system mode when int? */
   push_state(s, LTTV_STATE_SOFT_IRQ, submode);
@@ -2359,19 +2392,19 @@ static void fix_process(gpointer key, gpointer value,
   LttvTracefileContext *tfc = (LttvTracefileContext *)user_data;
   LttTime *timestamp = (LttTime*)user_data;
 
-printf("%s %s\n", g_quark_to_string(process->type), g_quark_to_string(process->state->t));
-
   if(process->type == LTTV_STATE_KERNEL_THREAD) {
-    if(process->state->t == LTTV_STATE_MODE_UNKNOWN) {
-      process->state->t = LTTV_STATE_SYSCALL;
-      process->state->s = LTTV_STATE_WAIT;
-      process->state->n = LTTV_STATE_SUBMODE_NONE;
+    es = &g_array_index(process->execution_stack, LttvExecutionState, 0);
+    if(es->t == LTTV_STATE_MODE_UNKNOWN) {
+      es->t = LTTV_STATE_SYSCALL;
+      es->s = LTTV_STATE_WAIT;
+      es->n = LTTV_STATE_SUBMODE_NONE;
+      es->entry = *timestamp;
+      es->change = *timestamp;
+      es->cum_cpu_time = ltt_time_zero;
     }
   } else {
-    if(process->state->t == LTTV_STATE_MODE_UNKNOWN) {
-      process->execution_stack = g_array_set_size(process->execution_stack, 2);
-      es = process->state = &g_array_index(process->execution_stack, 
-          LttvExecutionState, 0);
+    es = &g_array_index(process->execution_stack, LttvExecutionState, 0);
+    if(es->t == LTTV_STATE_MODE_UNKNOWN) {
       es->t = LTTV_STATE_USER_MODE;
       es->n = LTTV_STATE_SUBMODE_NONE;
       es->entry = *timestamp;
@@ -2380,15 +2413,20 @@ printf("%s %s\n", g_quark_to_string(process->type), g_quark_to_string(process->s
       es->cum_cpu_time = ltt_time_zero;
       es->s = LTTV_STATE_RUN;
 
-      es = process->state = &g_array_index(process->execution_stack, 
+      if(process->execution_stack->len == 1) {
+        /* Still in user mode, means never scheduled */
+        process->execution_stack =
+          g_array_set_size(process->execution_stack, 2);
+        es = process->state = &g_array_index(process->execution_stack, 
           LttvExecutionState, 1);
-      es->t = LTTV_STATE_SYSCALL;
-      es->n = LTTV_STATE_SUBMODE_NONE;
-      es->entry = *timestamp;
-      //g_assert(timestamp->tv_sec != 0);
-      es->change = *timestamp;
-      es->cum_cpu_time = ltt_time_zero;
-      es->s = LTTV_STATE_WAIT;
+        es->t = LTTV_STATE_SYSCALL;
+        es->n = LTTV_STATE_SUBMODE_NONE;
+        es->entry = *timestamp;
+        //g_assert(timestamp->tv_sec != 0);
+        es->change = *timestamp;
+        es->cum_cpu_time = ltt_time_zero;
+        es->s = LTTV_STATE_WAIT;
+      }
     }
   }
 }
This page took 0.031471 seconds and 4 git commands to generate.