[PATCH] makedumpfile: Add support to module data structures
Atsushi Kumagai
kumagai-atsushi at mxc.nes.nec.co.jp
Fri Feb 28 01:51:07 EST 2014
>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.
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
More information about the kexec
mailing list