Author: bdragon
Date: Sun Sep 13 16:42:49 2020
New Revision: 365690
URL: https://svnweb.freebsd.org/changeset/base/365690

Log:
  [PowerPC64] Implement pmap_mincore() for moea64
  
  Implement pmap_mincore() for moea64.
  
  This will need some slight tweaks when large page support in HPT lands.
  
  Submitted by: Fernando Eckhardt Valle <fernando.va...@eldorado.org.br>
  Reviewed by:  bdragon
  Differential Revision:        https://reviews.freebsd.org/D26314

Modified:
  head/sys/powerpc/aim/mmu_oea64.c

Modified: head/sys/powerpc/aim/mmu_oea64.c
==============================================================================
--- head/sys/powerpc/aim/mmu_oea64.c    Sun Sep 13 16:28:25 2020        
(r365689)
+++ head/sys/powerpc/aim/mmu_oea64.c    Sun Sep 13 16:42:49 2020        
(r365690)
@@ -57,6 +57,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/lock.h>
 #include <sys/msgbuf.h>
 #include <sys/malloc.h>
+#include <sys/mman.h>
 #include <sys/mutex.h>
 #include <sys/proc.h>
 #include <sys/rwlock.h>
@@ -72,6 +73,7 @@ __FBSDID("$FreeBSD$");
 #include <dev/ofw/openfirm.h>
 
 #include <vm/vm.h>
+#include <vm/pmap.h>
 #include <vm/vm_param.h>
 #include <vm/vm_kern.h>
 #include <vm/vm_page.h>
@@ -315,6 +317,7 @@ static void *moea64_dump_pmap_init(unsigned blkpgs);
 #ifdef __powerpc64__
 static void moea64_page_array_startup(long);
 #endif
+static int moea64_mincore(pmap_t, vm_offset_t, vm_paddr_t *);
 
 static struct pmap_funcs moea64_methods = {
        .clear_modify = moea64_clear_modify,
@@ -331,6 +334,7 @@ static struct pmap_funcs moea64_methods = {
        .is_referenced = moea64_is_referenced,
        .ts_referenced = moea64_ts_referenced,
        .map =                  moea64_map,
+       .mincore = moea64_mincore,
        .page_exists_quick = moea64_page_exists_quick,
        .page_init = moea64_page_init,
        .page_wired_mappings = moea64_page_wired_mappings,
@@ -1219,6 +1223,51 @@ moea64_unwire(pmap_t pm, vm_offset_t sva, vm_offset_t 
                pm->pm_stats.wired_count--;
        }
        PMAP_UNLOCK(pm);
+}
+
+static int
+moea64_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t *pap)
+{
+       struct pvo_entry *pvo;
+       vm_paddr_t pa;
+       vm_page_t m;
+       int val;
+       bool managed;
+
+       PMAP_LOCK(pmap);
+
+       /* XXX Add support for superpages */
+       pvo = moea64_pvo_find_va(pmap, addr);
+       if (pvo != NULL) {
+               pa = PVO_PADDR(pvo);
+               m = PHYS_TO_VM_PAGE(pa);
+               managed = (pvo->pvo_vaddr & PVO_MANAGED) == PVO_MANAGED;
+               val = MINCORE_INCORE;
+       } else {
+               PMAP_UNLOCK(pmap);
+               return (0);
+       }
+
+       PMAP_UNLOCK(pmap);
+
+       if (m == NULL)
+               return (0);
+
+       if (managed) {
+               if (moea64_is_modified(m))
+                       val |= MINCORE_MODIFIED | MINCORE_MODIFIED_OTHER;
+
+               if (moea64_is_referenced(m))
+                       val |= MINCORE_REFERENCED | MINCORE_REFERENCED_OTHER;
+       }
+
+       if ((val & (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER)) !=
+           (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER) &&
+           managed) {
+               *pap = pa;
+       }
+
+       return (val);
 }
 
 /*
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to