* Use movsdnu to copy pages.

* Just invalidate the tlbs for the affected mappings in pmap_zero_page
  and pmap_copy_page.
This commit is contained in:
matthias 1997-04-01 16:32:58 +00:00
parent 43064ade71
commit d89b0839dc

View File

@ -1,4 +1,4 @@
/* $NetBSD: pmap.c,v 1.18 1996/12/23 08:36:11 matthias Exp $ */ /* $NetBSD: pmap.c,v 1.19 1997/04/01 16:32:58 matthias Exp $ */
/* /*
* Copyright (c) 1993, 1994, 1995 Charles M. Hannum. All rights reserved. * Copyright (c) 1993, 1994, 1995 Charles M. Hannum. All rights reserved.
@ -89,6 +89,7 @@
#include <vm/vm_page.h> #include <vm/vm_page.h>
#include <machine/cpu.h> #include <machine/cpu.h>
#include <machine/cpufunc.h>
/* /*
* Allocate various and sundry SYSMAPs used in the days of old VM * Allocate various and sundry SYSMAPs used in the days of old VM
@ -645,7 +646,8 @@ pmap_pinit(pmap)
pmap->pm_pdir = (pd_entry_t *) kmem_alloc(kernel_map, NBPG); pmap->pm_pdir = (pd_entry_t *) kmem_alloc(kernel_map, NBPG);
/* wire in kernel global address entries */ /* wire in kernel global address entries */
bcopy(&PTD[KPTDI], &pmap->pm_pdir[KPTDI], nkpde * sizeof(pd_entry_t)); movsdnu(&PTD[KPTDI], &pmap->pm_pdir[KPTDI],
nkpde * sizeof(pd_entry_t) / 4);
/* install self-referential address mapping entry */ /* install self-referential address mapping entry */
pmap->pm_pdir[PTDPTDI] = pmap->pm_pdir[PTDPTDI] =
@ -1460,7 +1462,7 @@ pmap_zero_page(phys)
pmap_dump_pvlist(phys, "pmap_zero_page: phys"); pmap_dump_pvlist(phys, "pmap_zero_page: phys");
*CMAP2 = (phys & PG_FRAME) | PG_V | PG_KW /*| PG_N*/; *CMAP2 = (phys & PG_FRAME) | PG_V | PG_KW /*| PG_N*/;
pmap_update(); tlbflush_entry(CADDR2);
bzero(CADDR2, NBPG); bzero(CADDR2, NBPG);
} }
@ -1483,8 +1485,9 @@ pmap_copy_page(src, dst)
pmap_dump_pvlist(dst, "pmap_copy_page: dst"); pmap_dump_pvlist(dst, "pmap_copy_page: dst");
*CMAP1 = (src & PG_FRAME) | PG_V | PG_KR; *CMAP1 = (src & PG_FRAME) | PG_V | PG_KR;
*CMAP2 = (dst & PG_FRAME) | PG_V | PG_KW /*| PG_N*/; *CMAP2 = (dst & PG_FRAME) | PG_V | PG_KW /*| PG_N*/;
pmap_update(); tlbflush_entry(CADDR1);
bcopy(CADDR1, CADDR2, NBPG); tlbflush_entry(CADDR2);
movsdnu(CADDR1, CADDR2, NBPG / 4);
} }
/* /*