On Friday 28 February 2014 12:21 PM, Atsushi Kumagai wrote: >> diff --git a/dwarf_info.c b/dwarf_info.c >> index 6e21b8a..268e922 100644 >> --- a/dwarf_info.c >> +++ b/dwarf_info.c >> @@ -489,7 +489,6 @@ get_die_from_offset(Dwarf_Off offset, Dwarf_Die *die) >> return FALSE; >> >> if (!dwarf_offdie(dwarf_info.dwarfd, offset, die)) { >> - ERRMSG("Can't find the DIE.\n"); >> return FALSE; >> } >> >> @@ -1343,14 +1342,12 @@ get_die_nfields(unsigned long long die_off) >> Dwarf_Die result, child, *die; >> >> if (!get_die_from_offset((Dwarf_Off) die_off, &result)) { >> - ERRMSG("Can't find the DIE.\n"); >> return -1; >> } >> >> die = &result; >> tag = dwarf_tag(die); >> if (tag != DW_TAG_structure_type && tag != DW_TAG_union_type) { >> - ERRMSG("DIE is not of structure or union type.\n"); >> clean_dwfl_info(); >> return -1; >> } >> @@ -1388,14 +1385,12 @@ get_die_member(unsigned long long die_off, int index, long *offset, >> return -1; >> >> if (!get_die_from_offset((Dwarf_Off) die_off, &result)) { >> - ERRMSG("Can't find the DIE.\n"); >> return -1; >> } >> >> die = &result; >> tag = dwarf_tag(die); >> if (tag != DW_TAG_structure_type && tag != DW_TAG_union_type) { >> - ERRMSG("DIE is not of structure or union type.\n"); >> clean_dwfl_info(); >> return -1; >> } >> @@ -1471,7 +1466,6 @@ get_die_attr_type(unsigned long long die_off, int *type_flag, >> return FALSE; >> >> if (!get_die_from_offset((Dwarf_Off) die_off, &result)) { >> - ERRMSG("Can't find the DIE.\n"); >> return FALSE; >> } >> >> @@ -1509,7 +1503,6 @@ get_die_name(unsigned long long die_off) >> return NULL; >> >> if (!get_die_from_offset((Dwarf_Off) die_off, &result)) { >> - ERRMSG("Can't find the DIE.\n"); >> return NULL; >> } >> >> @@ -1554,7 +1547,6 @@ get_die_length(unsigned long long die_off, int flag) >> return FALSE; >> >> if (!get_die_from_offset((Dwarf_Off) die_off, &result)) { >> - ERRMSG("Can't find the DIE.\n"); >> return FALSE; >> } > Why did you remove these error messages ? > This change looks unrelated to the subject, you should at least > do it separately. It was throwing unnecessary messages when a particular die is not found in a module. Since this patch takes care of setting the debug info to the right module , removed the error messages here. Regards, Aruna > > Thanks > Atsushi Kumagai > >> diff --git a/erase_info.c b/erase_info.c >> index a789389..e0e0f71 100644 >> --- a/erase_info.c >> +++ b/erase_info.c >> @@ -34,7 +34,7 @@ struct call_back eppic_cb = { >> &get_die_offset, >> &get_die_length, >> &get_die_member_all, >> - &get_die_nfields, >> + &get_die_nfields_all, >> &get_symbol_addr_all, >> &update_filter_info_raw >> }; >> @@ -2028,6 +2028,84 @@ get_domain_all(char *symname, int cmd, unsigned long long *die) { >> } >> >> /* >> + * Search for die in modules as well as vmlinux >> + */ >> +int >> +get_die_nfields_all(unsigned long long die_off) >> +{ >> + short vmlinux_searched = 0; >> + long nfields = -1; >> + unsigned int i, current_mod; >> + struct module_info *modules; >> + >> + /* Search in vmlinux if debuginfo is set to vmlinux */ >> + if (!strcmp(get_dwarf_module_name(), "vmlinux")) { >> + nfields = get_die_nfields(die_off); >> + if (nfields > 0) >> + return nfields; >> + >> + vmlinux_searched = 1; >> + } >> + >> + /* >> + * Proceed the search in modules. Try in the module >> + * which resulted in a hit in the previous search >> + */ >> + >> + modules = mod_st.modules; >> + current_mod = mod_st.current_mod; >> + >> + if (strcmp(get_dwarf_module_name(), modules[current_mod].name)) { >> + if (!set_dwarf_debuginfo(modules[current_mod].name, >> + info->system_utsname.release, NULL, -1)) { >> + ERRMSG("Cannot set to current module %s\n", >> + modules[current_mod].name); >> + return -1; >> + } >> + } >> + >> + nfields = get_die_nfields(die_off); >> + if (nfields > 0) >> + return nfields; >> + >> + /* Search in all modules */ >> + for (i = 0; i < mod_st.num_modules; i++) { >> + >> + /* Already searched. Skip */ >> + if (i == current_mod) >> + continue; >> + >> + if (!set_dwarf_debuginfo(modules[i].name, >> + info->system_utsname.release, NULL, -1)) { >> + ERRMSG("Skipping Module section %s\n", modules[i].name); >> + continue; >> + } >> + >> + nfields = get_die_nfields(die_off); >> + >> + if (nfields < 0) >> + continue; >> + >> + /* >> + * Die found. Set the current_mod to this module index, >> + * a minor optimization for fast lookup next time >> + */ >> + mod_st.current_mod = i; >> + return nfields; >> + } >> + >> + /* Die not found in any module. Set debuginfo back to vmlinux */ >> + set_dwarf_debuginfo("vmlinux", NULL, info->name_vmlinux, >> + info->fd_vmlinux); >> + >> + if (!vmlinux_searched) >> + return get_die_nfields(die_off); >> + else >> + return -1; >> + >> +} >> + >> +/* >> * Search for die member in modules as well as vmlinux >> */ >> int >> diff --git a/erase_info.h b/erase_info.h >> index a90fac0..4d4957e 100644 >> --- a/erase_info.h >> +++ b/erase_info.h >> @@ -35,6 +35,7 @@ unsigned long long get_symbol_addr_all(char *); >> long get_domain_all(char *, int, unsigned long long *); >> int get_die_member_all(unsigned long long die_off, int index, long *offset, >> char **name, int *nbits, int *fbits, unsigned long long *m_die); >> +int get_die_nfields_all(unsigned long long die_off); >> >> struct call_back { >> long (*get_domain_all)(char *, int, unsigned long long *); >> @@ -48,7 +49,7 @@ struct call_back { >> int (*get_die_member_all)(unsigned long long die_off, int index, >> long *offset, char **name, int *nbits, int *fbits, >> unsigned long long *m_die); >> - int (*get_die_nfields)(unsigned long long die_off); >> + int (*get_die_nfields_all)(unsigned long long die_off); >> unsigned long long (*get_symbol_addr_all)(char *symname); >> int (*update_filter_info_raw)(unsigned long long, int, int); >> }; >> diff --git a/extension_eppic.c b/extension_eppic.c >> index 7e045c9..bb36d5a 100644 >> --- a/extension_eppic.c >> +++ b/extension_eppic.c >> @@ -219,7 +219,7 @@ apimember(char *mname, ull idx, type_t *tm, member_t *m, ull *last_index) >> ull m_die, die_off = idx; >> char *name = NULL; >> >> - nfields = GET_DIE_NFIELDS(die_off); >> + nfields = GET_DIE_NFIELDS_ALL(die_off); >> /* >> * GET_DIE_NFIELDS() returns < 0 if the die is not structure type >> * or union type >> diff --git a/extension_eppic.h b/extension_eppic.h >> index 42437f2..24189ba 100644 >> --- a/extension_eppic.h >> +++ b/extension_eppic.h >> @@ -88,7 +88,7 @@ struct call_back *cb; >> #define GET_DIE_OFFSET cb->get_die_offset >> #define GET_DIE_LENGTH cb->get_die_length >> #define GET_DIE_MEMBER_ALL cb->get_die_member_all >> -#define GET_DIE_NFIELDS cb->get_die_nfields >> +#define GET_DIE_NFIELDS_ALL cb->get_die_nfields_all >> #define GET_SYMBOL_ADDR_ALL cb->get_symbol_addr_all >> #define UPDATE_FILTER_INFO_RAW cb->update_filter_info_raw >> >> >> >> _______________________________________________ >> kexec mailing list >> kexec at lists.infradead.org >> http://lists.infradead.org/mailman/listinfo/kexec