Allow for CPU specific page clear and page copy functions.

This commit is contained in:
pk 2000-04-30 21:09:43 +00:00
parent d7592a72fe
commit 78391926bf
3 changed files with 52 additions and 26 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: pmap.h,v 1.44 2000/03/13 23:52:33 soren Exp $ */
/* $NetBSD: pmap.h,v 1.45 2000/04/30 21:09:43 pk Exp $ */
/*
* Copyright (c) 1996
@ -300,6 +300,7 @@ void pmap_changeprot4_4c __P((pmap_t, vaddr_t, vm_prot_t, int));
boolean_t pmap_clear_modify4m __P((struct vm_page *));
boolean_t pmap_clear_reference4m __P((struct vm_page *));
void pmap_copy_page4m __P((paddr_t, paddr_t));
void pmap_copy_page_viking_mxcc(paddr_t, paddr_t);
int pmap_enter4m __P((pmap_t, vaddr_t, paddr_t, vm_prot_t,
int));
boolean_t pmap_extract4m __P((pmap_t, vaddr_t, paddr_t *));
@ -311,6 +312,7 @@ void pmap_kremove4m __P((vaddr_t, vsize_t));
void pmap_page_protect4m __P((struct vm_page *, vm_prot_t));
void pmap_protect4m __P((pmap_t, vaddr_t, vaddr_t, vm_prot_t));
void pmap_zero_page4m __P((paddr_t));
void pmap_zero_page_viking_mxcc(paddr_t);
void pmap_changeprot4m __P((pmap_t, vaddr_t, vm_prot_t, int));
#endif /* defined SUN4M */
@ -319,7 +321,6 @@ void pmap_changeprot4m __P((pmap_t, vaddr_t, vm_prot_t, int));
#define pmap_clear_modify pmap_clear_modify4_4c
#define pmap_clear_reference pmap_clear_reference4_4c
#define pmap_copy_page pmap_copy_page4_4c
#define pmap_enter pmap_enter4_4c
#define pmap_extract pmap_extract4_4c
#define pmap_is_modified pmap_is_modified4_4c
@ -329,14 +330,12 @@ void pmap_changeprot4m __P((pmap_t, vaddr_t, vm_prot_t, int));
#define pmap_kremove pmap_kremove4_4c
#define pmap_page_protect pmap_page_protect4_4c
#define pmap_protect pmap_protect4_4c
#define pmap_zero_page pmap_zero_page4_4c
#define pmap_changeprot pmap_changeprot4_4c
#elif defined(SUN4M) && !(defined(SUN4) || defined(SUN4C))
#define pmap_clear_modify pmap_clear_modify4m
#define pmap_clear_reference pmap_clear_reference4m
#define pmap_copy_page pmap_copy_page4m
#define pmap_enter pmap_enter4m
#define pmap_extract pmap_extract4m
#define pmap_is_modified pmap_is_modified4m
@ -346,14 +345,12 @@ void pmap_changeprot4m __P((pmap_t, vaddr_t, vm_prot_t, int));
#define pmap_kremove pmap_kremove4m
#define pmap_page_protect pmap_page_protect4m
#define pmap_protect pmap_protect4m
#define pmap_zero_page pmap_zero_page4m
#define pmap_changeprot pmap_changeprot4m
#else /* must use function pointers */
extern boolean_t(*pmap_clear_modify_p) __P((struct vm_page *));
extern boolean_t(*pmap_clear_reference_p) __P((struct vm_page *));
extern void (*pmap_copy_page_p) __P((paddr_t, paddr_t));
extern int (*pmap_enter_p) __P((pmap_t, vaddr_t, paddr_t, vm_prot_t,
int));
extern boolean_t (*pmap_extract_p) __P((pmap_t, vaddr_t, paddr_t *));
@ -364,12 +361,10 @@ extern void (*pmap_kenter_pgs_p) __P((vaddr_t, struct vm_page **, int));
extern void (*pmap_kremove_p) __P((vaddr_t, vsize_t));
extern void (*pmap_page_protect_p) __P((struct vm_page *, vm_prot_t));
extern void (*pmap_protect_p) __P((pmap_t, vaddr_t, vaddr_t, vm_prot_t));
extern void (*pmap_zero_page_p) __P((paddr_t));
extern void (*pmap_changeprot_p) __P((pmap_t, vaddr_t, vm_prot_t, int));
#define pmap_clear_modify (*pmap_clear_modify_p)
#define pmap_clear_reference (*pmap_clear_reference_p)
#define pmap_copy_page (*pmap_copy_page_p)
#define pmap_enter (*pmap_enter_p)
#define pmap_extract (*pmap_extract_p)
#define pmap_is_modified (*pmap_is_modified_p)
@ -379,11 +374,14 @@ extern void (*pmap_changeprot_p) __P((pmap_t, vaddr_t, vm_prot_t, int));
#define pmap_kremove (*pmap_kremove_p)
#define pmap_page_protect (*pmap_page_protect_p)
#define pmap_protect (*pmap_protect_p)
#define pmap_zero_page (*pmap_zero_page_p)
#define pmap_changeprot (*pmap_changeprot_p)
#endif
/* pmap_{zero,copy}_page() may be assisted by specialized hardware */
#define pmap_zero_page (*cpuinfo.zero_page)
#define pmap_copy_page (*cpuinfo.copy_page)
#endif /* _KERNEL */
#endif /* _SPARC_PMAP_H_ */

