tlb_flush_segment() and tlb_flush_region() now take a virtual address

argument instead of segment and region numbers.
This commit is contained in:
pk 2002-12-21 12:52:55 +00:00
parent 7f3797c977
commit 0408b1cbc8
2 changed files with 27 additions and 27 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: pmap.h,v 1.62 2002/09/22 07:53:49 chs Exp $ */
/* $NetBSD: pmap.h,v 1.63 2002/12/21 12:52:55 pk Exp $ */
/*
* Copyright (c) 1996
@ -388,13 +388,13 @@ extern void (*pmap_changeprot_p) __P((pmap_t, vaddr_t, vm_prot_t, int));
* Macros which implement SRMMU TLB flushing/invalidation
*/
#define tlb_flush_page_real(va) \
sta(((vaddr_t)(va) & ~0xfff) | ASI_SRMMUFP_L3, ASI_SRMMUFP, 0)
sta(((vaddr_t)(va) & 0xfffff000) | ASI_SRMMUFP_L3, ASI_SRMMUFP, 0)
#define tlb_flush_segment_real(vr, vs) \
sta(((vr)<<RGSHIFT) | ((vs)<<SGSHIFT) | ASI_SRMMUFP_L2, ASI_SRMMUFP,0)
#define tlb_flush_segment_real(va) \
sta(((vaddr_t)(va) & 0xfffc0000) | ASI_SRMMUFP_L2, ASI_SRMMUFP, 0)
#define tlb_flush_region_real(vr) \
sta(((vr) << RGSHIFT) | ASI_SRMMUFP_L1, ASI_SRMMUFP, 0)
#define tlb_flush_region_real(va) \
sta(((vaddr_t)(va) & 0xff000000) | ASI_SRMMUFP_L1, ASI_SRMMUFP, 0)
#define tlb_flush_context_real() sta(ASI_SRMMUFP_L0, ASI_SRMMUFP, 0)
#define tlb_flush_all_real() sta(ASI_SRMMUFP_LN, ASI_SRMMUFP, 0)

View File

@ -1,4 +1,4 @@
/* $NetBSD: pmap.c,v 1.215 2002/12/21 12:13:38 pk Exp $ */
/* $NetBSD: pmap.c,v 1.216 2002/12/21 12:52:56 pk Exp $ */
/*
* Copyright (c) 1996
@ -539,14 +539,14 @@ static __inline__ void sp_tlb_flush_page(int va)
tlb_flush_page_real(va);
}
static __inline__ void sp_tlb_flush_segment(int vr, int vs)
static __inline__ void sp_tlb_flush_segment(int va)
{
tlb_flush_segment_real(vr, vs);
tlb_flush_segment_real(va);
}
static __inline__ void sp_tlb_flush_region(int vr)
static __inline__ void sp_tlb_flush_region(int va)
{
tlb_flush_region_real(vr);
tlb_flush_region_real(va);
}
static __inline__ void sp_tlb_flush_context(void)
@ -564,8 +564,8 @@ static __inline__ void sp_tlb_flush_all(void)
* The SMP versions of the tlb flush routines.
*/
static __inline__ void smp_tlb_flush_context __P((void));
static __inline__ void smp_tlb_flush_region __P((int));
static __inline__ void smp_tlb_flush_segment __P((int, int));
static __inline__ void smp_tlb_flush_region __P((int va));
static __inline__ void smp_tlb_flush_segment __P((int va));
static __inline__ void smp_tlb_flush_page __P((int va));
static __inline__ void smp_tlb_flush_all __P((void));
@ -609,21 +609,21 @@ smp_tlb_flush_page(va)
}
static __inline__ void
smp_tlb_flush_segment(vr, vs)
int vr, vs;
smp_tlb_flush_segment(va)
int va;
{
INCR_COUNT(smp_tlb_fs_cnt);
xcall((xcall_func_t)sp_tlb_flush_segment, vr, vs, 0/*ctx*/, 0, 0);
xcall((xcall_func_t)sp_tlb_flush_segment, va, 0/*ctx*/, 0, 0, 0);
}
static __inline__ void
smp_tlb_flush_region(vr)
int vr;
smp_tlb_flush_region(va)
int va;
{
INCR_COUNT(smp_tlb_fr_cnt);
xcall((xcall_func_t)sp_tlb_flush_region, vr, 0/*ctx*/, 0, 0, 0);
xcall((xcall_func_t)sp_tlb_flush_region, va, 0/*ctx*/, 0, 0, 0);
}
static __inline__ void
@ -645,14 +645,14 @@ smp_tlb_flush_all()
#if defined(MULTIPROCESSOR)
#define tlb_flush_page(va) smp_tlb_flush_page((int)va)
#define tlb_flush_segment(vr, vs) smp_tlb_flush_segment(vr, vs)
#define tlb_flush_region(vr) smp_tlb_flush_region(vr)
#define tlb_flush_segment(va) smp_tlb_flush_segment(va)
#define tlb_flush_region(va) smp_tlb_flush_region(va)
#define tlb_flush_context() smp_tlb_flush_context()
#define tlb_flush_all() smp_tlb_flush_all()
#else
#define tlb_flush_page(va) sp_tlb_flush_page(va)
#define tlb_flush_segment(vr, vs) sp_tlb_flush_segment(vr, vs)
#define tlb_flush_region(vr) sp_tlb_flush_region(vr)
#define tlb_flush_segment(va) sp_tlb_flush_segment(va)
#define tlb_flush_region(va) sp_tlb_flush_region(va)
#define tlb_flush_context() sp_tlb_flush_context()
#define tlb_flush_all() sp_tlb_flush_all()
#endif
@ -4512,7 +4512,7 @@ pmap_rmu4m(pm, va, endva, vr, vs)
va = VSTOVA(vr,vs);
if (pm->pm_ctx)
tlb_flush_segment(vr, vs);/* Paranoia? */
tlb_flush_segment(va);/* Paranoia? */
setpgt4m_va(va, &rp->rg_seg_ptps[vs], SRMMU_TEINVALID, 0);
sp->sg_pte = NULL;
pool_put(&L23_pool, pte0);
@ -4521,7 +4521,7 @@ pmap_rmu4m(pm, va, endva, vr, vs)
int n;
if (pm->pm_ctx)
tlb_flush_region(vr);/* Paranoia? */
tlb_flush_region(va);/* Paranoia? */
#ifdef MULTIPROCESSOR
for (n = 0; n < ncpu; n++)
#else
@ -4996,7 +4996,7 @@ pmap_page_protect4m(pg, prot)
* Entire user mode segment is gone
*/
if (pm->pm_ctx)
tlb_flush_segment(vr, vs);
tlb_flush_segment(va);
setpgt4m_va(va, &rp->rg_seg_ptps[vs], SRMMU_TEINVALID, 0);
pool_put(&L23_pool, sp->sg_pte);
sp->sg_pte = NULL;
@ -5004,7 +5004,7 @@ pmap_page_protect4m(pg, prot)
if (--rp->rg_nsegmap == 0) {
int n;
if (pm->pm_ctx)
tlb_flush_region(vr);
tlb_flush_region(va);
/*
* Replicate segment de-allocation in each