Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 22 May 2003 20:27:07 -0700 (PDT)
From:      Peter Wemm <peter@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 31670 for review
Message-ID:  <200305230327.h4N3R7iO001064@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=31670

Change 31670 by peter@peter_hammer on 2003/05/22 20:26:20

	re-enable pmap_copy().  Thats all of the stubbed out functions
	repaired.

Affected files ...

.. //depot/projects/hammer/sys/amd64/amd64/pmap.c#11 edit

Differences ...

==== //depot/projects/hammer/sys/amd64/amd64/pmap.c#11 (text+ko) ====

@@ -701,6 +701,16 @@
 }
 
 /*
+ * Are we current address space or kernel?
+ */
+static __inline int
+pmap_is_current(pmap_t pmap)
+{
+	return (pmap == kernel_pmap ||
+	    (pmap->pm_pml4[PML4PML4I] & PG_FRAME) == (PML4pml4e[0] & PG_FRAME));
+}
+
+/*
  *	Routine:	pmap_extract
  *	Function:
  *		Extract the physical page address associated
@@ -2518,7 +2528,6 @@
 pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len,
 	  vm_offset_t src_addr)
 {
-#if 0
 	vm_offset_t addr;
 	vm_offset_t end_addr = src_addr + len;
 	vm_offset_t pdnxt;
@@ -2533,7 +2542,7 @@
 	for (addr = src_addr; addr < end_addr; addr = pdnxt) {
 		pt_entry_t *src_pte, *dst_pte;
 		vm_page_t dstmpte, srcmpte;
-		pd_entry_t srcptepaddr;
+		pd_entry_t srcptepaddr, *pde;
 		unsigned ptepindex;
 
 		if (addr >= UPT_MIN_ADDRESS)
@@ -2551,13 +2560,25 @@
 		pdnxt = (addr + NBPDR) & ~PDRMASK;
 		ptepindex = pmap_pde_pindex(addr);
 
-		srcptepaddr = src_pmap->pm_pdir[ptepindex];
+		pde = pmap_pde(src_pmap, addr);
+		if (pde)
+			srcptepaddr = *pde;
+		else
+			continue;
 		if (srcptepaddr == 0)
 			continue;
 			
 		if (srcptepaddr & PG_PS) {
-			if (dst_pmap->pm_pdir[ptepindex] == 0) {
-				dst_pmap->pm_pdir[ptepindex] = srcptepaddr;
+			pde = pmap_pde(dst_pmap, addr);
+			if (pde == 0) {
+				/*
+				 * XXX should do an allocpte here to
+				 * instantiate the pde
+				 */
+				continue;
+			}
+			if (*pde == 0) {
+				*pde = srcptepaddr;
 				dst_pmap->pm_stats.resident_count +=
 				    NBPDR / PAGE_SIZE;
 			}
@@ -2610,7 +2631,6 @@
 			src_pte++;
 		}
 	}
-#endif
 }	
 
 /*



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200305230327.h4N3R7iO001064>