View File

@ -1,4 +1,4 @@
/* $NetBSD: cpu.c,v 1.97 1999/12/16 20:24:58 thorpej Exp $ */
/* $NetBSD: cpu.c,v 1.98 2000/04/30 21:09:46 pk Exp $ */
/*
* Copyright (c) 1996
@ -632,7 +632,9 @@ struct module_info module_sun4 = {
noop_pcache_flush_line,
noop_pure_vcache_flush,
noop_cache_flush_all,
0
0,
pmap_zero_page4_4c,
pmap_copy_page4_4c
};
void
@ -758,7 +760,9 @@ struct module_info module_sun4c = {
noop_pcache_flush_line,
noop_pure_vcache_flush,
noop_cache_flush_all,
0
0,
pmap_zero_page4_4c,
pmap_copy_page4_4c
};
void
@ -956,7 +960,9 @@ struct module_info module_ms1 = {
noop_pcache_flush_line,
noop_pure_vcache_flush,
ms1_cache_flush_all,
memerr4m
memerr4m,
pmap_zero_page4m,
pmap_copy_page4m
};
void
@ -984,11 +990,13 @@ struct module_info module_ms2 = { /* UNTESTED */
noop_pcache_flush_line,
noop_pure_vcache_flush,
srmmu_cache_flush_all,
memerr4m
memerr4m,
pmap_zero_page4m,
pmap_copy_page4m
};
struct module_info module_swift = { /* UNTESTED */
struct module_info module_swift = {
CPUTYP_MS2,
VAC_WRITETHROUGH,
0,
@ -1007,7 +1015,9 @@ struct module_info module_swift = { /* UNTESTED */
srmmu_pcache_flush_line,
noop_pure_vcache_flush,
srmmu_cache_flush_all,
memerr4m
memerr4m,
pmap_zero_page4m,
pmap_copy_page4m
};
void
@ -1026,7 +1036,7 @@ swift_mmu_enable()
{
}
struct module_info module_viking = { /* UNTESTED */
struct module_info module_viking = {
CPUTYP_UNKNOWN, /* set in cpumatch() */
VAC_NONE,
cpumatch_viking,
@ -1046,7 +1056,9 @@ struct module_info module_viking = { /* UNTESTED */
viking_pcache_flush_line,
noop_pure_vcache_flush,
noop_cache_flush_all,
viking_memerr
viking_memerr,
pmap_zero_page4m,
pmap_copy_page4m
};
void
@ -1069,6 +1081,8 @@ viking_hotfix(sc)
if ((pcr & VIKING_PCR_MB) == 0) {
sc->mxcc = 1;
sc->flags |= CPUFLG_CACHE_MANDATORY;
sc->zero_page = pmap_zero_page_viking_mxcc;
sc->copy_page = pmap_copy_page_viking_mxcc;
/*
* Ok to cache PTEs; set the flag here, so we don't
* uncache in pmap_bootstrap().
@ -1108,7 +1122,7 @@ viking_mmu_enable()
/* ROSS Hypersparc */
struct module_info module_hypersparc = { /* UNTESTED */
struct module_info module_hypersparc = {
CPUTYP_UNKNOWN,
VAC_WRITEBACK,
cpumatch_hypersparc,
@ -1127,7 +1141,9 @@ struct module_info module_hypersparc = { /* UNTESTED */
srmmu_pcache_flush_line,
hypersparc_pure_vcache_flush,
hypersparc_cache_flush_all,
hypersparc_memerr
hypersparc_memerr,
pmap_zero_page4m,
pmap_copy_page4m
};
void
@ -1156,7 +1172,7 @@ hypersparc_mmu_enable()
}
/* Cypress 605 */
struct module_info module_cypress = { /* UNTESTED */
struct module_info module_cypress = {
CPUTYP_CYPRESS,
VAC_WRITEBACK,
0,
@ -1175,11 +1191,13 @@ struct module_info module_cypress = { /* UNTESTED */
srmmu_pcache_flush_line,
noop_pure_vcache_flush,
cypress_cache_flush_all,
memerr4m
memerr4m,
pmap_zero_page4m,
pmap_copy_page4m
};
/* Fujitsu Turbosparc */
struct module_info module_turbosparc = { /* UNTESTED */
struct module_info module_turbosparc = {
CPUTYP_MS2,
VAC_WRITEBACK,
cpumatch_turbosparc,
@ -1198,7 +1216,9 @@ struct module_info module_turbosparc = { /* UNTESTED */
srmmu_pcache_flush_line,
noop_pure_vcache_flush,
srmmu_cache_flush_all,
memerr4m
memerr4m,
pmap_zero_page4m,
pmap_copy_page4m
};
void
@ -1422,6 +1442,8 @@ getcpuinfo(sc, node)
MPCOPY(pure_vcache_flush);
MPCOPY(cache_flush_all);
MPCOPY(memerr);
MPCOPY(zero_page);
MPCOPY(copy_page);
#undef MPCOPY
/*
* On the boot cpu we use the single-processor cache flush

View File

@ -1,4 +1,4 @@
/* $NetBSD: cpuvar.h,v 1.22 1999/10/04 19:23:49 pk Exp $ */
/* $NetBSD: cpuvar.h,v 1.23 2000/04/30 21:09:46 pk Exp $ */
/*
* Copyright (c) 1996 The NetBSD Foundation, Inc.
@ -61,7 +61,7 @@ struct module_info {
void (*hotfix) __P((struct cpu_info *));
void (*mmu_enable)__P((void));
void (*cache_enable)__P((void));
int ncontext; /* max. # of contexts (we use) */
int ncontext; /* max. # of contexts (that we use) */
void (*get_syncflt)__P((void));
int (*get_asyncflt)__P((u_int *, u_int *));
@ -74,6 +74,8 @@ struct module_info {
void (*pure_vcache_flush)__P((void));
void (*cache_flush_all)__P((void));
void (*memerr)__P((unsigned, u_int, u_int, struct trapframe *));
void (*zero_page)__P((paddr_t));
void (*copy_page)__P((paddr_t, paddr_t));
};
struct xpmsg {
@ -258,6 +260,10 @@ struct cpu_info {
void (*pure_vcache_flush)__P((void));
void (*cache_flush_all)__P((void));
/* Support for hardware-assisted page clear/copy */
void (*zero_page)__P((paddr_t));
void (*copy_page)__P((paddr_t, paddr_t));
#ifdef SUN4M
/* hardware-assisted block operation routines */
void (*hwbcopy)