--- //depot/vendor/freebsd/src/sys/amd64/amd64/pmap.c 2009/03/22 04:36:22 +++ //depot/user/jhb/pat/amd64/amd64/pmap.c 2009/04/28 13:50:13 @@ -221,18 +221,20 @@ vm_offset_t va); static int pmap_pvh_wired_mappings(struct md_page *pvh, int count); -static int pmap_change_attr_locked(vm_offset_t va, vm_size_t size, int mode); +static int pmap_change_attr_locked(vm_offset_t va, vm_size_t size, + vm_cache_mode_t mode); static boolean_t pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va); static boolean_t pmap_demote_pdpe(pmap_t pmap, pdp_entry_t *pdpe, vm_offset_t va); static boolean_t pmap_enter_pde(pmap_t pmap, vm_offset_t va, vm_page_t m, - vm_prot_t prot); + vm_cache_mode_t mode, vm_prot_t prot); static vm_page_t pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, - vm_page_t m, vm_prot_t prot, vm_page_t mpte); + vm_page_t m, vm_cache_mode_t mode, vm_prot_t prot, vm_page_t mpte); static void pmap_fill_ptp(pt_entry_t *firstpte, pt_entry_t newpte); static void pmap_insert_pt_page(pmap_t pmap, vm_page_t mpte); static boolean_t pmap_is_modified_pvh(struct md_page *pvh); -static void pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, int mode); +static void pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, + vm_cache_mode_t mode); static vm_page_t pmap_lookup_pt_page(pmap_t pmap, vm_offset_t va); static void pmap_pde_attr(pd_entry_t *pde, int cache_bits); static void pmap_promote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va); @@ -744,7 +746,7 @@ * caching mode. */ static int -pmap_cache_bits(int mode, boolean_t is_pde) +pmap_cache_bits(vm_cache_mode_t mode, boolean_t is_pde) { int pat_flag, pat_index, cache_bits; @@ -1061,7 +1063,7 @@ } static __inline void -pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, int mode) +pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, vm_cache_mode_t mode) { pt_entry_t *pte; @@ -2905,7 +2919,7 @@ */ void pmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m, - vm_prot_t prot, boolean_t wired) + vm_cache_mode_t mode, vm_prot_t prot, boolean_t wired) { vm_paddr_t pa; pd_entry_t *pde; @@ -3030,6 +3044,7 @@ newpte |= PG_U; if (pmap == kernel_pmap) newpte |= PG_G; + newpte |= pmap_cache_bits(mode, 0); /* * if the mapping or permission bits are different, we need @@ -3080,7 +3095,8 @@ * (3) a pv entry cannot be allocated without reclaiming another pv entry. */ static boolean_t -pmap_enter_pde(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot) +pmap_enter_pde(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_cache_mode_t mode, + vm_prot_t prot) { pd_entry_t *pde, newpde; vm_page_t free, mpde; @@ -3102,7 +3118,7 @@ " in pmap %p", va, pmap); return (FALSE); } - newpde = VM_PAGE_TO_PHYS(m) | PG_PS | PG_V; + newpde = VM_PAGE_TO_PHYS(m) | PG_PS | PG_V | pmap_cache_bits(mode, 1); if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) { newpde |= PG_MANAGED; @@ -3155,7 +3171,7 @@ */ void pmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end, - vm_page_t m_start, vm_prot_t prot) + vm_page_t m_start, vm_cache_mode_t mode, vm_prot_t prot) { vm_offset_t va; vm_page_t m, mpte; @@ -3171,10 +3187,10 @@ if ((va & PDRMASK) == 0 && va + NBPDR <= end && (VM_PAGE_TO_PHYS(m) & PDRMASK) == 0 && pg_ps_enabled && vm_reserv_level_iffullpop(m) == 0 && - pmap_enter_pde(pmap, va, m, prot)) + pmap_enter_pde(pmap, va, m, mode, prot)) m = &m[NBPDR / PAGE_SIZE - 1]; else - mpte = pmap_enter_quick_locked(pmap, va, m, prot, + mpte = pmap_enter_quick_locked(pmap, va, m, mode, prot, mpte); m = TAILQ_NEXT(m, listq); } @@ -3191,17 +3207,18 @@ */ void -pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot) +pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_cache_mode_t mode, + vm_prot_t prot) { PMAP_LOCK(pmap); - (void) pmap_enter_quick_locked(pmap, va, m, prot, NULL); + (void) pmap_enter_quick_locked(pmap, va, m, mode, prot, NULL); PMAP_UNLOCK(pmap); } static vm_page_t pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, - vm_prot_t prot, vm_page_t mpte) + vm_cache_mode_t mode, vm_prot_t prot, vm_page_t mpte) { vm_page_t free; pt_entry_t *pte; @@ -3287,6 +3304,7 @@ pa = VM_PAGE_TO_PHYS(m); if ((prot & VM_PROT_EXECUTE) == 0) pa |= pg_nx; + pa |= pmap_cache_bits(mode, 0); /* * Now validate mapping with RO protection @@ -3319,8 +3337,8 @@ * are taken, but the code works. */ void -pmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_object_t object, - vm_pindex_t pindex, vm_size_t size) +pmap_object_init_pt(pmap_t pmap, vm_cache_mode_t mode, vm_offset_t addr, + vm_object_t object, vm_pindex_t pindex, vm_size_t size) { vm_offset_t va; vm_page_t p, pdpg; @@ -3381,7 +3399,8 @@ pde = &pde[pmap_pde_index(va)]; if ((*pde & PG_V) == 0) { pde_store(pde, ptepa | PG_PS | PG_M | PG_A | - PG_U | PG_RW | PG_V); + PG_U | PG_RW | PG_V | + pmap_cache_bits(mode, 1)); pmap->pm_stats.resident_count += NBPDR / PAGE_SIZE; } else { @@ -4251,7 +4270,7 @@ * NOT real memory. */ void * -pmap_mapdev_attr(vm_paddr_t pa, vm_size_t size, int mode) +pmap_mapdev_attr(vm_paddr_t pa, vm_size_t size, vm_cache_mode_t mode) { vm_offset_t va, tmpva, offset; @@ -4386,7 +4405,7 @@ * virtual address range or the direct map. */ int -pmap_change_attr(vm_offset_t va, vm_size_t size, int mode) +pmap_change_attr(vm_offset_t va, vm_size_t size, vm_cache_mode_t mode) { int error; @@ -4397,7 +4416,7 @@ } static int -pmap_change_attr_locked(vm_offset_t va, vm_size_t size, int mode) +pmap_change_attr_locked(vm_offset_t va, vm_size_t size, vm_cache_mode_t mode) { vm_offset_t base, offset, tmpva; vm_paddr_t pa_start, pa_end; --- //depot/vendor/freebsd/src/sys/amd64/include/pmap.h 2009/03/22 19:00:41 +++ //depot/user/jhb/pat/amd64/include/pmap.h 2009/04/24 21:22:25 @@ -45,6 +45,8 @@ #ifndef _MACHINE_PMAP_H_ #define _MACHINE_PMAP_H_ +#include + /* * Page-directory and page-table entries follow this format, with a few * of the fields not present here and there, depending on a lot of things. @@ -175,9 +177,7 @@ #define PML4pml4e ((pd_entry_t *)(addr_PML4pml4e)) extern u_int64_t KPML4phys; /* physical address of kernel level 4 */ -#endif -#ifdef _KERNEL /* * virtual address to page table entry and * to physical address. @@ -227,6 +227,16 @@ #endif /* _KERNEL */ +/* Caching modes. */ +#define VM_CACHE_UNCACHEABLE ((vm_cache_mode_t) PAT_UNCACHEABLE) +#define VM_CACHE_WRITE_COMBINING ((vm_cache_mode_t) PAT_WRITE_COMBINING) +#define VM_CACHE_WRITE_THROUGH ((vm_cache_mode_t) PAT_WRITE_THROUGH) +#define VM_CACHE_WRITE_PROTECTED ((vm_cache_mode_t) PAT_WRITE_PROTECTED) +#define VM_CACHE_WRITE_BACK ((vm_cache_mode_t) PAT_WRITE_BACK) +#define VM_CACHE_UNCACHED ((vm_cache_mode_t) PAT_UNCACHED) + +#define VM_CACHE_DEFAULT VM_CACHE_WRITE_BACK + /* * Pmap stuff */ @@ -312,7 +322,7 @@ #define pmap_unmapbios(va, sz) pmap_unmapdev((va), (sz)) void pmap_bootstrap(vm_paddr_t *); -int pmap_change_attr(vm_offset_t, vm_size_t, int); +int pmap_change_attr(vm_offset_t, vm_size_t, vm_cache_mode_t); void pmap_init_pat(void); void pmap_kenter(vm_offset_t va, vm_paddr_t pa); void *pmap_kenter_temporary(vm_paddr_t pa, int i); @@ -320,7 +330,7 @@ void pmap_kremove(vm_offset_t); void *pmap_mapbios(vm_paddr_t, vm_size_t); void *pmap_mapdev(vm_paddr_t, vm_size_t); -void *pmap_mapdev_attr(vm_paddr_t, vm_size_t, int); +void *pmap_mapdev_attr(vm_paddr_t, vm_size_t, vm_cache_mode_t); boolean_t pmap_page_is_mapped(vm_page_t m); void pmap_unmapdev(vm_offset_t, vm_size_t); void pmap_invalidate_page(pmap_t, vm_offset_t); --- //depot/vendor/freebsd/src/sys/i386/i386/pmap.c 2009/03/14 15:40:14 +++ //depot/user/jhb/pat/i386/i386/pmap.c 2009/05/09 04:01:19 @@ -283,12 +283,13 @@ static boolean_t pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va); static boolean_t pmap_enter_pde(pmap_t pmap, vm_offset_t va, vm_page_t m, - vm_prot_t prot); + vm_cache_mode_t mode, vm_prot_t prot); static vm_page_t pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, - vm_page_t m, vm_prot_t prot, vm_page_t mpte); + vm_page_t m, vm_cache_mode_t mode, vm_prot_t prot, vm_page_t mpte); static void pmap_insert_pt_page(pmap_t pmap, vm_page_t mpte); static boolean_t pmap_is_modified_pvh(struct md_page *pvh); -static void pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, int mode); +static void pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, + vm_cache_mode_t mode); static vm_page_t pmap_lookup_pt_page(pmap_t pmap, vm_offset_t va); static void pmap_promote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va); static boolean_t pmap_protect_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t sva, @@ -735,7 +736,7 @@ * caching mode. */ static int -pmap_cache_bits(int mode, boolean_t is_pde) +pmap_cache_bits(vm_cache_mode_t mode, boolean_t is_pde) { int pat_flag, pat_index, cache_bits; @@ -1144,7 +1145,7 @@ } static __inline void -pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, int mode) +pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, vm_cache_mode_t mode) { pt_entry_t *pte; @@ -3018,7 +3019,7 @@ */ void pmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m, - vm_prot_t prot, boolean_t wired) + vm_cache_mode_t mode, vm_prot_t prot, boolean_t wired) { vm_paddr_t pa; pd_entry_t *pde; @@ -3151,6 +3152,7 @@ newpte |= PG_U; if (pmap == kernel_pmap) newpte |= pgeflag; + newpte |= pmap_cache_bits(mode, 0); /* * if the mapping or permission bits are different, we need @@ -3206,7 +3208,8 @@ * (3) a pv entry cannot be allocated without reclaiming another pv entry. */ static boolean_t -pmap_enter_pde(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot) +pmap_enter_pde(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_cache_mode_t mode, + vm_prot_t prot) { pd_entry_t *pde, newpde; @@ -3218,7 +3221,7 @@ " in pmap %p", va, pmap); return (FALSE); } - newpde = VM_PAGE_TO_PHYS(m) | PG_PS | PG_V; + newpde = VM_PAGE_TO_PHYS(m) | PG_PS | PG_V | pmap_cache_bits(mode, 1); if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) { newpde |= PG_MANAGED; @@ -3268,7 +3271,7 @@ */ void pmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end, - vm_page_t m_start, vm_prot_t prot) + vm_page_t m_start, vm_cache_mode_t mode, vm_prot_t prot) { vm_offset_t va; vm_page_t m, mpte; @@ -3284,10 +3287,10 @@ if ((va & PDRMASK) == 0 && va + NBPDR <= end && (VM_PAGE_TO_PHYS(m) & PDRMASK) == 0 && pg_ps_enabled && vm_reserv_level_iffullpop(m) == 0 && - pmap_enter_pde(pmap, va, m, prot)) + pmap_enter_pde(pmap, va, m, mode, prot)) m = &m[NBPDR / PAGE_SIZE - 1]; else - mpte = pmap_enter_quick_locked(pmap, va, m, prot, + mpte = pmap_enter_quick_locked(pmap, va, m, mode, prot, mpte); m = TAILQ_NEXT(m, listq); } @@ -3304,17 +3307,18 @@ */ void -pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot) +pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_cache_mode_t mode, + vm_prot_t prot) { PMAP_LOCK(pmap); - (void) pmap_enter_quick_locked(pmap, va, m, prot, NULL); + (void) pmap_enter_quick_locked(pmap, va, m, mode, prot, NULL); PMAP_UNLOCK(pmap); } static vm_page_t pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, - vm_prot_t prot, vm_page_t mpte) + vm_cache_mode_t mode, vm_prot_t prot, vm_page_t mpte) { pt_entry_t *pte; vm_paddr_t pa; @@ -3408,6 +3412,7 @@ if ((prot & VM_PROT_EXECUTE) == 0) pa |= pg_nx; #endif + pa |= pmap_cache_bits(mode, 0); /* * Now validate mapping with RO protection @@ -3440,8 +3445,8 @@ * are taken, but the code works. */ void -pmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_object_t object, - vm_pindex_t pindex, vm_size_t size) +pmap_object_init_pt(pmap_t pmap, vm_cache_mode_t mode, vm_offset_t addr, + vm_object_t object, vm_pindex_t pindex, vm_size_t size) { vm_page_t p; @@ -3493,7 +3498,8 @@ npdes = size >> PDRSHIFT; for(i = 0; i < npdes; i++) { pde_store(&pmap->pm_pdir[ptepindex], - ptepa | PG_U | PG_RW | PG_V | PG_PS); + ptepa | PG_U | PG_RW | PG_V | PG_PS | + pmap_cache_bits(mode, 1)); ptepa += NBPDR; ptepindex += 1; } @@ -4388,7 +4394,7 @@ * NOT real memory. */ void * -pmap_mapdev_attr(vm_paddr_t pa, vm_size_t size, int mode) +pmap_mapdev_attr(vm_paddr_t pa, vm_size_t size, vm_cache_mode_t mode) { vm_offset_t va, tmpva, offset; @@ -4445,7 +4451,7 @@ } int -pmap_change_attr(vm_offset_t va, vm_size_t size, int mode) +pmap_change_attr(vm_offset_t va, vm_size_t size, vm_cache_mode_t mode) { vm_offset_t base, offset, tmpva; pt_entry_t *pte; --- //depot/vendor/freebsd/src/sys/i386/include/cpufunc.h 2009/04/11 14:05:16 +++ //depot/user/jhb/pat/i386/include/cpufunc.h 2009/05/09 03:44:43 @@ -620,6 +620,20 @@ __asm __volatile("movl %0,%%dr7" : : "r" (dr7)); } +static __inline u_char +read_cyrix_reg(u_char reg) +{ + outb(0x22, reg); + return inb(0x23); +} + +static __inline void +write_cyrix_reg(u_char reg, u_char data) +{ + outb(0x22, reg); + outb(0x23, data); +} + static __inline register_t intr_disable(void) { @@ -702,6 +716,7 @@ u_int rdr6(void); u_int rdr7(void); uint64_t rdtsc(void); +u_char read_cyrix_reg(u_char reg); u_int read_eflags(void); u_int rfs(void); uint64_t rgdt(void); @@ -710,6 +725,7 @@ u_short rldt(void); u_short rtr(void); void wbinvd(void); +void write_cyrix_reg(u_char reg, u_char data); void write_eflags(u_int ef); void wrmsr(u_int msr, uint64_t newval); --- //depot/vendor/freebsd/src/sys/i386/include/pmap.h 2009/03/22 19:00:41 +++ //depot/user/jhb/pat/i386/include/pmap.h 2009/05/09 03:04:30 @@ -44,6 +44,8 @@ #ifndef _MACHINE_PMAP_H_ #define _MACHINE_PMAP_H_ +#include + /* * Page-directory and page-table entries follow this format, with a few * of the fields not present here and there, depending on a lot of things. @@ -185,9 +187,7 @@ extern pdpt_entry_t *IdlePDPT; #endif extern pd_entry_t *IdlePTD; /* physical address of "Idle" state directory */ -#endif -#ifdef _KERNEL /* * virtual address to page table entry and * to physical address. @@ -390,6 +390,16 @@ #endif /* _KERNEL */ +/* Caching modes. */ +#define VM_CACHE_UNCACHEABLE ((vm_cache_mode_t) PAT_UNCACHEABLE) +#define VM_CACHE_WRITE_COMBINING ((vm_cache_mode_t) PAT_WRITE_COMBINING) +#define VM_CACHE_WRITE_THROUGH ((vm_cache_mode_t) PAT_WRITE_THROUGH) +#define VM_CACHE_WRITE_PROTECTED ((vm_cache_mode_t) PAT_WRITE_PROTECTED) +#define VM_CACHE_WRITE_BACK ((vm_cache_mode_t) PAT_WRITE_BACK) +#define VM_CACHE_UNCACHED ((vm_cache_mode_t) PAT_UNCACHED) + +#define VM_CACHE_DEFAULT VM_CACHE_WRITE_BACK + /* * Pmap stuff */ @@ -478,14 +488,14 @@ #define pmap_unmapbios(va, sz) pmap_unmapdev((va), (sz)) void pmap_bootstrap(vm_paddr_t); -int pmap_change_attr(vm_offset_t, vm_size_t, int); +int pmap_change_attr(vm_offset_t, vm_size_t, vm_cache_mode_t); void pmap_init_pat(void); void pmap_kenter(vm_offset_t va, vm_paddr_t pa); void *pmap_kenter_temporary(vm_paddr_t pa, int i); void pmap_kremove(vm_offset_t); void *pmap_mapbios(vm_paddr_t, vm_size_t); void *pmap_mapdev(vm_paddr_t, vm_size_t); -void *pmap_mapdev_attr(vm_paddr_t, vm_size_t, int); +void *pmap_mapdev_attr(vm_paddr_t, vm_size_t, vm_cache_mode_t); boolean_t pmap_page_is_mapped(vm_page_t m); void pmap_unmapdev(vm_offset_t, vm_size_t); pt_entry_t *pmap_pte(pmap_t, vm_offset_t) __pure2; --- //depot/vendor/freebsd/src/sys/i386/include/specialreg.h 2009/04/29 07:00:14 +++ //depot/user/jhb/pat/i386/include/specialreg.h 2009/05/09 03:44:43 @@ -547,20 +547,4 @@ #define VIA_CRYPT_CWLO_KEY192 0x0000040c /* 192bit, 12 rds */ #define VIA_CRYPT_CWLO_KEY256 0x0000080e /* 256bit, 15 rds */ -#ifndef LOCORE -static __inline u_char -read_cyrix_reg(u_char reg) -{ - outb(0x22, reg); - return inb(0x23); -} - -static __inline void -write_cyrix_reg(u_char reg, u_char data) -{ - outb(0x22, reg); - outb(0x23, data); -} -#endif - #endif /* !_MACHINE_SPECIALREG_H_ */ --- //depot/vendor/freebsd/src/sys/kern/kern_subr.c 2008/08/29 20:38:26 +++ //depot/user/jhb/pat/kern/kern_subr.c 2009/04/24 20:02:30 @@ -82,6 +82,7 @@ vm_object_t uobject; vm_map_entry_t entry; vm_pindex_t upindex; + vm_cache_mode_t mode; vm_prot_t prot; boolean_t wired; @@ -99,7 +100,7 @@ if ((vm_map_lookup(&map, uaddr, VM_PROT_WRITE, &entry, &uobject, - &upindex, &prot, &wired)) != KERN_SUCCESS) { + &upindex, &mode, &prot, &wired)) != KERN_SUCCESS) { return(EFAULT); } VM_OBJECT_LOCK(uobject); --- //depot/vendor/freebsd/src/sys/kern/kern_umtx.c 2009/04/13 05:25:16 +++ //depot/user/jhb/pat/kern/kern_umtx.c 2009/04/24 20:02:30 @@ -507,6 +507,7 @@ vm_map_t map; vm_map_entry_t entry; vm_pindex_t pindex; + vm_cache_mode_t mode; vm_prot_t prot; boolean_t wired; @@ -519,7 +520,7 @@ MPASS(share == PROCESS_SHARE || share == AUTO_SHARE); map = &td->td_proc->p_vmspace->vm_map; if (vm_map_lookup(&map, (vm_offset_t)addr, VM_PROT_WRITE, - &entry, &key->info.shared.object, &pindex, &prot, + &entry, &key->info.shared.object, &pindex, &mode, &prot, &wired) != KERN_SUCCESS) { return EFAULT; } --- //depot/vendor/freebsd/src/sys/kern/sys_process.c 2009/03/03 17:25:44 +++ //depot/user/jhb/pat/kern/sys_process.c 2009/05/04 21:10:07 @@ -244,6 +244,7 @@ vm_offset_t uva; int page_offset; /* offset into page */ vm_map_entry_t out_entry; + vm_cache_mode_t out_mode; vm_prot_t out_prot; boolean_t wired; vm_pindex_t pindex; @@ -275,14 +276,15 @@ } /* - * Now we need to get the page. out_entry, out_prot, wired, - * and single_use aren't used. One would think the vm code - * would be a *bit* nicer... We use tmap because - * vm_map_lookup() can change the map argument. + * Now we need to get the page. out_entry, out_mode, + * out_prot, wired, and single_use aren't used. One + * would think the vm code would be a *bit* nicer... + * We use tmap because vm_map_lookup() can change the + * map argument. */ tmap = map; error = vm_map_lookup(&tmap, pageno, reqprot, &out_entry, - &object, &pindex, &out_prot, &wired); + &object, &pindex, &out_mode, &out_prot, &wired); if (error) { error = EFAULT; break; --- //depot/vendor/freebsd/src/sys/vm/pmap.h 2008/05/18 04:21:46 +++ //depot/user/jhb/pat/vm/pmap.h 2009/04/27 20:07:25 @@ -92,17 +92,18 @@ void pmap_align_superpage(vm_object_t, vm_ooffset_t, vm_offset_t *, vm_size_t); void pmap_change_wiring(pmap_t, vm_offset_t, boolean_t); void pmap_clear_modify(vm_page_t m); void pmap_clear_reference(vm_page_t m); void pmap_copy(pmap_t, pmap_t, vm_offset_t, vm_size_t, vm_offset_t); void pmap_copy_page(vm_page_t, vm_page_t); void pmap_enter(pmap_t, vm_offset_t, vm_prot_t, vm_page_t, - vm_prot_t, boolean_t); + vm_cache_mode_t, vm_prot_t, boolean_t); void pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, + vm_cache_mode_t mode, vm_prot_t prot); +void pmap_enter_object(pmap_t pmap, vm_offset_t start, + vm_offset_t end, vm_page_t m_start, vm_cache_mode_t mode, vm_prot_t prot); -void pmap_enter_object(pmap_t pmap, vm_offset_t start, - vm_offset_t end, vm_page_t m_start, vm_prot_t prot); vm_paddr_t pmap_extract(pmap_t pmap, vm_offset_t va); vm_page_t pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot); @@ -112,8 +114,9 @@ boolean_t pmap_is_prefaultable(pmap_t pmap, vm_offset_t va); boolean_t pmap_ts_referenced(vm_page_t m); vm_offset_t pmap_map(vm_offset_t *, vm_paddr_t, vm_paddr_t, int); -void pmap_object_init_pt(pmap_t pmap, vm_offset_t addr, - vm_object_t object, vm_pindex_t pindex, vm_size_t size); +void pmap_object_init_pt(pmap_t pmap, vm_cache_mode_t mode, + vm_offset_t addr, vm_object_t object, vm_pindex_t pindex, + vm_size_t size); boolean_t pmap_page_exists_quick(pmap_t pmap, vm_page_t m); void pmap_page_init(vm_page_t m); int pmap_page_wired_mappings(vm_page_t m); --- //depot/vendor/freebsd/src/sys/vm/vm.h 2007/12/27 17:11:27 +++ //depot/user/jhb/pat/vm/vm.h 2009/04/29 12:13:06 @@ -61,6 +61,10 @@ #ifndef VM_H #define VM_H +typedef char vm_cache_mode_t; /* caching mode */ + +/* Specific caching modes are MD and defined in */ + typedef char vm_inherit_t; /* inheritance codes */ #define VM_INHERIT_SHARE ((vm_inherit_t) 0) --- //depot/vendor/freebsd/src/sys/vm/vm_fault.c 2009/04/26 20:55:21 +++ //depot/user/jhb/pat/vm/vm_fault.c 2009/05/13 21:53:52 @@ -210,6 +210,7 @@ vm_fault(vm_map_t map, vm_offset_t vaddr, vm_prot_t fault_type, int fault_flags) { + vm_cache_mode_t mode; vm_prot_t prot; int is_first_object_locked, result; boolean_t are_queues_locked, growstack, wired; @@ -237,7 +238,7 @@ */ fs.map = map; result = vm_map_lookup(&fs.map, vaddr, fault_type, &fs.entry, - &fs.first_object, &fs.first_pindex, &prot, &wired); + &fs.first_object, &fs.first_pindex, &mode, &prot, &wired); if (result != KERN_SUCCESS) { if (result != KERN_PROTECTION_FAILURE || (fault_flags & VM_FAULT_WIRE_MASK) != VM_FAULT_USER_WIRE) { @@ -261,7 +262,8 @@ */ result = vm_map_lookup(&fs.map, vaddr, VM_PROT_READ|VM_PROT_WRITE|VM_PROT_OVERRIDE_WRITE, - &fs.entry, &fs.first_object, &fs.first_pindex, &prot, &wired); + &fs.entry, &fs.first_object, &fs.first_pindex, &mode, + &prot, &wired); if (result != KERN_SUCCESS) return (result); @@ -830,7 +833,8 @@ fs.lookup_still_valid = TRUE; if (fs.map->timestamp != map_generation) { result = vm_map_lookup_locked(&fs.map, vaddr, fault_type, - &fs.entry, &retry_object, &retry_pindex, &retry_prot, &wired); + &fs.entry, &retry_object, &retry_pindex, &mode, + &retry_prot, &wired); /* * If we don't need the page any longer, put it on the inactive @@ -929,7 +933,7 @@ * back on the active queue until later so that the pageout daemon * won't find it (yet). */ - pmap_enter(fs.map->pmap, vaddr, fault_type, fs.m, prot, wired); + pmap_enter(fs.map->pmap, vaddr, fault_type, fs.m, mode, prot, wired); if (((fault_flags & VM_FAULT_WIRE_MASK) == 0) && (wired == 0)) { vm_fault_prefault(fs.map->pmap, vaddr, fs.entry); } @@ -1028,7 +1032,8 @@ (m->flags & PG_FICTITIOUS) == 0) { vm_page_lock_queues(); - pmap_enter_quick(pmap, addr, m, entry->protection); + pmap_enter_quick(pmap, addr, m, entry->cache_mode, + entry->protection); vm_page_unlock_queues(); } VM_OBJECT_UNLOCK(lobject); @@ -1220,7 +1225,7 @@ * Enter it in the pmap as a read and/or execute access. */ pmap_enter(dst_map->pmap, vaddr, prot & ~VM_PROT_WRITE, dst_m, - prot, FALSE); + dst_entry->cache_mode, prot, FALSE); /* * Mark it no longer busy, and put it on the active list. --- //depot/vendor/freebsd/src/sys/vm/vm_kern.c 2009/02/24 21:00:14 +++ //depot/user/jhb/pat/vm/vm_kern.c 2009/05/14 19:54:38 @@ -396,8 +396,8 @@ /* * Because this is kernel_pmap, this call will not block. */ - pmap_enter(kernel_pmap, addr + i, VM_PROT_ALL, m, VM_PROT_ALL, - TRUE); + pmap_enter(kernel_pmap, addr + i, VM_PROT_ALL, m, + VM_CACHE_DEFAULT, VM_PROT_ALL, TRUE); vm_page_wakeup(m); } VM_OBJECT_UNLOCK(kmem_object); --- //depot/vendor/freebsd/src/sys/vm/vm_map.c 2009/04/19 00:36:08 +++ //depot/user/jhb/pat/vm/vm_map.c 2009/05/14 19:54:38 @@ -1076,6 +1076,7 @@ vm_map_entry_t prev_entry; vm_map_entry_t temp_entry; vm_eflags_t protoeflags; + vm_cache_mode_t mode; VM_MAP_ASSERT_LOCKED(map); @@ -1118,6 +1119,7 @@ if (cow & MAP_DISABLE_COREDUMP) protoeflags |= MAP_ENTRY_NOCOREDUMP; + mode = VM_CACHE_DEFAULT; if (object != NULL) { /* * OBJ_ONEMAPPING must be cleared unless this mapping @@ -1127,6 +1129,7 @@ * aliases with precision.) */ VM_OBJECT_LOCK(object); + mode = object->cache_mode; if (object->ref_count > 1 || object->shadow_count != 0) vm_object_clear_flag(object, OBJ_ONEMAPPING); VM_OBJECT_UNLOCK(object); @@ -1146,6 +1149,7 @@ * new range as well. */ if ((prev_entry->inheritance == VM_INHERIT_DEFAULT) && + (prev_entry->cache_mode == mode) && (prev_entry->protection == prot) && (prev_entry->max_protection == max)) { map->size += (end - prev_entry->end); @@ -1186,6 +1190,7 @@ new_entry->avail_ssize = 0; new_entry->inheritance = VM_INHERIT_DEFAULT; + new_entry->cache_mode = mode; new_entry->protection = prot; new_entry->max_protection = max; new_entry->wired_count = 0; @@ -1209,7 +1214,7 @@ #endif if (cow & (MAP_PREFAULT|MAP_PREFAULT_PARTIAL)) { - vm_map_pmap_enter(map, start, prot, + vm_map_pmap_enter(map, start, mode, prot, object, OFF_TO_IDX(offset), end - start, cow & MAP_PREFAULT_PARTIAL); } @@ -1395,6 +1400,7 @@ (!prev->object.vm_object || (prev->offset + prevsize == entry->offset)) && (prev->eflags == entry->eflags) && + (prev->cache_mode == entry->cache_mode) && (prev->protection == entry->protection) && (prev->max_protection == entry->max_protection) && (prev->inheritance == entry->inheritance) && @@ -1428,6 +1434,7 @@ (!entry->object.vm_object || (entry->offset + esize == next->offset)) && (next->eflags == entry->eflags) && + (next->cache_mode == entry->cache_mode) && (next->protection == entry->protection) && (next->max_protection == entry->max_protection) && (next->inheritance == entry->inheritance) && @@ -1625,8 +1632,9 @@ * cached pages are not reactivated and mapped. */ void -vm_map_pmap_enter(vm_map_t map, vm_offset_t addr, vm_prot_t prot, - vm_object_t object, vm_pindex_t pindex, vm_size_t size, int flags) +vm_map_pmap_enter(vm_map_t map, vm_offset_t addr, vm_cache_mode_t mode, + vm_prot_t prot, vm_object_t object, vm_pindex_t pindex, vm_size_t size, + int flags) { vm_offset_t start; vm_page_t p, p_start; @@ -1637,7 +1645,7 @@ return; VM_OBJECT_LOCK(object); if (object->type == OBJT_DEVICE) { - pmap_object_init_pt(map->pmap, addr, object, pindex, size); + pmap_object_init_pt(map->pmap, mode, addr, object, pindex, size); goto unlock_return; } @@ -1694,7 +1702,7 @@ vm_page_lock_queues(); } pmap_enter_object(map->pmap, start, addr + - ptoa(tmpidx), p_start, prot); + ptoa(tmpidx), p_start, mode, prot); p_start = NULL; } } @@ -1704,7 +1712,7 @@ vm_page_lock_queues(); } pmap_enter_object(map->pmap, start, addr + ptoa(psize), - p_start, prot); + p_start, mode, prot); } if (are_queues_locked) vm_page_unlock_queues(); @@ -1930,6 +1986,7 @@ if (behav == MADV_WILLNEED) { vm_map_pmap_enter(map, useStart, + current->cache_mode, current->protection, current->object.vm_object, pindex, @@ -3269,7 +3330,7 @@ /* * vm_map_lookup: * - * Finds the VM object, offset, and + * Finds the VM object, offset, cache mode, and * protection for a given virtual address in the * specified map, assuming a page fault of the * type specified. @@ -3295,6 +3356,7 @@ vm_map_entry_t *out_entry, /* OUT */ vm_object_t *object, /* OUT */ vm_pindex_t *pindex, /* OUT */ + vm_cache_mode_t *out_mode, /* OUT */ vm_prot_t *out_prot, /* OUT */ boolean_t *wired) /* OUT */ { @@ -3416,6 +3478,7 @@ *pindex = OFF_TO_IDX((vaddr - entry->start) + entry->offset); *object = entry->object.vm_object; + *out_mode = entry->cache_mode; *out_prot = prot; return (KERN_SUCCESS); } @@ -3433,6 +3496,7 @@ vm_map_entry_t *out_entry, /* OUT */ vm_object_t *object, /* OUT */ vm_pindex_t *pindex, /* OUT */ + vm_cache_mode_t *out_mode, /* OUT */ vm_prot_t *out_prot, /* OUT */ boolean_t *wired) /* OUT */ { @@ -3508,6 +3572,7 @@ *pindex = OFF_TO_IDX((vaddr - entry->start) + entry->offset); *object = entry->object.vm_object; + *out_mode = entry->cache_mode; *out_prot = prot; return (KERN_SUCCESS); } --- //depot/vendor/freebsd/src/sys/vm/vm_map.h 2009/04/10 10:20:14 +++ //depot/user/jhb/pat/vm/vm_map.h 2009/05/14 19:54:38 @@ -109,6 +109,7 @@ union vm_map_object object; /* object I point to */ vm_ooffset_t offset; /* offset into object */ vm_eflags_t eflags; /* map entry flags */ + vm_cache_mode_t cache_mode; /* caching mode */ vm_prot_t protection; /* protection code */ vm_prot_t max_protection; /* maximum protection */ vm_inherit_t inheritance; /* inheritance */ @@ -349,13 +351,14 @@ void vm_map_init (struct vm_map *, vm_offset_t, vm_offset_t); int vm_map_insert (vm_map_t, vm_object_t, vm_ooffset_t, vm_offset_t, vm_offset_t, vm_prot_t, vm_prot_t, int); int vm_map_lookup (vm_map_t *, vm_offset_t, vm_prot_t, vm_map_entry_t *, vm_object_t *, - vm_pindex_t *, vm_prot_t *, boolean_t *); + vm_pindex_t *, vm_cache_mode_t *, vm_prot_t *, boolean_t *); int vm_map_lookup_locked(vm_map_t *, vm_offset_t, vm_prot_t, vm_map_entry_t *, vm_object_t *, - vm_pindex_t *, vm_prot_t *, boolean_t *); + vm_pindex_t *, vm_cache_mode_t *, vm_prot_t *, boolean_t *); void vm_map_lookup_done (vm_map_t, vm_map_entry_t); boolean_t vm_map_lookup_entry (vm_map_t, vm_offset_t, vm_map_entry_t *); -void vm_map_pmap_enter(vm_map_t map, vm_offset_t addr, vm_prot_t prot, - vm_object_t object, vm_pindex_t pindex, vm_size_t size, int flags); +void vm_map_pmap_enter(vm_map_t map, vm_offset_t addr, vm_cache_mode_t mode, + vm_prot_t prot, vm_object_t object, vm_pindex_t pindex, vm_size_t size, + int flags); int vm_map_protect (vm_map_t, vm_offset_t, vm_offset_t, vm_prot_t, boolean_t); int vm_map_remove (vm_map_t, vm_offset_t, vm_offset_t); void vm_map_startup (void); --- //depot/vendor/freebsd/src/sys/vm/vm_object.c 2009/04/23 21:10:14 +++ //depot/user/jhb/pat/vm/vm_object.c 2009/05/01 20:40:32 @@ -225,6 +225,7 @@ if ((object->type == OBJT_DEFAULT) || (object->type == OBJT_SWAP)) object->flags = OBJ_ONEMAPPING; object->pg_color = 0; + object->cache_mode = VM_CACHE_DEFAULT; object->handle = NULL; object->backing_object = NULL; object->backing_object_offset = (vm_ooffset_t) 0; @@ -288,6 +289,14 @@ } void +vm_object_set_cache_mode(vm_object_t object, vm_cache_mode_t mode) +{ + + VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); + object->cache_mode = mode; +} + +void vm_object_pip_add(vm_object_t object, short i) { --- //depot/vendor/freebsd/src/sys/vm/vm_object.h 2009/02/08 22:20:13 +++ //depot/user/jhb/pat/vm/vm_object.h 2009/05/01 20:40:32 @@ -97,6 +97,7 @@ u_short pg_color; /* (c) color of first page in obj */ u_short paging_in_progress; /* Paging (in or out) so don't collapse or destroy */ int resident_page_count; /* number of resident pages */ + vm_cache_mode_t cache_mode; struct vm_object *backing_object; /* object that I'm a shadow of */ vm_ooffset_t backing_object_offset;/* Offset in backing object */ TAILQ_ENTRY(vm_object) pager_object_list; /* list of all objects of this pager type */ @@ -190,6 +200,7 @@ } void vm_object_clear_flag(vm_object_t object, u_short bits); +void vm_object_set_cache_mode(vm_object_t object, vm_cache_mode_t mode); void vm_object_pip_add(vm_object_t object, short i); void vm_object_pip_subtract(vm_object_t object, short i); void vm_object_pip_wakeup(vm_object_t object);