[PATCH 4/4] extract vmcoreinfo from /proc/vmcore for Xen
Itsuro ODA
oda at valinux.co.jp
Mon Mar 31 00:26:19 EDT 2008
This patch is for makedumpfile-1.2.4.
--- makedumpfile.c.org 2008-03-25 13:35:03.000000000 +0900
+++ makedumpfile.c 2008-03-27 11:32:03.000000000 +0900
@@ -2389,7 +2389,7 @@
off_t offset, off_note;
int flag_elf64;
unsigned long sz_note;
- char buf[VMCOREINFO_NOTE_NAME_BYTES];
+ char buf[VMCOREINFO_XEN_NOTE_NAME_BYTES];
Elf64_Nhdr note64;
Elf32_Nhdr note32;
@@ -2430,30 +2430,40 @@
info->name_memory, strerror(errno));
return FALSE;
}
- if (strncmp(VMCOREINFO_NOTE_NAME, buf,
+ if (!strncmp(VMCOREINFO_XEN_NOTE_NAME, buf,
+ VMCOREINFO_XEN_NOTE_NAME_BYTES)) { /* must be first */
+ if (flag_elf64) {
+ info->offset_vmcoreinfo_xen = offset + (sizeof(note64)
+ + ((note64.n_namesz + 3) & ~3));
+ info->size_vmcoreinfo_xen = note64.n_descsz;
+ } else {
+ info->offset_vmcoreinfo_xen = offset + (sizeof(note32)
+ + ((note32.n_namesz + 3) & ~3));
+ info->size_vmcoreinfo_xen = note32.n_descsz;
+ }
+ (*flag_found) |= VMCOREINFO_XEN;
+ } else if (!strncmp(VMCOREINFO_NOTE_NAME, buf,
VMCOREINFO_NOTE_NAME_BYTES)) {
if (flag_elf64) {
- offset += sizeof(Elf64_Nhdr)
- + ((note64.n_namesz + 3) & ~3)
- + ((note64.n_descsz + 3) & ~3);
+ info->offset_vmcoreinfo = offset + (sizeof(note64)
+ + ((note64.n_namesz + 3) & ~3));
+ info->size_vmcoreinfo = note64.n_descsz;
} else {
- offset += sizeof(Elf32_Nhdr)
- + ((note32.n_namesz + 3) & ~3)
- + ((note32.n_descsz + 3) & ~3);
+ info->offset_vmcoreinfo = offset + (sizeof(note32)
+ + ((note32.n_namesz + 3) & ~3));
+ info->size_vmcoreinfo = note32.n_descsz;
}
- continue;
+ (*flag_found) |= VMCOREINFO_LINUX;
}
if (flag_elf64) {
- info->offset_vmcoreinfo = offset + (sizeof(note64)
- + ((note64.n_namesz + 3) & ~3));
- info->size_vmcoreinfo = note64.n_descsz;
+ offset += sizeof(Elf64_Nhdr)
+ + ((note64.n_namesz + 3) & ~3)
+ + ((note64.n_descsz + 3) & ~3);
} else {
- info->offset_vmcoreinfo = offset + (sizeof(note32)
- + ((note32.n_namesz + 3) & ~3));
- info->size_vmcoreinfo = note32.n_descsz;
+ offset += sizeof(Elf32_Nhdr)
+ + ((note32.n_namesz + 3) & ~3)
+ + ((note32.n_descsz + 3) & ~3);
}
- (*flag_found) = TRUE;
- break;
}
return TRUE;
}
@@ -2501,6 +2511,46 @@
return TRUE;
}
+int
+copy_vmcoreinfo_xen()
+{
+ int fd;
+ char buf[VMCOREINFO_BYTES];
+ const off_t failed = (off_t)-1;
+
+ if (!info->offset_vmcoreinfo_xen || !info->size_vmcoreinfo_xen)
+ return FALSE;
+
+ if ((fd = mkstemp(info->name_vmcoreinfo)) < 0) {
+ ERRMSG("Can't open the vmcoreinfo file(%s). %s\n",
+ info->name_vmcoreinfo, strerror(errno));
+ return FALSE;
+ }
+ if (lseek(info->fd_memory, info->offset_vmcoreinfo_xen, SEEK_SET)
+ == failed) {
+ ERRMSG("Can't seek the dump memory(%s). %s\n",
+ info->name_memory, strerror(errno));
+ return FALSE;
+ }
+ if (read(info->fd_memory, &buf, info->size_vmcoreinfo_xen)
+ != info->size_vmcoreinfo_xen) {
+ ERRMSG("Can't read the dump memory(%s). %s\n",
+ info->name_memory, strerror(errno));
+ return FALSE;
+ }
+ if (write(fd, &buf, info->size_vmcoreinfo_xen) != info->size_vmcoreinfo_xen) {
+ ERRMSG("Can't write the vmcoreinfo file(%s). %s\n",
+ info->name_vmcoreinfo, strerror(errno));
+ return FALSE;
+ }
+ if (close(fd) < 0) {
+ ERRMSG("Can't close the vmcoreinfo file(%s). %s\n",
+ info->name_vmcoreinfo, strerror(errno));
+ return FALSE;
+ }
+ return TRUE;
+}
+
/*
* Get the number of online nodes.
*/
@@ -3182,8 +3232,6 @@
int
initial()
{
- int vmcoreinfo_in_vmcore = FALSE;
-
if (!get_elf_info())
return FALSE;
@@ -3208,48 +3256,8 @@
if (!get_srcfile_info())
return FALSE;
- /*
- * Get the debug information for analysis from /proc/vmcore
- */
- } else {
- /*
- * Check whether /proc/vmcore contains vmcoreinfo,
- * and get both the offset and the size.
- */
- if (!is_vmcoreinfo_in_vmcore(&vmcoreinfo_in_vmcore))
- return FALSE;
-
- if (!vmcoreinfo_in_vmcore) {
- if (info->dump_level <= DL_EXCLUDE_ZERO)
- goto out;
-
- MSG("%s doesn't contain vmcoreinfo.\n",
- info->name_memory);
- MSG("'-x' or '-i' must be specified.\n");
- return FALSE;
- }
- /*
- * Copy vmcoreinfo to /tmp/vmcoreinfoXXXXXX.
- */
- if ((info->name_vmcoreinfo
- = malloc(sizeof(FILENAME_VMCOREINFO))) == NULL) {
- ERRMSG("Can't allocate memory for the name(%s). %s\n",
- FILENAME_VMCOREINFO, strerror(errno));
- return FALSE;
- }
- strcpy(info->name_vmcoreinfo, FILENAME_VMCOREINFO);
- if (!copy_vmcoreinfo())
- return FALSE;
- /*
- * Read vmcoreinfo from /tmp/vmcoreinfoXXXXXX.
- */
- if (!open_vmcoreinfo("r"))
- return FALSE;
- if (!read_vmcoreinfo())
- return FALSE;
- unlink(info->name_vmcoreinfo);
}
-out:
+
if (info->dump_level <= DL_EXCLUDE_ZERO) {
if (!get_mem_map_without_mm())
return FALSE;
@@ -5880,6 +5888,7 @@
main(int argc, char *argv[])
{
int opt, flag_debug = FALSE;
+ int vmcoreinfo_in_vmcore = FALSE;
if ((info = calloc(1, sizeof(struct DumpInfo))) == NULL) {
ERRMSG("Can't allocate memory for the pagedesc cache. %s.\n",
@@ -6043,6 +6052,39 @@
print_usage();
goto out;
}
+ if (!info->flag_vmlinux && !info->flag_read_vmcoreinfo
+ && !info->flag_rearrange) {
+ if (!open_dump_memory())
+ goto out;
+ if (!is_vmcoreinfo_in_vmcore(&vmcoreinfo_in_vmcore))
+ goto out;
+ if (!vmcoreinfo_in_vmcore && info->dump_level > DL_EXCLUDE_ZERO) {
+ MSG("%s doesn't contain vmcoreinfo.\n",
+ info->name_memory);
+ MSG("'-x' or '-i' must be specified.\n");
+ goto out;
+ }
+ /*
+ * Copy vmcoreinfo to /tmp/vmcoreinfoXXXXXX.
+ */
+ if ((info->name_vmcoreinfo
+ = malloc(sizeof(FILENAME_VMCOREINFO))) == NULL) {
+ ERRMSG("Can't allocate memory for the name(%s). %s\n",
+ FILENAME_VMCOREINFO, strerror(errno));
+ goto out;
+ }
+ strcpy(info->name_vmcoreinfo, FILENAME_VMCOREINFO);
+ if (vmcoreinfo_in_vmcore & VMCOREINFO_XEN) {
+ info->flag_xen = 1;
+ if (!copy_vmcoreinfo_xen())
+ goto out;
+ } else {
+ if (!copy_vmcoreinfo())
+ goto out;
+ }
+ info->flag_read_vmcoreinfo = 1;
+ close_dump_memory();
+ }
}
if (elf_version(EV_CURRENT) == EV_NONE ) {
@@ -6081,7 +6123,8 @@
goto out;
}
info->dump_level |= DL_EXCLUDE_XEN;
- return handle_xen();
+ retcd = handle_xen();
+ goto out;
} else if (info->flag_rearrange) {
if (!open_files_for_rearranging_dumpdata())
@@ -6155,6 +6198,9 @@
free(info->mem_map_data);
if (info->dump_header != NULL)
free(info->dump_header);
+ if (vmcoreinfo_in_vmcore && info->name_vmcoreinfo) {
+ unlink(info->name_vmcoreinfo);
+ }
if (info != NULL)
free(info);
--- makedumpfile.h.org 2008-03-25 13:35:19.000000000 +0900
+++ makedumpfile.h 2008-03-25 14:29:33.000000000 +0900
@@ -430,7 +430,11 @@
#define VMCOREINFO_BYTES (4096)
#define VMCOREINFO_NOTE_NAME "VMCOREINFO"
#define VMCOREINFO_NOTE_NAME_BYTES (sizeof(VMCOREINFO_NOTE_NAME))
+#define VMCOREINFO_XEN_NOTE_NAME "VMCOREINFO_XEN"
+#define VMCOREINFO_XEN_NOTE_NAME_BYTES (sizeof(VMCOREINFO_XEN_NOTE_NAME))
#define FILENAME_VMCOREINFO "/tmp/vmcoreinfoXXXXXX"
+#define VMCOREINFO_LINUX (0x01)
+#define VMCOREINFO_XEN (0x02)
/*
* field name of vmcoreinfo file
@@ -762,6 +766,8 @@
*/
off_t offset_vmcoreinfo;
unsigned long size_vmcoreinfo;
+ off_t offset_vmcoreinfo_xen;
+ unsigned long size_vmcoreinfo_xen;
/*
* for Xen extraction
--
Itsuro ODA <oda at valinux.co.jp>
More information about the kexec
mailing list