[PATCH Makedumpfile 03/10] Introduce read_vmcoreinfo_ulong()
Pratyush Anand
panand at redhat.com
Tue Oct 25 00:22:55 PDT 2016
Kernel may pass an unsigned number into vmcore. For example ARM64 passes:
vmcoreinfo_append_str("NUMBER(PHYS_OFFSET)=0x%llx\n", PHYS_OFFSET);
Therefore, introducing read_vmcoreinfo_ulong() to read such values
correctly.
Signed-off-by: Pratyush Anand <panand at redhat.com>
---
makedumpfile.c | 34 ++++++++++++++++++++++++++++++++++
makedumpfile.h | 16 ++++++++++++++++
2 files changed, 50 insertions(+)
diff --git a/makedumpfile.c b/makedumpfile.c
index b2ea3ebdd4cb..e248db876858 100644
--- a/makedumpfile.c
+++ b/makedumpfile.c
@@ -2412,6 +2412,40 @@ read_vmcoreinfo_symbol(char *str_symbol)
return symbol;
}
+unsigned long
+read_vmcoreinfo_ulong(char *str_structure)
+{
+ long data = NOT_FOUND_LONG_VALUE;
+ char buf[BUFSIZE_FGETS], *endp;
+ unsigned int i;
+
+ if (fseek(info->file_vmcoreinfo, 0, SEEK_SET) < 0) {
+ ERRMSG("Can't seek the vmcoreinfo file(%s). %s\n",
+ info->name_vmcoreinfo, strerror(errno));
+ return INVALID_STRUCTURE_DATA;
+ }
+
+ while (fgets(buf, BUFSIZE_FGETS, info->file_vmcoreinfo)) {
+ i = strlen(buf);
+ if (!i)
+ break;
+ if (buf[i - 1] == '\n')
+ buf[i - 1] = '\0';
+ if (strncmp(buf, str_structure, strlen(str_structure)) == 0) {
+ data = strtoul(buf + strlen(str_structure), &endp, 10);
+ if (strlen(endp) != 0)
+ data = strtoul(buf + strlen(str_structure), &endp, 16);
+ if ((data == LONG_MAX) || strlen(endp) != 0) {
+ ERRMSG("Invalid data in %s: %s",
+ info->name_vmcoreinfo, buf);
+ return INVALID_STRUCTURE_DATA;
+ }
+ break;
+ }
+ }
+ return data;
+}
+
long
read_vmcoreinfo_long(char *str_structure)
{
diff --git a/makedumpfile.h b/makedumpfile.h
index a5955ff750e5..c5e38a5b6e4b 100644
--- a/makedumpfile.h
+++ b/makedumpfile.h
@@ -393,6 +393,22 @@ do { \
return FALSE; \
} \
} while (0)
+#define WRITE_NUMBER_UNSIGNED(str_number, number) \
+do { \
+ if (NUMBER(number) != NOT_FOUND_NUMBER) { \
+ fprintf(info->file_vmcoreinfo, "%s%lu\n", \
+ STR_NUMBER(str_number), NUMBER(number)); \
+ } \
+} while (0)
+#define READ_NUMBER_UNSIGNED(str_number, number) \
+do { \
+ if (NUMBER(number) == NOT_FOUND_NUMBER) { \
+ NUMBER(number) = read_vmcoreinfo_ulong(STR_NUMBER(str_number)); \
+ if (NUMBER(number) == INVALID_STRUCTURE_DATA) \
+ return FALSE; \
+ } \
+} while (0)
+
/*
* for source file name
--
2.7.4
More information about the kexec
mailing list