Date: Wed, 22 Jun 2005 18:48:22 GMT From: Peter Wemm <peter@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 78820 for review Message-ID: <200506221848.j5MImMbc062832@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=78820 Change 78820 by peter@peter_overcee on 2005/06/22 18:48:16 Build the dump_avail[] list once only, in case that is somehow messing things up. Eliminate some PAGE_SHIFT abuse while here on ps's suggestion. Affected files ... .. //depot/projects/hammer/sys/amd64/amd64/dump_machdep.c#14 edit Differences ... ==== //depot/projects/hammer/sys/amd64/amd64/dump_machdep.c#14 (text+ko) ==== @@ -66,17 +66,18 @@ /* 20 phys_avail entry pairs correspond to 10 md_pa's */ static struct md_pa dump_avail[10]; -static struct md_pa * -md_pa_first(void) +static void +md_pa_init(void) { - int n; + int n, idx; bzero(&dump_avail, sizeof(dump_avail)); for (n = 0; n < sizeof(dump_avail) / sizeof(dump_avail[0]); n++) { - if (phys_avail[n * 2] == 0 && phys_avail[n * 2 + 1] == 0) + idx = n * 2; + if (phys_avail[idx] == 0 && phys_avail[idx + 1] == 0) break; - dump_avail[n].md_start = phys_avail[n * 2]; - dump_avail[n].md_size = phys_avail[n * 2 + 1] - phys_avail[n * 2]; + dump_avail[n].md_start = phys_avail[idx]; + dump_avail[n].md_size = phys_avail[idx + 1] - phys_avail[idx]; if (dump_avail[n].md_start == kernphys[1]) { dump_avail[n].md_start = kernphys[0]; dump_avail[n].md_size += kernphys[1] - kernphys[0]; @@ -86,6 +87,11 @@ dump_avail[n].md_size += PAGE_SIZE; } } +} + +static struct md_pa * +md_pa_first(void) +{ return (&dump_avail[0]); } @@ -167,7 +173,7 @@ vm_paddr_t a, pa; void *va; uint64_t pgs; - size_t counter, sz; + size_t counter, sz, chunk; int i, c, error, twiddle; error = 0; /* catch case in which chunk size is 0 */ @@ -180,22 +186,24 @@ printf(" chunk %d: %ld pages ", seqnr, (long)pgs); while (pgs) { - sz = (pgs > MAXDUMPPGS) ? - MAXDUMPPGS << PAGE_SHIFT : pgs << PAGE_SHIFT; + chunk = pgs; + if (chunk > MAXDUMPPGS) + chunk = MAXDUMPPGS; + sz = chunk << PAGE_SHIFT; counter += sz; if (counter >> 24) { printf("%c\b", "|/-\\"[twiddle++ & 3]); counter &= (1<<24) - 1; } - for (i = 0; i < sz >> PAGE_SHIFT; i++) { + for (i = 0; i < chunk; i++) { a = pa + i * PAGE_SIZE; va = pmap_kenter_temporary(trunc_page(a), i); } - error = di->dumper(di->priv, (void*)va, 0, dumplo, sz); + error = di->dumper(di->priv, va, 0, dumplo, sz); if (error) break; dumplo += sz; - pgs -= sz >> PAGE_SHIFT; + pgs -= chunk; pa += sz; /* Check for user abort. */ @@ -289,6 +297,8 @@ ehdr.e_phentsize = sizeof(Elf64_Phdr); ehdr.e_shentsize = sizeof(Elf64_Shdr); + md_pa_init(); + /* Calculate dump size. */ dumpsize = 0L; ehdr.e_phnum = foreach_chunk(cb_size, &dumpsize);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200506221848.j5MImMbc062832>