Implement dcache_inval_phys, which shoots the cache lines that correspond

to a specific physical address.  This is used for page copy and zero
routines which use physical addresses directly.

Submitted by:	tmm
This commit is contained in:
Jake Burkholder 2001-12-29 07:14:07 +00:00
parent 21d56e9c33
commit f5832be731

View File

@ -234,7 +234,7 @@ icache_flush(vm_offset_t start, vm_offset_t end)
} }
/* /*
* Blast a I$ physical range using diagnostic accesses. * Invalidate a I$ physical range using diagnostic accesses.
* NOTE: there is a race between checking the tag and invalidating it. It * NOTE: there is a race between checking the tag and invalidating it. It
* cannot be closed by disabling interrupts, since the fetch for the next * cannot be closed by disabling interrupts, since the fetch for the next
* instruction may be in that line, so we don't even bother. * instruction may be in that line, so we don't even bother.
@ -294,9 +294,8 @@ dcache_flush(vm_offset_t start, vm_offset_t end)
} }
/* /*
* Blast a D$ range using diagnostic accesses. * Invalidate a D$ range using diagnostic accesses.
* This has the same (harmless) races as icache_blast(). * This has the same (harmless) races as icache_blast().
* Assumes a page in the kernel map.
*/ */
void void
dcache_inval(pmap_t pmap, vm_offset_t start, vm_offset_t end) dcache_inval(pmap_t pmap, vm_offset_t start, vm_offset_t end)
@ -322,6 +321,32 @@ dcache_inval(pmap_t pmap, vm_offset_t start, vm_offset_t end)
} }
} }
/*
* Invalidate a physical D$ range using diagnostic accesses.
* This has the same (harmless) races as icache_blast().
*/
void
dcache_inval_phys(vm_offset_t start, vm_offset_t end)
{
vm_offset_t pa, dca;
u_long tag, color, ncolors;
if (!cache.c_enabled)
return;
ncolors = 1 << (cache.dc_l2size - PAGE_SHIFT_MIN);
for (pa = start & ~(cache.dc_linesize - 1); pa <= end;
pa += cache.dc_linesize) {
for (color = 0; color < ncolors; color++) {
dca = (color << PAGE_SHIFT_MIN) | (pa & PAGE_MASK_MIN);
CDIAG_RD(ASI_DCACHE_TAG, dca, tag);
if (DCDT_TAG(tag) == pa >> PAGE_SHIFT_MIN) {
CDIAG_CLR(ASI_DCACHE_TAG, dca);
break;
}
}
}
}
/* Discard all lines in D$. */ /* Discard all lines in D$. */
void void
dcache_blast() dcache_blast()
@ -360,7 +385,7 @@ ecache_flush(vm_offset_t start, vm_offset_t end)
#if 0 #if 0
/* /*
* Blast a E$ range using diagnostic accesses. * Invalidate a E$ range using diagnostic accesses.
* This is disabled: it suffers from the same races as dcache_blast() and * This is disabled: it suffers from the same races as dcache_blast() and
* icache_blast_phys(), but they may be fatal here because blasting an E$ line * icache_blast_phys(), but they may be fatal here because blasting an E$ line
* can discard modified data. * can discard modified data.