Date: Wed, 24 Dec 2014 22:26:37 +0000 From: Andrew Turner <andrew@fubar.geek.nz> To: Ian Lepore <ian@FreeBSD.org> Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org Subject: Re: svn commit: r276187 - head/sys/arm/arm Message-ID: <20141224222637.03a19e57@bender> In-Reply-To: <201412241712.sBOHCqvW039381@svn.freebsd.org> References: <201412241712.sBOHCqvW039381@svn.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, 24 Dec 2014 17:12:52 +0000 (UTC) Ian Lepore <ian@FreeBSD.org> wrote: > Author: ian > Date: Wed Dec 24 17:12:51 2014 > New Revision: 276187 > URL: https://svnweb.freebsd.org/changeset/base/276187 > > Log: > Eliminate unnecessary references to pte.h internals by using the > standard pmap_kenter_temporary() to map pages while dumping. > > Submitted by: Svatopluk Kraus <onwahe@gmail.com>, > Michal Meloun <meloun@miracle.cz> > > Modified: > head/sys/arm/arm/dump_machdep.c > > Modified: head/sys/arm/arm/dump_machdep.c > ============================================================================== > --- head/sys/arm/arm/dump_machdep.c Wed Dec 24 16:11:15 > 2014 (r276186) +++ head/sys/arm/arm/dump_machdep.c Wed > Dec 24 17:12:51 2014 (r276187) @@ -160,11 +160,13 @@ static int > cb_dumpdata(struct md_pa *mdp, int seqnr, void *arg) > { > struct dumperinfo *di = (struct dumperinfo*)arg; > - vm_paddr_t pa; > + vm_paddr_t a, pa; > + void *va; > uint32_t pgs; > size_t counter, sz, chunk; > - int c, error; > + int i, c, error; > > + va = 0; > error = 0; /* catch case in which chunk size is 0 */ > counter = 0; > pgs = mdp->md_size / PAGE_SIZE; > @@ -194,16 +196,14 @@ cb_dumpdata(struct md_pa *mdp, int seqnr > printf(" %d", pgs * PAGE_SIZE); > counter &= (1<<24) - 1; > } > - if (pa == (pa & L1_ADDR_BITS)) { > - pmap_kenter_section(0, pa & L1_ADDR_BITS, 0); > - cpu_tlb_flushID_SE(0); > - cpu_cpwait(); > + for (i = 0; i < chunk; i++) { > + a = pa + i * PAGE_SIZE; > + va = pmap_kenter_temporary(trunc_page(a), i); Is this correct? It may map multiple chunks here. > } > #ifdef SW_WATCHDOG > wdog_kern_pat(WD_LASTVAL); > #endif > - error = dump_write(di, > - (void *)(pa - (pa & L1_ADDR_BITS)),0, dumplo, > sz); > + error = dump_write(di, va, 0, dumplo, sz); Then uses the last virtual address to dump the data here. Wouldn't this miss the chunks mapped other than the last one? Andrew
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20141224222637.03a19e57>