X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Flttv%2Fstate.c;h=9201c81803d947a924e72da46b47b1a771d0c87c;hb=5e96e7e38fc3a40f0d9076c7ca8f369ad8c91d8c;hp=05ea74f1d866993b9f7dd02a2d17c3a422aed4d4;hpb=d86395c3cc6f958bcb2aca5063e83e2fe4194f6a;p=lttv.git diff --git a/ltt/branches/poly/lttv/lttv/state.c b/ltt/branches/poly/lttv/lttv/state.c index 05ea74f1..9201c818 100644 --- a/ltt/branches/poly/lttv/lttv/state.c +++ b/ltt/branches/poly/lttv/lttv/state.c @@ -826,8 +826,9 @@ free_max_time(LttvTraceState *tcs) typedef struct _LttvNameTables { // FIXME GQuark *eventtype_names; GQuark *syscall_names; - guint nb_syscalls; + guint nb_syscalls; GQuark *trap_names; + guint nb_traps; GQuark *irq_names; GQuark *soft_irq_names; } LttvNameTables; @@ -918,7 +919,7 @@ create_name_tables(LttvTraceState *tcs) ltt_enum_string_get(t, i)); } */ - + name_tables->nb_traps = 256; name_tables->trap_names = g_new(GQuark, 256); for(i = 0 ; i < 256 ; i++) { g_string_printf(fe_name, "trap %d", i); @@ -926,6 +927,7 @@ create_name_tables(LttvTraceState *tcs) } } else { name_tables->trap_names = NULL; + name_tables->nb_traps = 0; } if(!lttv_trace_find_hook(tcs->parent.t, @@ -988,6 +990,7 @@ get_name_tables(LttvTraceState *tcs) tcs->syscall_names = name_tables->syscall_names; tcs->nb_syscalls = name_tables->nb_syscalls; tcs->trap_names = name_tables->trap_names; + tcs->nb_traps = name_tables->nb_traps; tcs->irq_names = name_tables->irq_names; tcs->soft_irq_names = name_tables->soft_irq_names; } @@ -1359,8 +1362,19 @@ static gboolean trap_entry(void *hook_data, void *call_data) LttvExecutionSubmode submode; - submode = ((LttvTraceState *)(s->parent.t_context))->trap_names[ - ltt_event_get_unsigned(e, f)]; + guint nb_traps = ((LttvTraceState *)(s->parent.t_context))->nb_traps; + guint trap = ltt_event_get_unsigned(e, f); + + if(trap < nb_traps) { + submode = ((LttvTraceState *)(s->parent.t_context))->trap_names[trap]; + } else { + /* Fixup an incomplete trap table */ + GString *string = g_string_new(""); + g_string_printf(string, "trap %u", trap); + submode = g_quark_from_string(string->str); + g_string_free(string, TRUE); + } + push_state(s, LTTV_STATE_TRAP, submode); return FALSE; }