All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 4/8] makedumpfile: Introduce routines to get type name from debuginfo.
@ 2011-05-17 20:03 Mahesh J Salgaonkar
  2011-08-01  1:27 ` Ken'ichi Ohmichi
  0 siblings, 1 reply; 4+ messages in thread
From: Mahesh J Salgaonkar @ 2011-05-17 20:03 UTC (permalink / raw)
  To: kexec, Ken'ichi Ohmichi
  Cc: V Srivatsa, Ananth N Mavinakayanahalli, Mahesh Salgaonkar,
	Dave Anderson, Prerna Saxena, Reinhard

From: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>

This patch implements following routines that returns type, type name and
size of kernel symbol/member using dwarf info:

	char *get_symbol_type_name();
	char *get_member_type_name();
	long get_pointer_size();

These routines will be used to resolve symbol/member information specified
through filter config commands.

Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Signed-off-by: Prerna Saxena <prerna@linux.vnet.ibm.com>
---

 makedumpfile.c |  142 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 makedumpfile.h |   13 +++++
 2 files changed, 148 insertions(+), 7 deletions(-)

diff --git a/makedumpfile.c b/makedumpfile.c
index 7601e3d..f7d37cc 100644
--- a/makedumpfile.c
+++ b/makedumpfile.c
@@ -30,6 +30,7 @@ struct module_sym_table	mod_st = { 0 };
 
 char filename_stdout[] = FILENAME_STDOUT;
 int message_level;
+long pointer_size;
 
 /*
  * Forward declarations
@@ -1822,6 +1823,41 @@ check_array_type(Dwarf *dwarfd, Dwarf_Die *die)
 	return TRUE;
 }
 
+static int
+get_dwarf_base_type(Dwarf *dwarfd, Dwarf_Die *die)
+{
+	int tag;
+	const char *name;
+
+	while (get_die_type(dwarfd, die, die)) {
+		tag = dwarf_tag(die);
+		switch (tag) {
+		case DW_TAG_array_type:
+			dwarf_info.type_flag |= TYPE_ARRAY;
+			break;
+		case DW_TAG_pointer_type:
+			dwarf_info.type_flag |= TYPE_PTR;
+			break;
+		case DW_TAG_structure_type:
+			dwarf_info.type_flag |= TYPE_STRUCT;
+			break;
+		case DW_TAG_base_type:
+			dwarf_info.type_flag |= TYPE_BASE;
+			break;
+		}
+	}
+
+	name = dwarf_diename(die);
+	if (name)
+		dwarf_info.type_name = strdup(name);
+	else if (dwarf_info.type_flag == TYPE_PTR)
+		dwarf_info.type_name = strdup("void");
+
+	dwarf_info.struct_size = dwarf_bytesize(die);
+
+	return TRUE;
+}
+
 /*
  * Function for searching struct page.union.struct.mapping.
  */
@@ -1902,6 +1938,15 @@ search_member(Dwarf *dwarfd, Dwarf_Die *die)
 			continue;
 
 		switch (dwarf_info.cmd) {
+		case DWARF_INFO_GET_MEMBER_TYPE:
+			if ((!name) || strcmp(name, dwarf_info.member_name))
+				continue;
+			/*
+			 * Get the member offset.
+			 */
+			if (!get_dwarf_base_type(dwarfd, walker))
+				continue;
+			return;
 		case DWARF_INFO_GET_MEMBER_OFFSET:
 			if ((!name) || strcmp(name, dwarf_info.member_name))
 				continue;
@@ -1964,6 +2009,7 @@ is_search_structure(int cmd)
 {
 	if ((cmd == DWARF_INFO_GET_STRUCT_SIZE)
 	    || (cmd == DWARF_INFO_GET_MEMBER_OFFSET)
+	    || (cmd == DWARF_INFO_GET_MEMBER_TYPE)
 	    || (cmd == DWARF_INFO_GET_MEMBER_OFFSET_IN_UNION)
 	    || (cmd == DWARF_INFO_GET_MEMBER_OFFSET_1ST_UNION)
 	    || (cmd == DWARF_INFO_GET_MEMBER_ARRAY_LENGTH))
@@ -1985,6 +2031,7 @@ int
 is_search_symbol(int cmd)
 {
 	if ((cmd == DWARF_INFO_GET_SYMBOL_ARRAY_LENGTH)
+	    || (cmd == DWARF_INFO_GET_SYMBOL_TYPE)
 	    || (cmd == DWARF_INFO_CHECK_SYMBOL_ARRAY_TYPE))
 		return TRUE;
 	else
@@ -2041,6 +2088,7 @@ search_structure(Dwarf *dwarfd, Dwarf_Die *die, int *found)
 	switch (dwarf_info.cmd) {
 	case DWARF_INFO_GET_STRUCT_SIZE:
 		break;
+	case DWARF_INFO_GET_MEMBER_TYPE:
 	case DWARF_INFO_GET_MEMBER_OFFSET:
 	case DWARF_INFO_GET_MEMBER_OFFSET_IN_UNION:
 	case DWARF_INFO_GET_MEMBER_OFFSET_1ST_UNION:
@@ -2173,6 +2221,9 @@ search_symbol(Dwarf *dwarfd, Dwarf_Die *die, int *found)
 	case DWARF_INFO_CHECK_SYMBOL_ARRAY_TYPE:
 		check_array_type(dwarfd, die);
 		break;
+	case DWARF_INFO_GET_SYMBOL_TYPE:
+		get_dwarf_base_type(dwarfd, die);
+		break;
 	}
 }
 
@@ -2249,6 +2300,10 @@ get_debug_info(void)
 	 */
 	while (dwarf_nextcu(dwarfd, off, &next_off, &header_size,
 	    &abbrev_offset, &address_size, &offset_size) == 0) {
+		if (dwarf_info.cmd == DWARF_INFO_GET_PTR_SIZE) {
+			dwarf_info.struct_size = address_size;
+			break;
+		}
 		off += header_size;
 		if (dwarf_offdie(dwarfd, off, &cu_die) == NULL) {
 			ERRMSG("Can't get CU die.\n");
@@ -2287,6 +2342,47 @@ get_structure_size(char *structname, int flag_typedef)
 }
 
 /*
+ * Get the size of pointer.
+ */
+long
+get_pointer_size()
+{
+	dwarf_info.cmd = DWARF_INFO_GET_PTR_SIZE;
+	/* reuse struct_size member to report pointer size */
+	dwarf_info.struct_size = NOT_FOUND_STRUCTURE;
+
+	if (!get_debug_info())
+		return FAILED_DWARFINFO;
+
+	return dwarf_info.struct_size;
+}
+
+/*
+ * Get the type of given symbol.
+ */
+char *
+get_symbol_type_name(char *symname, int cmd, long *size,
+					unsigned long *flag)
+{
+	dwarf_info.cmd = cmd;
+	dwarf_info.symbol_name = symname;
+	dwarf_info.type_name = NULL;
+	dwarf_info.struct_size = NOT_FOUND_STRUCTURE;
+	dwarf_info.type_flag = 0;
+
+	if (!get_debug_info())
+		return NULL;
+
+	if (size)
+		*size = dwarf_info.struct_size;
+
+	if (flag)
+		*flag = dwarf_info.type_flag;
+
+	return dwarf_info.type_name;
+}
+
+/*
  * Get the offset of member.
  */
 long
@@ -2305,6 +2401,35 @@ get_member_offset(char *structname, char *membername, int cmd)
 }
 
 /*
+ * Get the type name and size of member.
+ */
+char *
+get_member_type_name(char *structname, char *membername, int cmd, long *size,
+						unsigned long *flag)
+{
+	dwarf_info.cmd = cmd;
+	dwarf_info.struct_name = structname;
+	dwarf_info.struct_size = NOT_FOUND_STRUCTURE;
+	dwarf_info.member_name = membername;
+	dwarf_info.type_name = NULL;
+	dwarf_info.type_flag = 0;
+
+	if (!get_debug_info())
+		return NULL;
+
+	if (dwarf_info.struct_size == NOT_FOUND_STRUCTURE)
+		return NULL;
+
+	if (size)
+		*size = dwarf_info.struct_size;
+
+	if (flag)
+		*flag = dwarf_info.type_flag;
+
+	return dwarf_info.type_name;
+}
+
+/*
  * Get the length of array.
  */
 long
@@ -2402,6 +2527,8 @@ get_symbol_info(void)
 	if (SYMBOL(node_memblk) != NOT_FOUND_SYMBOL)
 		SYMBOL_ARRAY_LENGTH_INIT(node_memblk, "node_memblk");
 
+	pointer_size = get_pointer_size();
+
 	return TRUE;
 }
 
@@ -7519,13 +7646,16 @@ load_module_symbols(void)
 		for (nsym = 1; nsym < num_symtab; nsym++) {
 			Elf32_Sym *sym32;
 			Elf64_Sym *sym64;
-			/*
-			 * We can not depend on info->flag_elf64_memory if
-			 * the input vmcore file is kdump-compressed format.
-			 * We will fix this in the next patch and remove the
-			 * dependancy on info->flag_elf64_memory.
+			/* If case of ELF vmcore then the word size can be
+			 * determined using info->flag_elf64_memory flag.
+			 * But in case of kdump-compressed dump, kdump header
+			 * does not carry word size info. May be in future
+			 * this info will be available in kdump header.
+			 * Until then, in order to make this logic work on both
+			 * situation we depend on pointer_size that is
+			 * extracted from vmlinux dwarf information.
 			 */
-			if (info->flag_elf64_memory) {
+			if ((pointer_size * 8) == 64) {
 				sym64 = (Elf64_Sym *) (symtab_mem
 						+ (nsym * sizeof(Elf64_Sym)));
 				sym_info[nsym].value =
diff --git a/makedumpfile.h b/makedumpfile.h
index 8ad1287..62c7ff5 100644
--- a/makedumpfile.h
+++ b/makedumpfile.h
@@ -1242,7 +1242,10 @@ enum {
 	DWARF_INFO_GET_TYPEDEF_SIZE,
 	DWARF_INFO_GET_TYPEDEF_SRCNAME,
 	DWARF_INFO_GET_ENUM_NUMBER,
-	DWARF_INFO_CHECK_SYMBOL_ARRAY_TYPE
+	DWARF_INFO_CHECK_SYMBOL_ARRAY_TYPE,
+	DWARF_INFO_GET_SYMBOL_TYPE,
+	DWARF_INFO_GET_MEMBER_TYPE,
+	DWARF_INFO_GET_PTR_SIZE,
 };
 
 struct dwarf_info {
@@ -1257,13 +1260,21 @@ struct dwarf_info {
 	Elf	*elfd;			/* OUT */
 	Dwarf	*dwarfd;		/* OUT */
 	Dwfl	*dwfl;			/* OUT */
+	char	*type_name;		/* OUT */
 	long	struct_size;		/* OUT */
 	long	member_offset;		/* OUT */
 	long	array_length;		/* OUT */
 	long	enum_number;		/* OUT */
+	unsigned char	type_flag;	/* OUT */
 	char	src_name[LEN_SRCFILE];	/* OUT */
 };
 
+/* flags for dwarf_info.type_flag */
+#define TYPE_BASE	0x01
+#define TYPE_ARRAY	0x02
+#define TYPE_PTR	0x04
+#define TYPE_STRUCT	0x08
+
 extern struct dwarf_info	dwarf_info;
 
 int readmem(int type_addr, unsigned long long addr, void *bufptr, size_t size);


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v2 4/8] makedumpfile: Introduce routines to get type name from debuginfo.
  2011-05-17 20:03 [PATCH v2 4/8] makedumpfile: Introduce routines to get type name from debuginfo Mahesh J Salgaonkar
@ 2011-08-01  1:27 ` Ken'ichi Ohmichi
  2011-08-04  6:43   ` Mahesh Jagannath Salgaonkar
  0 siblings, 1 reply; 4+ messages in thread
From: Ken'ichi Ohmichi @ 2011-08-01  1:27 UTC (permalink / raw)
  To: Mahesh J Salgaonkar
  Cc: V Srivatsa, Ananth N Mavinakayanahalli, kexec, Dave Anderson,
	Prerna Saxena, Reinhard


Hi Mahesh,

A pointer size can been gotton by sizeof(void *), and pointer (virtual 
address) can been defined as "unsigned long".
I think we can make this patch simple. How about the attached patch ?


Thanks
Ken'ichi Ohmichi

diff --git a/makedumpfile.c b/makedumpfile.c
index 3ad2bd5..6955f64 100644
--- a/makedumpfile.c
+++ b/makedumpfile.c
@@ -34,7 +34,6 @@ struct erase_info	*erase_info = NULL;
 unsigned long		num_erase_info = 1; /* Node 0 is unused. */
 
 char filename_stdout[] = FILENAME_STDOUT;
-long pointer_size;
 char config_buf[BUFSIZE_FGETS];
 
 /*
@@ -2058,10 +2057,6 @@ get_debug_info(void)
 	 */
 	while (dwarf_nextcu(dwarfd, off, &next_off, &header_size,
 	    &abbrev_offset, &address_size, &offset_size) == 0) {
-		if (dwarf_info.cmd == DWARF_INFO_GET_PTR_SIZE) {
-			dwarf_info.struct_size = address_size;
-			break;
-		}
 		off += header_size;
 		if (dwarf_offdie(dwarfd, off, &cu_die) == NULL) {
 			ERRMSG("Can't get CU die.\n");
@@ -2105,14 +2100,7 @@ get_structure_size(char *structname, int flag_typedef)
 long
 get_pointer_size()
 {
-	dwarf_info.cmd = DWARF_INFO_GET_PTR_SIZE;
-	/* reuse struct_size member to report pointer size */
-	dwarf_info.struct_size = NOT_FOUND_STRUCTURE;
-
-	if (!get_debug_info())
-		return FAILED_DWARFINFO;
-
-	return dwarf_info.struct_size;
+	return sizeof(void *);
 }
 
 /*
@@ -2285,8 +2273,6 @@ get_symbol_info(void)
 	if (SYMBOL(node_memblk) != NOT_FOUND_SYMBOL)
 		SYMBOL_ARRAY_LENGTH_INIT(node_memblk, "node_memblk");
 
-	pointer_size = get_pointer_size();
-
 	return TRUE;
 }
 
@@ -7782,7 +7768,7 @@ load_module_symbols(void)
 			 * situation we depend on pointer_size that is
 			 * extracted from vmlinux dwarf information.
 			 */
-			if ((pointer_size * 8) == 64) {
+			if ((get_pointer_size() * 8) == 64) {
 				sym64 = (Elf64_Sym *) (symtab_mem
 						+ (nsym * sizeof(Elf64_Sym)));
 				sym_info[nsym].value =
@@ -7863,8 +7849,8 @@ print_config_entry(struct config_entry *ce)
 		DEBUG_MSG("Type Name: %s, ", ce->type_name);
 		DEBUG_MSG("flag: %x, ", ce->flag);
 		DEBUG_MSG("Type flag: %lx, ", ce->type_flag);
-		DEBUG_MSG("sym_addr: %llx, ", ce->sym_addr);
-		DEBUG_MSG("addr: %llx, ", ce->addr);
+		DEBUG_MSG("sym_addr: %lx, ", ce->sym_addr);
+		DEBUG_MSG("addr: %lx, ", ce->addr);
 		DEBUG_MSG("offset: %lx, ", ce->offset);
 		DEBUG_MSG("size: %zd\n", ce->size);
 
@@ -8399,29 +8385,16 @@ err_out:
 	return NULL;
 }
 
-static unsigned long long
+static unsigned long
 read_pointer_value(unsigned long long addr)
 {
-	uint32_t val_32;
-	uint64_t val_64;
+	unsigned long val;
 
-	switch (pointer_size) {
-	case 4:
-		if (!readmem(VADDR, addr, &val_32, sizeof(val_32))) {
-			ERRMSG("Can't read pointer value\n");
-			return 0;
-		}
-		return (unsigned long long)val_32;
-		break;
-	case 8:
-		if (!readmem(VADDR, addr, &val_64, sizeof(val_64))) {
-			ERRMSG("Can't read pointer value\n");
-			return 0;
-		}
-		return (unsigned long long)val_64;
-		break;
+	if (!readmem(VADDR, addr, &val, sizeof(val))) {
+		ERRMSG("Can't read pointer value\n");
+		return 0;
 	}
-	return 0;
+	return val;
 }
 
 int
@@ -8621,7 +8594,7 @@ get_config_symbol_addr(struct config_entry *ce,
 			unsigned long long base_addr,
 			char *base_struct_name)
 {
-	unsigned long long addr = 0;
+	unsigned long addr = 0;
 
 	if (!(ce->flag & ENTRY_RESOLVED)) {
 		if (!resolve_config_entry(ce, base_addr, base_struct_name))
@@ -8646,7 +8619,7 @@ get_config_symbol_addr(struct config_entry *ce,
 				 */
 				while (ce->index < ce->array_length) {
 					addr = read_pointer_value(ce->addr +
-						(ce->index * pointer_size));
+						(ce->index * get_pointer_size()));
 					ce->index++;
 					if (addr)
 						break;
@@ -8728,7 +8701,7 @@ get_config_symbol_size(struct config_entry *ce,
 	else {
 		if (ce->type_flag & TYPE_ARRAY) {
 			if (ce->type_flag & TYPE_PTR)
-				return ce->array_length * pointer_size;
+				return ce->array_length * get_pointer_size();
 			else
 				return ce->array_length * ce->size;
 		}
@@ -8909,7 +8882,7 @@ update_filter_info(struct config_entry *filter_symbol,
 		return FALSE;
 
 	if (filter_symbol->nullify)
-		size = pointer_size;
+		size = get_pointer_size();
 	else if (size_symbol) {
 		size = get_config_symbol_size(size_symbol, 0, NULL);
 		if (message_level & ML_PRINT_DEBUG_MSG)
diff --git a/makedumpfile.h b/makedumpfile.h
index 8c69235..80816b6 100644
--- a/makedumpfile.h
+++ b/makedumpfile.h
@@ -1218,7 +1218,6 @@ enum {
 	DWARF_INFO_CHECK_SYMBOL_ARRAY_TYPE,
 	DWARF_INFO_GET_SYMBOL_TYPE,
 	DWARF_INFO_GET_MEMBER_TYPE,
-	DWARF_INFO_GET_PTR_SIZE,
 };
 
 struct dwarf_info {
@@ -1284,7 +1283,7 @@ struct config_entry {
 	unsigned short		flag;
 	unsigned short		nullify;
 	unsigned long long	sym_addr;	/* Symbol address */
-	unsigned long long	addr;		/* Symbol address or
+	unsigned long		addr;		/* Symbol address or
 						   value pointed by sym_addr */
 	unsigned long long	cmp_addr;	/* for LIST_ENTRY */
 	unsigned long		offset;


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v2 4/8] makedumpfile: Introduce routines to get type name from debuginfo.
  2011-08-01  1:27 ` Ken'ichi Ohmichi
