[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 4/4] extract vmcoreinfo from /proc/vmcore for Xen
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@xxxxxxxxxxxxx> _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |