Hi Don, Thanks for looking into this issue -- queued for crash-7.0.8: https://github.com/crash-utility/crash/commit/77537c1273ebdbc23fe73e7a881ef50c467f8b2a I'll contact you off-list re: getting me copies of your sample vmcores. Thanks, Dave ----- Original Message ----- > This enables crash to handle xen dumps that are larger then 4G > in size in 32bit mode. > > Signed-off-by: Don Slutz <dslutz@xxxxxxxxxxx> > --- > This is the same as was sent as an attachment. Just a clean top post. > > x86.c | 10 ++++----- > x86_64.c | 10 ++++----- > xendump.c | 74 > +++++++++++++++++++++++++++++++++------------------------------ > xendump.h | 6 +++--- > 4 files changed, 52 insertions(+), 48 deletions(-) > > diff --git a/x86.c b/x86.c > index 833a11b..608bb88 100644 > --- a/x86.c > +++ b/x86.c > @@ -4897,7 +4897,7 @@ x86_xendump_p2m_create(struct xendump_data *xd) > "MEMBER_OFFSET(vcpu_guest_context, ctrlreg): %ld\n", > ctrlreg_offset); > > - offset = (off_t)xd->xc_core.header.xch_ctxt_offset + > + offset = xd->xc_core.header.xch_ctxt_offset + > (off_t)ctrlreg_offset; > > if (lseek(xd->xfd, offset, SEEK_SET) == -1) > @@ -4997,7 +4997,7 @@ x86_pvops_xendump_p2m_create(struct xendump_data *xd) > "MEMBER_OFFSET(vcpu_guest_context, ctrlreg): %ld\n", > ctrlreg_offset); > > - offset = (off_t)xd->xc_core.header.xch_ctxt_offset + > + offset = xd->xc_core.header.xch_ctxt_offset + > (off_t)ctrlreg_offset; > > if (lseek(xd->xfd, offset, SEEK_SET) == -1) > @@ -5369,7 +5369,7 @@ x86_xendump_panic_task(struct xendump_data *xd) > INVALID_MEMBER(cpu_user_regs_esp)) > return NO_TASK; > > - offset = (off_t)xd->xc_core.header.xch_ctxt_offset + > + offset = xd->xc_core.header.xch_ctxt_offset + > (off_t)OFFSET(vcpu_guest_context_user_regs) + > (off_t)OFFSET(cpu_user_regs_esp); > > @@ -5419,7 +5419,7 @@ x86_get_xendump_regs(struct xendump_data *xd, struct > bt_info *bt, ulong *eip, ul > INVALID_MEMBER(cpu_user_regs_esp)) > goto generic; > > - offset = (off_t)xd->xc_core.header.xch_ctxt_offset + > + offset = xd->xc_core.header.xch_ctxt_offset + > (off_t)OFFSET(vcpu_guest_context_user_regs) + > (off_t)OFFSET(cpu_user_regs_esp); > if (lseek(xd->xfd, offset, SEEK_SET) == -1) > @@ -5427,7 +5427,7 @@ x86_get_xendump_regs(struct xendump_data *xd, struct > bt_info *bt, ulong *eip, ul > if (read(xd->xfd, &xesp, sizeof(ulong)) != sizeof(ulong)) > goto generic; > > - offset = (off_t)xd->xc_core.header.xch_ctxt_offset + > + offset = xd->xc_core.header.xch_ctxt_offset + > (off_t)OFFSET(vcpu_guest_context_user_regs) + > (off_t)OFFSET(cpu_user_regs_eip); > if (lseek(xd->xfd, offset, SEEK_SET) == -1) > diff --git a/x86_64.c b/x86_64.c > index f4a3e8b..a2e4636 100644 > --- a/x86_64.c > +++ b/x86_64.c > @@ -6184,7 +6184,7 @@ x86_64_xendump_p2m_create(struct xendump_data *xd) > "MEMBER_OFFSET(vcpu_guest_context, ctrlreg): %ld\n", > ctrlreg_offset); > > - offset = (off_t)xd->xc_core.header.xch_ctxt_offset + > + offset = xd->xc_core.header.xch_ctxt_offset + > (off_t)ctrlreg_offset; > > if (lseek(xd->xfd, offset, SEEK_SET) == -1) > @@ -6270,7 +6270,7 @@ x86_64_pvops_xendump_p2m_create(struct xendump_data > *xd) > "MEMBER_OFFSET(vcpu_guest_context, ctrlreg): %ld\n", > ctrlreg_offset); > > - offset = (off_t)xd->xc_core.header.xch_ctxt_offset + > + offset = xd->xc_core.header.xch_ctxt_offset + > (off_t)ctrlreg_offset; > > if (lseek(xd->xfd, offset, SEEK_SET) == -1) > @@ -6601,7 +6601,7 @@ x86_64_xendump_panic_task(struct xendump_data *xd) > INVALID_MEMBER(cpu_user_regs_esp)) > return NO_TASK; > > - offset = (off_t)xd->xc_core.header.xch_ctxt_offset + > + offset = xd->xc_core.header.xch_ctxt_offset + > (off_t)OFFSET(vcpu_guest_context_user_regs) + > (off_t)OFFSET(cpu_user_regs_rsp); > > @@ -6653,7 +6653,7 @@ x86_64_get_xendump_regs(struct xendump_data *xd, struct > bt_info *bt, ulong *rip, > INVALID_MEMBER(cpu_user_regs_rsp)) > goto generic; > > - offset = (off_t)xd->xc_core.header.xch_ctxt_offset + > + offset = xd->xc_core.header.xch_ctxt_offset + > (off_t)OFFSET(vcpu_guest_context_user_regs) + > (off_t)OFFSET(cpu_user_regs_rsp); > if (lseek(xd->xfd, offset, SEEK_SET) == -1) > @@ -6661,7 +6661,7 @@ x86_64_get_xendump_regs(struct xendump_data *xd, struct > bt_info *bt, ulong *rip, > if (read(xd->xfd, &xrsp, sizeof(ulong)) != sizeof(ulong)) > goto generic; > > - offset = (off_t)xd->xc_core.header.xch_ctxt_offset + > + offset = xd->xc_core.header.xch_ctxt_offset + > (off_t)OFFSET(vcpu_guest_context_user_regs) + > (off_t)OFFSET(cpu_user_regs_rip); > if (lseek(xd->xfd, offset, SEEK_SET) == -1) > diff --git a/xendump.c b/xendump.c > index 6d6b51e..9d78916 100644 > --- a/xendump.c > +++ b/xendump.c > @@ -126,9 +126,9 @@ xc_core_verify(char *file, char *buf) > xd->xc_core.header.xch_magic = xcp->xch_magic; > xd->xc_core.header.xch_nr_vcpus = xcp->xch_nr_vcpus; > xd->xc_core.header.xch_nr_pages = xcp->xch_nr_pages; > - xd->xc_core.header.xch_ctxt_offset = (ulong)xcp->xch_ctxt_offset; > - xd->xc_core.header.xch_index_offset = (ulong)xcp->xch_index_offset; > - xd->xc_core.header.xch_pages_offset = (ulong)xcp->xch_pages_offset; > + xd->xc_core.header.xch_ctxt_offset = (off_t)xcp->xch_ctxt_offset; > + xd->xc_core.header.xch_index_offset = (off_t)xcp->xch_index_offset; > + xd->xc_core.header.xch_pages_offset = (off_t)xcp->xch_pages_offset; > > xd->flags |= (XENDUMP_LOCAL | XC_CORE_ORIG | XC_CORE_P2M_CREATE); > > @@ -187,7 +187,7 @@ xc_core_read(void *bufptr, int cnt, ulong addr, > physaddr_t paddr) > PFN_NOT_FOUND) > return READ_ERROR; > > - offset = (off_t)xd->xc_core.header.xch_pages_offset + > + offset = xd->xc_core.header.xch_pages_offset + > ((off_t)(page_index) * (off_t)xd->page_size); > > if (lseek(xd->xfd, offset, SEEK_SET) == -1) > @@ -852,7 +852,7 @@ read_xendump_hyper(int fd, void *bufptr, int cnt, ulong > addr, physaddr_t paddr) > if ((page_index = xc_core_mfn_to_page_index(pfn)) == PFN_NOT_FOUND) > return READ_ERROR; > > - offset = (off_t)xd->xc_core.header.xch_pages_offset + > + offset = xd->xc_core.header.xch_pages_offset + > ((off_t)(page_index) * (off_t)xd->page_size); > > if (lseek(xd->xfd, offset, SEEK_SET) == -1) > @@ -1040,15 +1040,15 @@ xendump_memory_dump(FILE *fp) > fprintf(fp, " xch_nr_pages: %d (0x%x)\n", > xd->xc_core.header.xch_nr_pages, > xd->xc_core.header.xch_nr_pages); > - fprintf(fp, " xch_ctxt_offset: %ld (0x%lx)\n", > - xd->xc_core.header.xch_ctxt_offset, > - xd->xc_core.header.xch_ctxt_offset); > - fprintf(fp, " xch_index_offset: %ld (0x%lx)\n", > - xd->xc_core.header.xch_index_offset, > - xd->xc_core.header.xch_index_offset); > - fprintf(fp, " xch_pages_offset: %ld (0x%lx)\n", > - xd->xc_core.header.xch_pages_offset, > - xd->xc_core.header.xch_pages_offset); > + fprintf(fp, " xch_ctxt_offset: %llu (0x%llx)\n", > + (ulonglong)xd->xc_core.header.xch_ctxt_offset, > + (ulonglong)xd->xc_core.header.xch_ctxt_offset); > + fprintf(fp, " xch_index_offset: %llu (0x%llx)\n", > + (ulonglong)xd->xc_core.header.xch_index_offset, > + (ulonglong)xd->xc_core.header.xch_index_offset); > + fprintf(fp, " xch_pages_offset: %llu (0x%llx)\n", > + (ulonglong)xd->xc_core.header.xch_pages_offset, > + (ulonglong)xd->xc_core.header.xch_pages_offset); > > fprintf(fp, " elf_class: %s\n", xd->xc_core.elf_class == > ELFCLASS64 ? "ELFCLASS64" : > xd->xc_core.elf_class == ELFCLASS32 ? "ELFCLASS32" : "n/a"); > @@ -1285,7 +1285,7 @@ xc_core_mfn_to_page(ulong mfn, char *pgbuf) > if (xd->flags & XC_CORE_ELF) > return xc_core_elf_mfn_to_page(mfn, pgbuf); > > - if (lseek(xd->xfd, (off_t)xd->xc_core.header.xch_index_offset, > + if (lseek(xd->xfd, xd->xc_core.header.xch_index_offset, > SEEK_SET) == -1) { > error(INFO, "cannot lseek to page index\n"); > return NULL; > @@ -1325,7 +1325,7 @@ xc_core_mfn_to_page(ulong mfn, char *pgbuf) > return NULL; > } > > - if (lseek(xd->xfd, (off_t)xd->xc_core.header.xch_pages_offset, > + if (lseek(xd->xfd, xd->xc_core.header.xch_pages_offset, > SEEK_SET) == -1) { > error(INFO, "cannot lseek to xch_pages_offset\n"); > return NULL; > @@ -1400,7 +1400,7 @@ xc_core_elf_mfn_to_page(ulong mfn, char *pgbuf) > return NULL; > } > > - if (lseek(xd->xfd, (off_t)xd->xc_core.header.xch_pages_offset, > + if (lseek(xd->xfd, xd->xc_core.header.xch_pages_offset, > SEEK_SET) == -1) > error(FATAL, "cannot lseek to xch_pages_offset\n"); > > @@ -1434,7 +1434,7 @@ xc_core_mfn_to_page_index(ulong mfn) > if (xd->flags & XC_CORE_ELF) > return xc_core_elf_mfn_to_page_index(mfn); > > - if (lseek(xd->xfd, (off_t)xd->xc_core.header.xch_index_offset, > + if (lseek(xd->xfd, xd->xc_core.header.xch_index_offset, > SEEK_SET) == -1) { > error(INFO, "cannot lseek to page index\n"); > return MFN_NOT_FOUND; > @@ -1527,7 +1527,7 @@ xc_core_mfns(ulong arg, FILE *ofp) > ulonglong tmp64[MAX_BATCH_SIZE]; > size_t size; > > - if (lseek(xd->xfd, (off_t)xd->xc_core.header.xch_index_offset, > + if (lseek(xd->xfd, xd->xc_core.header.xch_index_offset, > SEEK_SET) == -1) { > error(INFO, "cannot lseek to page index\n"); > return FALSE; > @@ -1677,7 +1677,7 @@ xc_core_pfn_to_page_index(ulong pfn) > > p2m_idx = xd->xc_core.p2m_frame_index_list[idx]; > > - if (lseek(xd->xfd, (off_t)xd->xc_core.header.xch_pages_offset, > + if (lseek(xd->xfd, xd->xc_core.header.xch_pages_offset, > SEEK_SET) == -1) { > error(INFO, "cannot lseek to xch_pages_offset\n"); > return PFN_NOT_FOUND; > @@ -1801,7 +1801,7 @@ xc_core_pfn_valid(ulong pfn) > if (pfn >= (ulong)xd->xc_core.header.xch_nr_pages) > return FALSE; > > - offset = (off_t)xd->xc_core.header.xch_index_offset; > + offset = xd->xc_core.header.xch_index_offset; > > if (xd->flags & XC_CORE_64BIT_HOST) > offset += (off_t)(pfn * sizeof(ulonglong)); > @@ -2542,25 +2542,27 @@ xc_core_dump_Elf32_Shdr(Elf32_Off offset, int store) > return; > > if (STREQ(name, ".xen_prstatus")) > - xd->xc_core.header.xch_ctxt_offset = > - (unsigned long)shdr.sh_offset; > + xd->xc_core.header.xch_ctxt_offset = > + (off_t)shdr.sh_offset; > > if (STREQ(name, ".xen_shared_info")) > xd->xc_core.shared_info_offset = (off_t)shdr.sh_offset; > > if (STREQ(name, ".xen_pfn")) { > - xd->xc_core.header.xch_index_offset = shdr.sh_offset; > + xd->xc_core.header.xch_index_offset = > + (off_t)shdr.sh_offset; > xd->flags |= (XC_CORE_NO_P2M|XC_CORE_PFN_CREATE); > } > > if (STREQ(name, ".xen_p2m")) { > - xd->xc_core.header.xch_index_offset = shdr.sh_offset; > + xd->xc_core.header.xch_index_offset = > + (off_t)shdr.sh_offset; > xd->flags |= XC_CORE_P2M_CREATE; > } > > if (STREQ(name, ".xen_pages")) > - xd->xc_core.header.xch_pages_offset = > - (unsigned long)shdr.sh_offset; > + xd->xc_core.header.xch_pages_offset = > + (off_t)shdr.sh_offset; > > if (STREQ(name, ".xen_ia64_mapped_regs")) > xd->xc_core.ia64_mapped_regs_offset = > @@ -2642,25 +2644,27 @@ xc_core_dump_Elf64_Shdr(Elf64_Off offset, int store) > return; > > if (STREQ(name, ".xen_prstatus")) > - xd->xc_core.header.xch_ctxt_offset = > - (unsigned long)shdr.sh_offset; > + xd->xc_core.header.xch_ctxt_offset = > + (off_t)shdr.sh_offset; > > if (STREQ(name, ".xen_shared_info")) > xd->xc_core.shared_info_offset = (off_t)shdr.sh_offset; > > if (STREQ(name, ".xen_pfn")) { > - xd->xc_core.header.xch_index_offset = shdr.sh_offset; > + xd->xc_core.header.xch_index_offset = > + (off_t)shdr.sh_offset; > xd->flags |= (XC_CORE_NO_P2M|XC_CORE_PFN_CREATE); > } > > if (STREQ(name, ".xen_p2m")) { > - xd->xc_core.header.xch_index_offset = shdr.sh_offset; > + xd->xc_core.header.xch_index_offset = > + (off_t)shdr.sh_offset; > xd->flags |= XC_CORE_P2M_CREATE; > } > > if (STREQ(name, ".xen_pages")) > - xd->xc_core.header.xch_pages_offset = > - (unsigned long)shdr.sh_offset; > + xd->xc_core.header.xch_pages_offset = > + (off_t)shdr.sh_offset; > > if (STREQ(name, ".xen_ia64_mapped_regs")) > xd->xc_core.ia64_mapped_regs_offset = > @@ -2814,7 +2818,7 @@ xc_core_elf_pfn_init(void) > chunk = xd->xc_core.header.xch_nr_pages/INDEX_PFN_COUNT; > > for (i = c = 0; i < INDEX_PFN_COUNT; i++, c += chunk) { > - offset = (off_t)xd->xc_core.header.xch_index_offset + > + offset = xd->xc_core.header.xch_index_offset + > (off_t)(c * sizeof(uint64_t)); > > if (lseek(xd->xfd, offset, SEEK_SET) == -1) > @@ -2834,7 +2838,7 @@ xc_core_elf_pfn_init(void) > chunk = xd->xc_core.header.xch_nr_pages/INDEX_PFN_COUNT; > > for (i = c = 0; i < INDEX_PFN_COUNT; i++, c += chunk) { > - offset = (off_t)xd->xc_core.header.xch_index_offset + > + offset = xd->xc_core.header.xch_index_offset + > (off_t)(c * sizeof(struct xen_dumpcore_p2m)); > > if (lseek(xd->xfd, offset, SEEK_SET) == -1) > diff --git a/xendump.h b/xendump.h > index 9ece4da..17aae37 100644 > --- a/xendump.h > +++ b/xendump.h > @@ -42,9 +42,9 @@ struct xen_core_header { > unsigned int xch_magic; > unsigned int xch_nr_vcpus; > unsigned int xch_nr_pages; > - unsigned long xch_ctxt_offset; > - unsigned long xch_index_offset; > - unsigned long xch_pages_offset; > + off_t xch_ctxt_offset; > + off_t xch_index_offset; > + off_t xch_pages_offset; > }; > > struct pfn_offset_cache { > -- > 1.8.4 > > -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility