Hello community, here is the log from the commit of package makedumpfile for openSUSE:Factory checked in at 2019-02-17 12:18:52 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/makedumpfile (Old) and /work/SRC/openSUSE:Factory/.makedumpfile.new.28833 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "makedumpfile" Sun Feb 17 12:18:52 2019 rev:72 rq:676211 version:1.6.5 Changes: -------- --- /work/SRC/openSUSE:Factory/makedumpfile/makedumpfile.changes 2019-01-26 22:20:24.662953052 +0100 +++ /work/SRC/openSUSE:Factory/.makedumpfile.new.28833/makedumpfile.changes 2019-02-17 12:18:57.828239750 +0100 @@ -1,0 +2,13 @@ +Thu Feb 14 17:41:26 UTC 2019 - ptesa...@suse.com + +- makedumpfile-ppc64-VA-range-SUSE.patch: Use correct l3 index size + with SLE15-SP1 ppc64le kernels (bsc#1123015). + +------------------------------------------------------------------- +Thu Feb 14 12:24:55 UTC 2019 - ptesa...@suse.com + +- Update to 1.6.5 + * Improve support for arm64 system with KASLR + * Support kernels up to 4.19.4 + +------------------------------------------------------------------- Old: ---- makedumpfile-1.6.4.tar.gz New: ---- makedumpfile-1.6.5.tar.gz makedumpfile-ppc64-VA-range-SUSE.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ makedumpfile.spec ++++++ --- /var/tmp/diff_new_pack.38gYYh/_old 2019-02-17 12:18:58.468239575 +0100 +++ /var/tmp/diff_new_pack.38gYYh/_new 2019-02-17 12:18:58.472239573 +0100 @@ -32,7 +32,7 @@ # End of compatibility cruft Name: makedumpfile -Version: 1.6.4 +Version: 1.6.5 Release: 0 Summary: Partial kernel dump License: GPL-2.0-only @@ -42,6 +42,7 @@ Source99: %{name}-rpmlintrc Patch0: %{name}-coptflags.diff Patch1: %{name}-override-libtinfo.patch +Patch2: %{name}-ppc64-VA-range-SUSE.patch BuildRequires: libdw-devel BuildRequires: libebl-devel BuildRequires: libelf-devel @@ -71,6 +72,7 @@ %setup -q %patch0 -p1 %patch1 -p1 +%patch2 -p1 %build %if %{have_snappy} ++++++ makedumpfile-1.6.4.tar.gz -> makedumpfile-1.6.5.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/makedumpfile-1.6.4/Makefile new/makedumpfile-1.6.5/Makefile --- old/makedumpfile-1.6.4/Makefile 2018-07-03 20:52:46.000000000 +0200 +++ new/makedumpfile-1.6.5/Makefile 2018-12-04 21:21:52.000000000 +0100 @@ -1,7 +1,7 @@ # makedumpfile -VERSION=1.6.4 -DATE=3 Jul 2018 +VERSION=1.6.5 +DATE=5 Dec 2018 # Honour the environment variable CC ifeq ($(strip $CC),) @@ -68,6 +68,18 @@ LIBS := -lpthread $(LIBS) +try-run = $(shell set -e; \ + TMP=".$$$$.tmp"; \ + if ($(1)) >/dev/null 2>&1; \ + then echo "$(2)"; \ + else echo "$(3)"; \ + fi; \ + rm -f "$$TMP") + +LINK_TEST_PROG="int clock_gettime(); int main(){ return clock_gettime(); }" +LIBS := $(LIBS) $(call try-run,\ + echo $(LINK_TEST_PROG) | $(CC) $(CFLAGS) -o "$$TMP" -x c -,,-lrt) + all: makedumpfile $(OBJ_PART): $(SRC_PART) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/makedumpfile-1.6.4/README new/makedumpfile-1.6.5/README --- old/makedumpfile-1.6.4/README 2018-07-03 20:52:46.000000000 +0200 +++ new/makedumpfile-1.6.5/README 2018-12-04 21:21:52.000000000 +0100 @@ -125,6 +125,8 @@ 4.15 | OK | ** | | | | ** | | -- | OK | OK | | | 4.16 | OK | ** | | | | ** | | -- | OK | OK | | | 4.17 | OK | ** | | | | ** | | -- | OK | OK | | | + 4.18 | OK | ** | | | | ** | | -- | OK | OK | | | + 4.19 | OK | ** | | | | ** | | -- | OK | OK | | | OK : Support. -- : Not support. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/makedumpfile-1.6.4/arch/arm64.c new/makedumpfile-1.6.5/arch/arm64.c --- old/makedumpfile-1.6.4/arch/arm64.c 2018-07-03 20:52:46.000000000 +0200 +++ new/makedumpfile-1.6.5/arch/arm64.c 2018-12-04 21:21:52.000000000 +0100 @@ -174,11 +174,76 @@ int get_phys_base_arm64(void) { - info->phys_base = NUMBER(PHYS_OFFSET); + int i; + unsigned long long phys_start; + unsigned long long virt_start; + + if (NUMBER(PHYS_OFFSET) != NOT_FOUND_NUMBER) { + info->phys_base = NUMBER(PHYS_OFFSET); + DEBUG_MSG("phys_base : %lx (vmcoreinfo)\n", + info->phys_base); + return TRUE; + } + + if (get_num_pt_loads() && PAGE_OFFSET) { + for (i = 0; + get_pt_load(i, &phys_start, NULL, &virt_start, NULL); + i++) { + if (virt_start != NOT_KV_ADDR + && virt_start >= PAGE_OFFSET + && phys_start != NOT_PADDR) { + info->phys_base = phys_start - + (virt_start & ~PAGE_OFFSET); + DEBUG_MSG("phys_base : %lx (pt_load)\n", + info->phys_base); + return TRUE; + } + } + } - DEBUG_MSG("phys_base : %lx\n", info->phys_base); + ERRMSG("Cannot determine phys_base\n"); + return FALSE; +} - return TRUE; +unsigned long +get_kaslr_offset_arm64(unsigned long vaddr) +{ + unsigned int i; + char buf[BUFSIZE_FGETS], *endp; + + if (!info->kaslr_offset && info->file_vmcoreinfo) { + 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 FALSE; + } + + 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_KERNELOFFSET, + strlen(STR_KERNELOFFSET)) == 0) { + info->kaslr_offset = + strtoul(buf+strlen(STR_KERNELOFFSET),&endp,16); + DEBUG_MSG("info->kaslr_offset: %lx\n", info->kaslr_offset); + } + } + } + + if (vaddr >= __START_KERNEL_map && + vaddr < __START_KERNEL_map + info->kaslr_offset) { + DEBUG_MSG("info->kaslr_offset: %lx\n", info->kaslr_offset); + return info->kaslr_offset; + } else { + /* + * TODO: we need to check if it is vmalloc/vmmemmap/module + * address, we will have different offset + */ + return 0; + } } ulong @@ -291,8 +356,8 @@ info->page_offset = (0xffffffffffffffffUL) << (va_bits - 1); - DEBUG_MSG("page_offset=%lx, va_bits=%d\n", info->page_offset, - va_bits); + DEBUG_MSG("va_bits : %d\n", va_bits); + DEBUG_MSG("page_offset : %lx\n", info->page_offset); return TRUE; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/makedumpfile-1.6.4/arch/ppc64.c new/makedumpfile-1.6.5/arch/ppc64.c --- old/makedumpfile-1.6.4/arch/ppc64.c 2018-07-03 20:52:46.000000000 +0200 +++ new/makedumpfile-1.6.5/arch/ppc64.c 2018-12-04 21:21:52.000000000 +0100 @@ -481,6 +481,11 @@ || (array_len == (NR_MEM_SECTIONS() / _SECTIONS_PER_ROOT()))) return TRUE; + info->max_physmem_bits = _MAX_PHYSMEM_BITS_4_19; + if ((array_len == (NR_MEM_SECTIONS() / _SECTIONS_PER_ROOT_EXTREME())) + || (array_len == (NR_MEM_SECTIONS() / _SECTIONS_PER_ROOT()))) + return TRUE; + return FALSE; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/makedumpfile-1.6.4/arch/x86_64.c new/makedumpfile-1.6.5/arch/x86_64.c --- old/makedumpfile-1.6.4/arch/x86_64.c 2018-07-03 20:52:46.000000000 +0200 +++ new/makedumpfile-1.6.5/arch/x86_64.c 2018-12-04 21:21:52.000000000 +0100 @@ -86,8 +86,9 @@ unsigned long long phys_start; unsigned long long virt_start; unsigned long page_offset_base; + unsigned long page_offset = 0; - if (info->kaslr_offset && (info->fd_vmlinux != -1)) { + if (info->kaslr_offset && info->name_vmlinux) { page_offset_base = get_symbol_addr("page_offset_base"); page_offset_base += info->kaslr_offset; if (!readmem(VADDR, page_offset_base, &info->page_offset, @@ -95,20 +96,32 @@ ERRMSG("Can't read page_offset_base.\n"); return FALSE; } + DEBUG_MSG("page_offset : %lx (vmlinux page_offset_base)\n", + info->page_offset); return TRUE; } if (get_num_pt_loads()) { + /* + * Linux 4.19 (only) adds KCORE_REMAP PT_LOADs, which have + * virt_start < __START_KERNEL_map, to /proc/kcore. In order + * not to select them, we select the last valid PT_LOAD. + */ for (i = 0; get_pt_load(i, &phys_start, NULL, &virt_start, NULL); i++) { if (virt_start != NOT_KV_ADDR && virt_start < __START_KERNEL_map && phys_start != NOT_PADDR) { - info->page_offset = virt_start - phys_start; - return TRUE; + page_offset = virt_start - phys_start; } } + if (page_offset) { + info->page_offset = page_offset; + DEBUG_MSG("page_offset : %lx (pt_load)\n", + info->page_offset); + return TRUE; + } } if (info->kernel_version < KERNEL_VERSION(2, 6, 27)) { @@ -119,6 +132,7 @@ info->page_offset = __PAGE_OFFSET_2_6_27; } + DEBUG_MSG("page_offset : %lx (constant)\n", info->page_offset); return TRUE; } @@ -139,7 +153,7 @@ } /* linux-2.6.21 or older don't have phys_base, should be set to 0. */ - if (!has_vmcoreinfo()) { + if (!has_vmcoreinfo() && info->name_vmlinux) { SYMBOL_INIT(phys_base, "phys_base"); if (SYMBOL(phys_base) == NOT_FOUND_SYMBOL) { return TRUE; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/makedumpfile-1.6.4/dwarf_info.c new/makedumpfile-1.6.5/dwarf_info.c --- old/makedumpfile-1.6.4/dwarf_info.c 2018-07-03 20:52:46.000000000 +0200 +++ new/makedumpfile-1.6.5/dwarf_info.c 2018-12-04 21:21:52.000000000 +0100 @@ -752,7 +752,8 @@ continue; *found = TRUE; - strncpy(dwarf_info.src_name, src_name, LEN_SRCFILE); + strncpy(dwarf_info.src_name, src_name, LEN_SRCFILE-1); + dwarf_info.src_name[LEN_SRCFILE-1] = '\0'; break; } } while (!dwarf_siblingof(die, die)); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/makedumpfile-1.6.4/elf_info.c new/makedumpfile-1.6.5/elf_info.c --- old/makedumpfile-1.6.4/elf_info.c 2018-07-03 20:52:46.000000000 +0200 +++ new/makedumpfile-1.6.5/elf_info.c 2018-12-04 21:21:52.000000000 +0100 @@ -372,7 +372,7 @@ off_t offset_desc; offset = UNINITIALIZED; - kvaddr = (ulong)vmcoreinfo_addr + PAGE_OFFSET; + kvaddr = paddr_to_vaddr(vmcoreinfo_addr); for (i = 0; i < num_pt_loads; ++i) { struct pt_load_segment *p = &pt_loads[i]; @@ -810,10 +810,11 @@ int i, j, tidx = -1; unsigned long long vstart, vend, kvstart, kvend; struct pt_load_segment temp_seg = {0}; - kvstart = (ulong)start + PAGE_OFFSET; - kvend = (ulong)end + PAGE_OFFSET; unsigned long size; + kvstart = paddr_to_vaddr(start); + kvend = paddr_to_vaddr(end); + for (i = 0; i < (*num_pt_loads); i++) { vstart = (*pt_loads)[i].virt_start; vend = (*pt_loads)[i].virt_end; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/makedumpfile-1.6.4/makedumpfile.8 new/makedumpfile-1.6.5/makedumpfile.8 --- old/makedumpfile-1.6.4/makedumpfile.8 2018-07-03 20:52:46.000000000 +0200 +++ new/makedumpfile-1.6.5/makedumpfile.8 2018-12-04 21:21:52.000000000 +0100 @@ -1,4 +1,4 @@ -.TH MAKEDUMPFILE 8 "3 Jul 2018" "makedumpfile v1.6.4" "Linux System Administrator's Manual" +.TH MAKEDUMPFILE 8 "5 Dec 2018" "makedumpfile v1.6.5" "Linux System Administrator's Manual" .SH NAME makedumpfile \- make a small dumpfile of kdump .SH SYNOPSIS diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/makedumpfile-1.6.4/makedumpfile.c new/makedumpfile-1.6.5/makedumpfile.c --- old/makedumpfile-1.6.4/makedumpfile.c 2018-07-03 20:52:46.000000000 +0200 +++ new/makedumpfile-1.6.5/makedumpfile.c 2018-12-04 21:21:52.000000000 +0100 @@ -2084,7 +2084,7 @@ { if ((ARRAY_LENGTH(mem_section) == divideup(NR_MEM_SECTIONS(), _SECTIONS_PER_ROOT_EXTREME())) - || (ARRAY_LENGTH(mem_section) == NOT_FOUND_SYMBOL)) + || (ARRAY_LENGTH(mem_section) == NOT_FOUND_STRUCTURE)) return TRUE; else return FALSE; @@ -5364,7 +5364,7 @@ { int i, nr_zones, num_nodes, node; unsigned long node_zones, zone, spanned_pages, pgdat; - struct timeval tv_start; + struct timespec ts_start; if ((node = next_online_node(0)) < 0) { ERRMSG("Can't get next online node.\n"); @@ -5374,7 +5374,7 @@ ERRMSG("Can't get pgdat list.\n"); return FALSE; } - gettimeofday(&tv_start, NULL); + clock_gettime(CLOCK_MONOTONIC, &ts_start); for (num_nodes = 1; num_nodes <= vt.numnodes; num_nodes++) { @@ -5420,7 +5420,7 @@ * print [100 %] */ print_progress(PROGRESS_FREE_PAGES, vt.numnodes, vt.numnodes, NULL); - print_execution_time(PROGRESS_FREE_PAGES, &tv_start); + print_execution_time(PROGRESS_FREE_PAGES, &ts_start); return TRUE; } @@ -5516,6 +5516,27 @@ "follow free lists instead of mem_map array.\n"); } +static mdf_pfn_t count_bits(char *buf, int sz) +{ + char *p = buf; + int i, j; + mdf_pfn_t cnt = 0; + + for (i = 0; i < sz; i++, p++) { + if (*p == 0) + continue; + else if (*p == 0xff) { + cnt += 8; + continue; + } + for (j = 0; j < 8; j++) { + if (*p & (1<<j)) + cnt++; + } + } + return cnt; +} + /* * If using a dumpfile in kdump-compressed format as a source file * instead of /proc/vmcore, 1st-bitmap of a new dumpfile must be @@ -5549,6 +5570,7 @@ info->name_memory, strerror(errno)); return FALSE; } + pfn_memhole -= count_bits(buf, sizeof(buf)); if (write(info->bitmap1->fd, buf, sizeof(buf)) != sizeof(buf)) { ERRMSG("Can't write the bitmap(%s). %s\n", info->bitmap1->file_name, strerror(errno)); @@ -5567,7 +5589,7 @@ char buf[info->page_size]; mdf_pfn_t pfn, pfn_start, pfn_end, pfn_bitmap1; unsigned long long phys_start, phys_end; - struct timeval tv_start; + struct timespec ts_start; off_t offset_page; if (info->flag_refiltering) @@ -5597,7 +5619,7 @@ offset_page += info->page_size; } - gettimeofday(&tv_start, NULL); + clock_gettime(CLOCK_MONOTONIC, &ts_start); /* * If page is on memory hole, set bit on the 1st-bitmap. @@ -5629,7 +5651,7 @@ */ if (!info->flag_mem_usage) { print_progress(PROGRESS_HOLES, info->max_mapnr, info->max_mapnr, NULL); - print_execution_time(PROGRESS_HOLES, &tv_start); + print_execution_time(PROGRESS_HOLES, &ts_start); } if (!sync_1st_bitmap()) @@ -5731,7 +5753,7 @@ mdf_pfn_t pfn_start_roundup, pfn_end_round; unsigned long pfn_start_byte, pfn_end_byte; unsigned int num_pt_loads = get_num_pt_loads(); - struct timeval tv_start; + struct timespec ts_start; /* * At first, clear all the bits on the bitmap. @@ -5741,7 +5763,7 @@ /* * If page is on memory hole, set bit on the bitmap. */ - gettimeofday(&tv_start, NULL); + clock_gettime(CLOCK_MONOTONIC, &ts_start); for (i = 0; get_pt_load(i, &phys_start, &phys_end, NULL, NULL); i++) { pfn_start = MAX(paddr_to_pfn(phys_start), cycle->start_pfn); pfn_end = MIN(paddr_to_pfn(phys_end), cycle->end_pfn); @@ -5786,7 +5808,7 @@ * print 100 % */ print_progress(PROGRESS_HOLES, info->max_mapnr, info->max_mapnr, NULL); - print_execution_time(PROGRESS_HOLES, &tv_start); + print_execution_time(PROGRESS_HOLES, &ts_start); return TRUE; } @@ -6045,14 +6067,14 @@ { unsigned int mm; struct mem_map_data *mmd; - struct timeval tv_start; + struct timespec ts_start; if (is_xen_memory() && !info->dom0_mapnr) { ERRMSG("Can't get max domain-0 PFN for excluding pages.\n"); return FALSE; } - gettimeofday(&tv_start, NULL); + clock_gettime(CLOCK_MONOTONIC, &ts_start); for (mm = 0; mm < info->num_mem_map; mm++) { @@ -6076,7 +6098,7 @@ */ if (!info->flag_mem_usage) { print_progress(PROGRESS_UNN_PAGES, info->num_mem_map, info->num_mem_map, NULL); - print_execution_time(PROGRESS_UNN_PAGES, &tv_start); + print_execution_time(PROGRESS_UNN_PAGES, &ts_start); } return TRUE; @@ -6093,19 +6115,27 @@ int copy_bitmap_file(void) { - off_t offset; + off_t base, offset = 0; unsigned char buf[info->page_size]; const off_t failed = (off_t)-1; + int fd; + struct disk_dump_header *dh = info->dh_memory; - offset = 0; + if (info->flag_refiltering) { + fd = info->fd_memory; + base = (DISKDUMP_HEADER_BLOCKS + dh->sub_hdr_size) * dh->block_size; + base += info->len_bitmap / 2; + } else { + fd = info->bitmap1->fd; + base = info->bitmap1->offset; + } while (offset < (info->len_bitmap / 2)) { - if (lseek(info->bitmap1->fd, info->bitmap1->offset + offset, - SEEK_SET) == failed) { + if (lseek(fd, base + offset, SEEK_SET) == failed) { ERRMSG("Can't seek the bitmap(%s). %s\n", info->name_bitmap, strerror(errno)); return FALSE; } - if (read(info->bitmap1->fd, buf, sizeof(buf)) != sizeof(buf)) { + if (read(fd, buf, sizeof(buf)) != sizeof(buf)) { ERRMSG("Can't read the dump memory(%s). %s\n", info->name_memory, strerror(errno)); return FALSE; @@ -6961,7 +6991,7 @@ /* * Write common header */ - strncpy(dh->signature, KDUMP_SIGNATURE, strlen(KDUMP_SIGNATURE)); + memcpy(dh->signature, KDUMP_SIGNATURE, strlen(KDUMP_SIGNATURE)); dh->header_version = 6; dh->block_size = info->page_size; dh->sub_hdr_size = sizeof(kh) + size_note; @@ -7474,7 +7504,7 @@ unsigned long frac_head, frac_tail; off_t off_seg_load, off_memory; Elf64_Phdr load; - struct timeval tv_start; + struct timespec ts_start; struct cycle cycle = {0}; if (!info->flag_elf_dumpfile) @@ -7499,7 +7529,7 @@ if (!(phnum = get_phnum_memory())) return FALSE; - gettimeofday(&tv_start, NULL); + clock_gettime(CLOCK_MONOTONIC, &ts_start); for (i = 0; i < phnum; i++) { if (!get_phdr_memory(i, &load)) @@ -7547,7 +7577,7 @@ } if ((num_dumped % per) == 0) - print_progress(PROGRESS_COPY, num_dumped, num_dumpable, &tv_start); + print_progress(PROGRESS_COPY, num_dumped, num_dumpable, &ts_start); num_dumped++; @@ -7666,8 +7696,8 @@ /* * print [100 %] */ - print_progress(PROGRESS_COPY, num_dumpable, num_dumpable, &tv_start); - print_execution_time(PROGRESS_COPY, &tv_start); + print_progress(PROGRESS_COPY, num_dumpable, num_dumpable, &ts_start); + print_execution_time(PROGRESS_COPY, &ts_start); PROGRESS_MSG("\n"); return TRUE; @@ -8008,8 +8038,8 @@ mdf_pfn_t per; mdf_pfn_t start_pfn, end_pfn; struct page_desc pd; - struct timeval tv_start; - struct timeval last, new; + struct timespec ts_start; + struct timespec last, new; pthread_t **threads = NULL; struct thread_args *kdump_thread_args = NULL; void *thread_result; @@ -8047,7 +8077,7 @@ per = info->num_dumpable / 10000; per = per ? per : 1; - gettimeofday(&tv_start, NULL); + clock_gettime(CLOCK_MONOTONIC, &ts_start); start_pfn = cycle->start_pfn; end_pfn = cycle->end_pfn; @@ -8095,7 +8125,7 @@ * The next pfn is smallest pfn in all page_flag_buf. */ sem_wait(&info->page_flag_buf_sem); - gettimeofday(&last, NULL); + clock_gettime(CLOCK_MONOTONIC, &last); while (1) { current_pfn = end_pfn; @@ -8138,7 +8168,7 @@ * So we should recheck. */ if (info->page_flag_buf[consuming]->ready != FLAG_READY) { - gettimeofday(&new, NULL); + clock_gettime(CLOCK_MONOTONIC, &new); if (new.tv_sec - last.tv_sec > WAIT_TIME) { ERRMSG("Can't get data of pfn.\n"); goto out; @@ -8151,7 +8181,7 @@ } if ((num_dumped % per) == 0) - print_progress(PROGRESS_COPY, num_dumped, info->num_dumpable, &tv_start); + print_progress(PROGRESS_COPY, num_dumped, info->num_dumpable, &ts_start); num_dumped++; @@ -8187,8 +8217,8 @@ /* * print [100 %] */ - print_progress(PROGRESS_COPY, num_dumped, info->num_dumpable, &tv_start); - print_execution_time(PROGRESS_COPY, &tv_start); + print_progress(PROGRESS_COPY, num_dumped, info->num_dumpable, &ts_start); + print_execution_time(PROGRESS_COPY, &ts_start); PROGRESS_MSG("\n"); out: @@ -8238,7 +8268,7 @@ struct page_desc pd; unsigned char buf[info->page_size], *buf_out = NULL; unsigned long len_buf_out; - struct timeval tv_start; + struct timespec ts_start; const off_t failed = (off_t)-1; unsigned long len_buf_out_zlib, len_buf_out_lzo, len_buf_out_snappy; @@ -8299,12 +8329,12 @@ end_pfn = info->split_end_pfn; } - gettimeofday(&tv_start, NULL); + clock_gettime(CLOCK_MONOTONIC, &ts_start); for (pfn = start_pfn; pfn < end_pfn; pfn++) { if ((num_dumped % per) == 0) - print_progress(PROGRESS_COPY, num_dumped, info->num_dumpable, &tv_start); + print_progress(PROGRESS_COPY, num_dumped, info->num_dumpable, &ts_start); /* * Check the excluded page. @@ -8384,8 +8414,8 @@ free(wrkmem); #endif - print_progress(PROGRESS_COPY, num_dumped, info->num_dumpable, &tv_start); - print_execution_time(PROGRESS_COPY, &tv_start); + print_progress(PROGRESS_COPY, num_dumped, info->num_dumpable, &ts_start); + print_execution_time(PROGRESS_COPY, &ts_start); return ret; } @@ -8747,7 +8777,7 @@ off_t offset_data=0; struct disk_dump_header *dh = info->dump_header; unsigned char buf[info->page_size]; - struct timeval tv_start; + struct timespec ts_start; cd_header->offset = (DISKDUMP_HEADER_BLOCKS + dh->sub_hdr_size + dh->bitmap_blocks) @@ -8829,7 +8859,7 @@ } free_bitmap2_buffer(); - gettimeofday(&tv_start, NULL); + clock_gettime(CLOCK_MONOTONIC, &ts_start); /* * Write the remainder. @@ -8842,8 +8872,8 @@ /* * print [100 %] */ - print_progress(PROGRESS_COPY, num_dumped, info->num_dumpable, &tv_start); - print_execution_time(PROGRESS_COPY, &tv_start); + print_progress(PROGRESS_COPY, num_dumped, info->num_dumpable, &ts_start); + print_execution_time(PROGRESS_COPY, &ts_start); PROGRESS_MSG("\n"); return TRUE; @@ -9563,10 +9593,10 @@ int exclude_xen_user_domain(void) { - struct timeval tv_start; + struct timespec ts_start; int ret; - gettimeofday(&tv_start, NULL); + clock_gettime(CLOCK_MONOTONIC, &ts_start); if (info->xen_crash_info.com && info->xen_crash_info.com->xen_major_version >= 4) @@ -9578,7 +9608,7 @@ * print [100 %] */ print_progress(PROGRESS_XEN_DOMAIN, 1, 1, NULL); - print_execution_time(PROGRESS_XEN_DOMAIN, &tv_start); + print_execution_time(PROGRESS_XEN_DOMAIN, &ts_start); return ret; } @@ -10502,7 +10532,7 @@ struct disk_dump_header dh; struct page_desc pd, pd_zero; struct cache_data cd_pd, cd_data; - struct timeval tv_start; + struct timespec ts_start; char *data = NULL; unsigned long data_buf_size = info->page_size; @@ -10538,7 +10568,7 @@ /* * Write page header of zero-filled page. */ - gettimeofday(&tv_start, NULL); + clock_gettime(CLOCK_MONOTONIC, &ts_start); if (info->dump_level & DL_EXCLUDE_ZERO) { /* * makedumpfile outputs the data of zero-filled page at first @@ -10573,7 +10603,7 @@ num_dumped++; - print_progress(PROGRESS_COPY, num_dumped, num_dumpable, &tv_start); + print_progress(PROGRESS_COPY, num_dumped, num_dumpable, &ts_start); if (lseek(fd, offset_ph_org, SEEK_SET) < 0) { ERRMSG("Can't seek a file(%s). %s\n", @@ -10670,8 +10700,8 @@ size_eraseinfo)) goto out; } - print_progress(PROGRESS_COPY, num_dumpable, num_dumpable, &tv_start); - print_execution_time(PROGRESS_COPY, &tv_start); + print_progress(PROGRESS_COPY, num_dumpable, num_dumpable, &ts_start); + print_execution_time(PROGRESS_COPY, &ts_start); ret = TRUE; out: @@ -11184,6 +11214,10 @@ if (!get_page_offset()) return FALSE; + /* paddr_to_vaddr() on arm64 needs phys_base. */ + if (!get_phys_base()) + return FALSE; + if (!get_sys_kernel_vmcoreinfo(&vmcoreinfo_addr, &vmcoreinfo_len)) return FALSE; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/makedumpfile-1.6.4/makedumpfile.conf.5 new/makedumpfile-1.6.5/makedumpfile.conf.5 --- old/makedumpfile-1.6.4/makedumpfile.conf.5 2018-07-03 20:52:46.000000000 +0200 +++ new/makedumpfile-1.6.5/makedumpfile.conf.5 2018-12-04 21:21:52.000000000 +0100 @@ -1,4 +1,4 @@ -.TH MAKEDUMPFILE.CONF 5 "3 Jul 2018" "makedumpfile v1.6.4" "Linux System Administrator's Manual" +.TH MAKEDUMPFILE.CONF 5 "5 Dec 2018" "makedumpfile v1.6.5" "Linux System Administrator's Manual" .SH NAME makedumpfile.conf \- The filter configuration file for makedumpfile(8). .SH DESCRIPTION diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/makedumpfile-1.6.4/makedumpfile.h new/makedumpfile-1.6.5/makedumpfile.h --- old/makedumpfile-1.6.4/makedumpfile.h 2018-07-03 20:52:46.000000000 +0200 +++ new/makedumpfile-1.6.5/makedumpfile.h 2018-12-04 21:21:52.000000000 +0100 @@ -494,8 +494,8 @@ #define KVER_MAJ_SHIFT 24 #define KVER_MIN_SHIFT 16 #define KERNEL_VERSION(x,y,z) (((x) << KVER_MAJ_SHIFT) | ((y) << KVER_MIN_SHIFT) | (z)) -#define OLDEST_VERSION KERNEL_VERSION(2, 6, 15)/* linux-2.6.15 */ -#define LATEST_VERSION KERNEL_VERSION(4, 17, 0)/* linux-4.17.0 */ +#define OLDEST_VERSION KERNEL_VERSION(2, 6, 15) /* linux-2.6.15 */ +#define LATEST_VERSION KERNEL_VERSION(4, 19, 4) /* linux-4.19.4 */ /* * vmcoreinfo in /proc/vmcore @@ -542,6 +542,8 @@ #ifdef __aarch64__ unsigned long get_kvbase_arm64(void); #define KVBASE get_kvbase_arm64() +#define __START_KERNEL_map (0xffffffff80000000UL) + #endif /* aarch64 */ #ifdef __arm__ @@ -669,6 +671,7 @@ #define _SECTION_SIZE_BITS (24) #define _MAX_PHYSMEM_BITS_ORIG (44) #define _MAX_PHYSMEM_BITS_3_7 (46) +#define _MAX_PHYSMEM_BITS_4_19 (47) #define REGION_SHIFT (60UL) #define VMEMMAP_REGION_ID (0xfUL) @@ -960,6 +963,8 @@ static inline int stub_true() { return TRUE; } static inline int stub_true_ul(unsigned long x) { return TRUE; } static inline int stub_false() { return FALSE; } +#define paddr_to_vaddr_general(X) ((X) + PAGE_OFFSET) + #ifdef __aarch64__ int get_phys_base_arm64(void); int get_machdep_info_arm64(void); @@ -967,12 +972,16 @@ int get_versiondep_info_arm64(void); int get_xen_basic_info_arm64(void); int get_xen_info_arm64(void); +unsigned long get_kaslr_offset_arm64(unsigned long vaddr); +#define paddr_to_vaddr_arm64(X) (((X) - info->phys_base) | PAGE_OFFSET) + #define find_vmemmap() stub_false() #define vaddr_to_paddr(X) vaddr_to_paddr_arm64(X) +#define paddr_to_vaddr(X) paddr_to_vaddr_arm64(X) #define get_phys_base() get_phys_base_arm64() #define get_machdep_info() get_machdep_info_arm64() #define get_versiondep_info() get_versiondep_info_arm64() -#define get_kaslr_offset(X) stub_false() +#define get_kaslr_offset(X) get_kaslr_offset_arm64(X) #define get_xen_basic_info_arch(X) get_xen_basic_info_arm64(X) #define get_xen_info_arch(X) get_xen_info_arm64(X) #define is_phys_addr(X) stub_true_ul(X) @@ -989,6 +998,7 @@ #define get_versiondep_info() stub_true() #define get_kaslr_offset(X) stub_false() #define vaddr_to_paddr(X) vaddr_to_paddr_arm(X) +#define paddr_to_vaddr(X) paddr_to_vaddr_general(X) #define is_phys_addr(X) stub_true_ul(X) #define arch_crashkernel_mem_size() stub_false() #endif /* arm */ @@ -1003,6 +1013,7 @@ #define get_versiondep_info() get_versiondep_info_x86() #define get_kaslr_offset(X) stub_false() #define vaddr_to_paddr(X) vaddr_to_paddr_x86(X) +#define paddr_to_vaddr(X) paddr_to_vaddr_general(X) #define is_phys_addr(X) stub_true_ul(X) #define arch_crashkernel_mem_size() stub_false() #endif /* x86 */ @@ -1020,6 +1031,7 @@ #define get_versiondep_info() get_versiondep_info_x86_64() #define get_kaslr_offset(X) get_kaslr_offset_x86_64(X) #define vaddr_to_paddr(X) vtop4_x86_64(X) +#define paddr_to_vaddr(X) paddr_to_vaddr_general(X) #define is_phys_addr(X) stub_true_ul(X) #define arch_crashkernel_mem_size() stub_false() #endif /* x86_64 */ @@ -1035,6 +1047,7 @@ #define get_versiondep_info() get_versiondep_info_ppc64() #define get_kaslr_offset(X) stub_false() #define vaddr_to_paddr(X) vaddr_to_paddr_ppc64(X) +#define paddr_to_vaddr(X) paddr_to_vaddr_general(X) #define is_phys_addr(X) stub_true_ul(X) #define arch_crashkernel_mem_size() arch_crashkernel_mem_size_ppc64() #endif /* powerpc64 */ @@ -1048,6 +1061,7 @@ #define get_versiondep_info() stub_true() #define get_kaslr_offset(X) stub_false() #define vaddr_to_paddr(X) vaddr_to_paddr_ppc(X) +#define paddr_to_vaddr(X) paddr_to_vaddr_general(X) #define is_phys_addr(X) stub_true_ul(X) #define arch_crashkernel_mem_size() stub_false() #endif /* powerpc32 */ @@ -1062,6 +1076,7 @@ #define get_versiondep_info() stub_true() #define get_kaslr_offset(X) stub_false() #define vaddr_to_paddr(X) vaddr_to_paddr_s390x(X) +#define paddr_to_vaddr(X) paddr_to_vaddr_general(X) #define is_phys_addr(X) is_iomem_phys_addr_s390x(X) #define arch_crashkernel_mem_size() stub_false() #endif /* s390x */ @@ -1076,6 +1091,7 @@ #define get_versiondep_info() stub_true() #define get_kaslr_offset(X) stub_false() #define vaddr_to_paddr(X) vaddr_to_paddr_ia64(X) +#define paddr_to_vaddr(X) paddr_to_vaddr_general(X) #define VADDR_REGION(X) (((unsigned long)(X)) >> REGION_SHIFT) #define is_phys_addr(X) stub_true_ul(X) #define arch_crashkernel_mem_size() stub_false() @@ -1090,6 +1106,7 @@ #define get_phys_base() get_phys_base_sparc64() #define get_versiondep_info() get_versiondep_info_sparc64() #define vaddr_to_paddr(X) vaddr_to_paddr_sparc64(X) +#define paddr_to_vaddr(X) paddr_to_vaddr_general(X) #define is_phys_addr(X) stub_true_ul(X) #define arch_crashkernel_mem_size() stub_false() #endif /* sparc64 */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/makedumpfile-1.6.4/makedumpfile.spec new/makedumpfile-1.6.5/makedumpfile.spec --- old/makedumpfile-1.6.4/makedumpfile.spec 2018-07-03 20:52:46.000000000 +0200 +++ new/makedumpfile-1.6.5/makedumpfile.spec 2018-12-04 21:21:52.000000000 +0100 @@ -1,13 +1,13 @@ Name: makedumpfile Summary: makedumpfile package -Version: 1.6.4 +Version: 1.6.5 Release: 1 Group: Applications/Text License: GPL Source: %{name}-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-root Distribution: Linux 2.6 or greater -Packager: Atsushi Kumagai <ats-kuma...@wm.jp.nec.com> +Packager: Kazuhito Hagio <k-ha...@ab.jp.nec.com> ExclusiveOS: Linux ExclusiveArch: i386 ia64 ppc ppc64 ppc64pseries ppc64iseries x86_64 Buildroot: %{_tmppath}/%{name}-root diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/makedumpfile-1.6.4/print_info.c new/makedumpfile-1.6.5/print_info.c --- old/makedumpfile-1.6.4/print_info.c 2018-07-03 20:52:46.000000000 +0200 +++ new/makedumpfile-1.6.5/print_info.c 2018-12-04 21:21:52.000000000 +0100 @@ -19,6 +19,8 @@ #define PROGRESS_MAXLEN "50" +#define NSEC_PER_SEC 1000000000L + int message_level; int flag_strerr_message; int flag_ignore_r_char; /* 0: '\r' is effective. 1: not effective. */ @@ -298,7 +300,7 @@ MSG(" necessary to specify [-x VMLINUX] or [-i VMCOREINFO].\n"); MSG("\n"); MSG(" [--mem-usage]:\n"); - MSG(" This option is only for x86_64.\n"); + MSG(" This option is currently supported on x86_64, arm64, ppc64 and s390x.\n"); MSG(" This option is used to show the page numbers of current system in different\n"); MSG(" use. It should be executed in 1st kernel. By the help of this, user can know\n"); MSG(" how many pages is dumpable when different dump_level is specified. It analyzes\n"); @@ -338,16 +340,16 @@ MSG("\n"); } -static void calc_delta(struct timeval *tv_start, struct timeval *delta) +static void calc_delta(struct timespec *ts_start, struct timespec *delta) { - struct timeval tv_end; + struct timespec ts_end; - gettimeofday(&tv_end, NULL); - delta->tv_sec = tv_end.tv_sec - tv_start->tv_sec; - delta->tv_usec = tv_end.tv_usec - tv_start->tv_usec; - if (delta->tv_usec < 0) { + clock_gettime(CLOCK_MONOTONIC, &ts_end); + delta->tv_sec = ts_end.tv_sec - ts_start->tv_sec; + delta->tv_nsec = ts_end.tv_nsec - ts_start->tv_nsec; + if (delta->tv_nsec < 0) { delta->tv_sec--; - delta->tv_usec += 1000000; + delta->tv_nsec += NSEC_PER_SEC; } } @@ -371,14 +373,14 @@ void -print_progress(const char *msg, unsigned long current, unsigned long end, struct timeval *start) +print_progress(const char *msg, unsigned long current, unsigned long end, struct timespec *start) { unsigned progress; /* in promilles (tenths of a percent) */ time_t tm; static time_t last_time = 0; static unsigned int lapse = 0; static const char *spinner = "/|\\-"; - struct timeval delta; + struct timespec delta; unsigned long eta; char eta_msg[16] = " "; @@ -393,7 +395,7 @@ if (start != NULL && progress != 0) { calc_delta(start, &delta); - eta = 1000 * delta.tv_sec + delta.tv_usec / 1000; + eta = 1000 * delta.tv_sec + delta.tv_nsec / (NSEC_PER_SEC / 1000); eta = eta / progress - delta.tv_sec; eta_to_human_short(eta, eta_msg); } @@ -411,12 +413,12 @@ } void -print_execution_time(char *step_name, struct timeval *tv_start) +print_execution_time(char *step_name, struct timespec *ts_start) { - struct timeval delta; + struct timespec delta; - calc_delta(tv_start, &delta); + calc_delta(ts_start, &delta); REPORT_MSG("STEP [%s] : %ld.%06ld seconds\n", - step_name, delta.tv_sec, delta.tv_usec); + step_name, delta.tv_sec, delta.tv_nsec / 1000); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/makedumpfile-1.6.4/print_info.h new/makedumpfile-1.6.5/print_info.h --- old/makedumpfile-1.6.4/print_info.h 2018-07-03 20:52:46.000000000 +0200 +++ new/makedumpfile-1.6.5/print_info.h 2018-12-04 21:21:52.000000000 +0100 @@ -17,7 +17,7 @@ #define _PRINT_INFO_H #include <stdio.h> -#include <sys/time.h> +#include <time.h> extern int message_level; extern int flag_strerr_message; @@ -25,9 +25,9 @@ void show_version(void); void print_usage(void); -void print_progress(const char *msg, unsigned long current, unsigned long end, struct timeval *start); +void print_progress(const char *msg, unsigned long current, unsigned long end, struct timespec *start); -void print_execution_time(char *step_name, struct timeval *tv_start); +void print_execution_time(char *step_name, struct timespec *ts_start); /* * Message texts diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/makedumpfile-1.6.4/sadump_info.c new/makedumpfile-1.6.5/sadump_info.c --- old/makedumpfile-1.6.4/sadump_info.c 2018-07-03 20:52:46.000000000 +0200 +++ new/makedumpfile-1.6.5/sadump_info.c 2018-12-04 21:21:52.000000000 +0100 @@ -311,7 +311,7 @@ } strncpy(info->release, info->system_utsname.release, - strlen(info->system_utsname.release) + 1); + STRLEN_OSRELEASE); write_vmcoreinfo_data(); @@ -2395,7 +2395,7 @@ elfcorehdr_p = 0; for (i = 0; i < ARRAY_LENGTH(kimage.segment); ++i) { char e_ident[EI_NIDENT]; - unsigned mem; + unsigned long mem; mem=ULONG(buf+i*SIZE(kexec_segment)+OFFSET(kexec_segment.mem)); if (!mem) ++++++ makedumpfile-override-libtinfo.patch ++++++ --- /var/tmp/diff_new_pack.38gYYh/_old 2019-02-17 12:18:58.624239532 +0100 +++ /var/tmp/diff_new_pack.38gYYh/_new 2019-02-17 12:18:58.624239532 +0100 @@ -12,7 +12,7 @@ --- a/Makefile +++ b/Makefile -@@ -67,6 +67,8 @@ LIBS := -lsnappy $(LIBS) +@@ -66,6 +66,8 @@ LIBS := -lsnappy $(LIBS) CFLAGS += -DUSESNAPPY endif @@ -20,8 +20,8 @@ + LIBS := -lpthread $(LIBS) - all: makedumpfile -@@ -90,7 +92,7 @@ makedumpfile: $(SRC_BASE) $(OBJ_PART) $( + try-run = $(shell set -e; \ +@@ -101,7 +103,7 @@ makedumpfile: $(SRC_BASE) $(OBJ_PART) $( gzip -c ./makedumpfile.conf.5 > ./makedumpfile.conf.5.gz eppic_makedumpfile.so: extension_eppic.c ++++++ makedumpfile-ppc64-VA-range-SUSE.patch ++++++ From: Petr Tesarik <ptesa...@suse.cz> Subject: Use correct l3 index size with SLE15-SP1 ppc64le kernels References: bsc#1123015 Upstream: never, SUSE-specific SLE 15 SP1 backported commit c2b4d8b7417a ("powerpc/mm/hash64: Increase the VA range"), to Linux 4.12, so let's check SUSE_PRODUCT_CODE. Signed-off-by: Petr Tesarik <ptesa...@suse.cz> --- arch/ppc64.c | 3 ++- makedumpfile.c | 4 ++++ makedumpfile.h | 3 +++ 3 files changed, 9 insertions(+), 1 deletion(-) --- a/makedumpfile.h +++ b/makedumpfile.h @@ -1936,6 +1936,9 @@ struct number_table { unsigned long PHYS_OFFSET; unsigned long kimage_voffset; #endif + + /* Distro-specific */ + long SUSE_PRODUCT_CODE; }; struct srcfile_table { --- a/makedumpfile.c +++ b/makedumpfile.c @@ -2296,6 +2296,8 @@ write_vmcoreinfo_data(void) WRITE_NUMBER_UNSIGNED("kimage_voffset", kimage_voffset); #endif + WRITE_NUMBER("SUSE_PRODUCT_CODE", SUSE_PRODUCT_CODE); + if (info->phys_base) fprintf(info->file_vmcoreinfo, "%s%lu\n", STR_NUMBER("phys_base"), info->phys_base); @@ -2696,6 +2698,8 @@ read_vmcoreinfo(void) READ_NUMBER("HUGETLB_PAGE_DTOR", HUGETLB_PAGE_DTOR); + READ_NUMBER("SUSE_PRODUCT_CODE", SUSE_PRODUCT_CODE); + return TRUE; } --- a/arch/ppc64.c +++ b/arch/ppc64.c @@ -248,7 +248,8 @@ ppc64_vmalloc_init(void) if (info->kernel_version >= KERNEL_VERSION(4, 12, 0)) { info->l2_index_size = PMD_INDEX_SIZE_L4_64K_4_12; - if (info->kernel_version >= KERNEL_VERSION(4, 17, 0)) + if (info->kernel_version >= KERNEL_VERSION(4, 17, 0) || + (NUMBER(SUSE_PRODUCT_CODE) & ~0xffL) == 0x010f0100) info->l3_index_size = PUD_INDEX_SIZE_L4_64K_4_17; else info->l3_index_size = PUD_INDEX_SIZE_L4_64K_4_12;