static kdump_status do_noarch_note(kdump_ctx *ctx, Elf32_Word type, const char *name, size_t namesz, void *desc, size_t descsz) { if (note_equal("VMCOREINFO", name, namesz)) return set_vmcoreinfo(ctx, GKI_linux_vmcoreinfo_raw, desc, descsz, "VMCOREINFO"); else if (note_equal("VMCOREINFO_XEN", name, namesz)) return set_vmcoreinfo(ctx, GKI_xen_vmcoreinfo_raw, desc, descsz, "VMCOREINFO_XEN"); return kdump_ok; }
static int get_pt_note_info(void) { int n_type, size_name, size_desc; off_t offset, offset_desc; char buf[VMCOREINFO_XEN_NOTE_NAME_BYTES]; char note[MAX_SIZE_NHDR]; nr_cpus = 0; offset = offset_pt_note_memory; while (offset < offset_pt_note_memory + size_pt_note_memory) { if (lseek(fd_memory, offset, SEEK_SET) < 0) { ERRMSG("Can't seek the dump memory(%s). %s\n", name_memory, strerror(errno)); return FALSE; } if (read(fd_memory, note, sizeof(note)) != sizeof(note)) { ERRMSG("Can't read the dump memory(%s). %s\n", name_memory, strerror(errno)); return FALSE; } n_type = note_type(note); size_name = note_namesz(note); size_desc = note_descsz(note); offset_desc = offset + offset_note_desc(note); if (!size_name || size_name >= sizeof(buf)) goto next_note; if (read(fd_memory, &buf, sizeof(buf)) != sizeof(buf)) { ERRMSG("Can't read the dump memory(%s). %s\n", name_memory, strerror(errno)); return FALSE; } if (!strncmp(KEXEC_CORE_NOTE_NAME, buf, KEXEC_CORE_NOTE_NAME_BYTES)) { if (n_type == NT_PRSTATUS) { nr_cpus++; } } else if (!strncmp(VMCOREINFO_NOTE_NAME, buf, VMCOREINFO_NOTE_NAME_BYTES)) { if (n_type == 0) { set_vmcoreinfo(offset_desc, size_desc); } /* * Check whether /proc/vmcore contains vmcoreinfo, * and get both the offset and the size. */ } else if (!strncmp(VMCOREINFO_XEN_NOTE_NAME, buf, VMCOREINFO_XEN_NOTE_NAME_BYTES)) { if (n_type == 0) { offset_vmcoreinfo_xen = offset_desc; size_vmcoreinfo_xen = size_desc; } /* * Check whether /proc/vmcore contains xen's note. */ } else if (!strncmp("Xen", buf, 4)) { if (n_type == XEN_ELFNOTE_CRASH_INFO) { flags_memory |= MEMORY_XEN; offset_xen_crash_info = offset_desc; size_xen_crash_info = size_desc; } /* * Check whether a source dumpfile contains eraseinfo. * /proc/vmcore does not contain eraseinfo, because eraseinfo * is added only by makedumpfile and makedumpfile does not * create /proc/vmcore. */ } else if (!strncmp(ERASEINFO_NOTE_NAME, buf, ERASEINFO_NOTE_NAME_BYTES)) { if (n_type == 0) { set_eraseinfo(offset_desc, size_desc); } } next_note: offset += offset_next_note(note); } if (is_xen_memory()) DEBUG_MSG("Xen kdump\n"); else DEBUG_MSG("Linux kdump\n"); return TRUE; }