summaryrefslogtreecommitdiff
path: root/usr/src/uts/i86pc/vm/vm_machdep.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/i86pc/vm/vm_machdep.c')
-rw-r--r--usr/src/uts/i86pc/vm/vm_machdep.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/usr/src/uts/i86pc/vm/vm_machdep.c b/usr/src/uts/i86pc/vm/vm_machdep.c
index ab0ab9181f..8512bdc99f 100644
--- a/usr/src/uts/i86pc/vm/vm_machdep.c
+++ b/usr/src/uts/i86pc/vm/vm_machdep.c
@@ -172,6 +172,7 @@ map_pgsz(int maptype, struct proc *p, caddr_t addr, size_t len, int *remap)
* to be used for mapping application and libraries text segments.
*/
int use_text_largepages = 0;
+int use_shm_largepages = 0;
/*
* Return a bit vector of large page size codes that
@@ -201,6 +202,29 @@ map_execseg_pgszcvec(int text, caddr_t addr, size_t len)
return (1 << 1);
}
+uint_t
+map_shm_pgszcvec(caddr_t addr, size_t len, uintptr_t off)
+{
+ size_t pgsz;
+ caddr_t a;
+
+ if (!use_shm_largepages || mmu.max_page_level == 0) {
+ return (0);
+ }
+
+ pgsz = LEVEL_SIZE(1);
+ a = (caddr_t)P2ROUNDUP((uintptr_t)addr, pgsz);
+ if (a < addr || a >= addr + len ||
+ P2PHASE((uintptr_t)addr ^ off, pgsz)) {
+ return (0);
+ }
+ len -= (a - addr);
+ if (len < pgsz) {
+ return (0);
+ }
+ return (1 << 1);
+}
+
/*
* Handle a pagefault.
*/