@ 2011-08-04  6:43   ` Mahesh Jagannath Salgaonkar
  2011-08-05  0:26     ` Ken'ichi Ohmichi
  0 siblings, 1 reply; 4+ messages in thread
From: Mahesh Jagannath Salgaonkar @ 2011-08-04  6:43 UTC (permalink / raw)
  To: Ken'ichi Ohmichi
  Cc: V Srivatsa, Ananth N Mavinakayanahalli, kexec, Dave Anderson,
	Prerna Saxena, Reinhard

Hi Ken'ichi,

On 08/01/2011 06:57 AM, Ken'ichi Ohmichi wrote:
> 
> Hi Mahesh,
> 
> A pointer size can been gotton by sizeof(void *), and pointer (virtual 
> address) can been defined as "unsigned long".
> I think we can make this patch simple. How about the attached patch ?
> 

Yup, the patch looks simpler and good.

> 
> Thanks
> Ken'ichi Ohmichi
> 
> diff --git a/makedumpfile.c b/makedumpfile.c
> index 3ad2bd5..6955f64 100644
> --- a/makedumpfile.c
> +++ b/makedumpfile.c
> @@ -34,7 +34,6 @@ struct erase_info	*erase_info = NULL;
>  unsigned long		num_erase_info = 1; /* Node 0 is unused. */
> 
>  char filename_stdout[] = FILENAME_STDOUT;
> -long pointer_size;
>  char config_buf[BUFSIZE_FGETS];
> 
>  /*
> @@ -2058,10 +2057,6 @@ get_debug_info(void)
>  	 */
>  	while (dwarf_nextcu(dwarfd, off, &next_off, &header_size,
>  	    &abbrev_offset, &address_size, &offset_size) == 0) {
> -		if (dwarf_info.cmd == DWARF_INFO_GET_PTR_SIZE) {
> -			dwarf_info.struct_size = address_size;
> -			break;
> -		}
>  		off += header_size;
>  		if (dwarf_offdie(dwarfd, off, &cu_die) == NULL) {
>  			ERRMSG("Can't get CU die.\n");

[...]

> @@ -7863,8 +7849,8 @@ print_config_entry(struct config_entry *ce)
>  		DEBUG_MSG("Type Name: %s, ", ce->type_name);
>  		DEBUG_MSG("flag: %x, ", ce->flag);
>  		DEBUG_MSG("Type flag: %lx, ", ce->type_flag);
> -		DEBUG_MSG("sym_addr: %llx, ", ce->sym_addr);
> -		DEBUG_MSG("addr: %llx, ", ce->addr);
> +		DEBUG_MSG("sym_addr: %lx, ", ce->sym_addr);

Above change throws compilation warning. The sym_addr is unsigned long
long, %llx still holds good.

> +		DEBUG_MSG("addr: %lx, ", ce->addr);
>  		DEBUG_MSG("offset: %lx, ", ce->offset);
>  		DEBUG_MSG("size: %zd\n", ce->size);
> 

[...]

> @@ -1284,7 +1283,7 @@ struct config_entry {
>  	unsigned short		flag;
>  	unsigned short		nullify;
>  	unsigned long long	sym_addr;	/* Symbol address */
> -	unsigned long long	addr;		/* Symbol address or
> +	unsigned long		addr;		/* Symbol address or
>  						   value pointed by sym_addr */
>  	unsigned long long	cmp_addr;	/* for LIST_ENTRY */
>  	unsigned long		offset;
> 

I tested this patch and works fine.

Thanks,
-Mahesh.

_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v2 4/8] makedumpfile: Introduce routines to get type name from debuginfo.
  2011-08-04  6:43   ` Mahesh Jagannath Salgaonkar
@ 2011-08-05  0:26     ` Ken'ichi Ohmichi
  0 siblings, 0 replies; 4+ messages in thread
From: Ken'ichi Ohmichi @ 2011-08-05  0:26 UTC (permalink / raw)
  To: Mahesh Jagannath Salgaonkar
  Cc: V Srivatsa, Ananth N Mavinakayanahalli, kexec, Dave Anderson,
	Prerna Saxena, Reinhard


Hi Mahesh,

Thank you for your review and test.

On Thu, 04 Aug 2011 12:13:22 +0530
Mahesh Jagannath Salgaonkar <mahesh@linux.vnet.ibm.com> wrote:
> 
> On 08/01/2011 06:57 AM, Ken'ichi Ohmichi wrote:
> > 
> > Hi Mahesh,
> > 
> > A pointer size can been gotton by sizeof(void *), and pointer (virtual 
> > address) can been defined as "unsigned long".
> > I think we can make this patch simple. How about the attached patch ?
> > 
> 
> Yup, the patch looks simpler and good.
> 
> > 
> > Thanks
> > Ken'ichi Ohmichi
> > 
> > diff --git a/makedumpfile.c b/makedumpfile.c
> > index 3ad2bd5..6955f64 100644
> > --- a/makedumpfile.c
> > +++ b/makedumpfile.c
> > @@ -34,7 +34,6 @@ struct erase_info	*erase_info = NULL;
> >  unsigned long		num_erase_info = 1; /* Node 0 is unused. */
> > 
> >  char filename_stdout[] = FILENAME_STDOUT;
> > -long pointer_size;
> >  char config_buf[BUFSIZE_FGETS];
> > 
> >  /*
> > @@ -2058,10 +2057,6 @@ get_debug_info(void)
> >  	 */
> >  	while (dwarf_nextcu(dwarfd, off, &next_off, &header_size,
> >  	    &abbrev_offset, &address_size, &offset_size) == 0) {
> > -		if (dwarf_info.cmd == DWARF_INFO_GET_PTR_SIZE) {
> > -			dwarf_info.struct_size = address_size;
> > -			break;
> > -		}
> >  		off += header_size;
> >  		if (dwarf_offdie(dwarfd, off, &cu_die) == NULL) {
> >  			ERRMSG("Can't get CU die.\n");
> 
> [...]
> 
> > @@ -7863,8 +7849,8 @@ print_config_entry(struct config_entry *ce)
> >  		DEBUG_MSG("Type Name: %s, ", ce->type_name);
> >  		DEBUG_MSG("flag: %x, ", ce->flag);
> >  		DEBUG_MSG("Type flag: %lx, ", ce->type_flag);
> > -		DEBUG_MSG("sym_addr: %llx, ", ce->sym_addr);
> > -		DEBUG_MSG("addr: %llx, ", ce->addr);
> > +		DEBUG_MSG("sym_addr: %lx, ", ce->sym_addr);
> 
> Above change throws compilation warning. The sym_addr is unsigned long
> long, %llx still holds good.

Nice catch, I fixed the above.


> > +		DEBUG_MSG("addr: %lx, ", ce->addr);
> >  		DEBUG_MSG("offset: %lx, ", ce->offset);
> >  		DEBUG_MSG("size: %zd\n", ce->size);
> > 
> 
> [...]
> 
> > @@ -1284,7 +1283,7 @@ struct config_entry {
> >  	unsigned short		flag;
> >  	unsigned short		nullify;
> >  	unsigned long long	sym_addr;	/* Symbol address */
> > -	unsigned long long	addr;		/* Symbol address or
> > +	unsigned long		addr;		/* Symbol address or
> >  						   value pointed by sym_addr */
> >  	unsigned long long	cmp_addr;	/* for LIST_ENTRY */
> >  	unsigned long		offset;
> > 
> 
> I tested this patch and works fine.

Thank you.
I have merged this patch.


Thanks
Ken'ichi Ohmichi

_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2011-08-05  1:17 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-05-17 20:03 [PATCH v2 4/8] makedumpfile: Introduce routines to get type name from debuginfo Mahesh J Salgaonkar
2011-08-01  1:27 ` Ken'ichi Ohmichi
2011-08-04  6:43   ` Mahesh Jagannath Salgaonkar
2011-08-05  0:26     ` Ken'ichi Ohmichi

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.