1/* 2 * Copyright (c) 2001 The NetBSD Foundation, Inc. 3 * All rights reserved. 4 * 5 * This code is derived from software contributed to The NetBSD Foundation 6 * by Matt Thomas <matt@3am-software.com> of Allegro Networks, Inc. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 78 unchanged lines hidden (view full) --- 87 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 88 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 89 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 90 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 91 */ 92 93#ifndef lint 94static const char rcsid[] = |
95 "$FreeBSD: head/sys/powerpc/aim/mmu_oea.c 92654 2002-03-19 09:11:49Z jeff $"; |
96#endif /* not lint */ 97 98/* 99 * Manages physical address maps. 100 * 101 * In addition to hardware address maps, this module is called upon to 102 * provide software-use-only maps which may or may not be stored in the 103 * same form as hardware maps. These pseudo-maps are used to store --- 140 unchanged lines hidden (view full) --- 244 LIST_HEAD_INITIALIZER(pmap_pvo_kunmanaged); /* list of unmanaged pages */ 245struct pvo_head pmap_pvo_unmanaged = 246 LIST_HEAD_INITIALIZER(pmap_pvo_unmanaged); /* list of unmanaged pages */ 247 248vm_zone_t pmap_upvo_zone; /* zone for pvo entries for unmanaged pages */ 249vm_zone_t pmap_mpvo_zone; /* zone for pvo entries for managed pages */ 250struct vm_object pmap_upvo_zone_obj; 251struct vm_object pmap_mpvo_zone_obj; |
252static vm_object_t pmap_pvo_obj; 253static u_int pmap_pvo_count; |
254 255#define PMAP_PVO_SIZE 1024 256static struct pvo_entry *pmap_bpvo_pool; 257static int pmap_bpvo_pool_index; 258static int pmap_bpvo_pool_count; 259 260#define VSID_NBPW (sizeof(u_int32_t) * 8) 261static u_int pmap_vsid_bitmap[NPMAPS / VSID_NBPW]; --- 47 unchanged lines hidden (view full) --- 309 vm_offset_t, vm_offset_t, u_int, int); 310static void pmap_pvo_remove(struct pvo_entry *, int); 311static struct pvo_entry *pmap_pvo_find_va(pmap_t, vm_offset_t, int *); 312static struct pte *pmap_pvo_to_pte(const struct pvo_entry *, int); 313 314/* 315 * Utility routines. 316 */ |
317static void * pmap_pvo_allocf(uma_zone_t, int, u_int8_t *, int); |
318static struct pvo_entry *pmap_rkva_alloc(void); 319static void pmap_pa_map(struct pvo_entry *, vm_offset_t, 320 struct pte *, int *); 321static void pmap_pa_unmap(struct pvo_entry *, struct pte *, int *); 322static void pmap_syncicache(vm_offset_t, vm_size_t); 323static boolean_t pmap_query_bit(vm_page_t, int); 324static boolean_t pmap_clear_bit(vm_page_t, int); 325static void tlbia(void); --- 606 unchanged lines hidden (view full) --- 932} 933 934void 935pmap_init2(void) 936{ 937 938 CTR(KTR_PMAP, "pmap_init2"); 939 |
940 pmap_pvo_obj = vm_object_allocate(OBJT_PHYS, 16); 941 pmap_pvo_count = 0; |
942 pmap_upvo_zone = zinit("UPVO entry", sizeof (struct pvo_entry), 943 0, 0, 0); |
944 uma_zone_set_allocf(pmap_upvo_zone, pmap_pvo_allocf); |
945 pmap_mpvo_zone = zinit("MPVO entry", sizeof(struct pvo_entry), 946 PMAP_PVO_SIZE, ZONE_INTERRUPT, 1); |
947 uma_zone_set_allocf(pmap_mpvo_zone, pmap_pvo_allocf); |
948 pmap_initialized = TRUE; 949} 950 951boolean_t 952pmap_is_modified(vm_page_t m) 953{ 954 TODO; 955 return (0); --- 900 unchanged lines hidden (view full) --- 1856 if (pvo->pvo_pte.pte_hi & PTE_VALID) { 1857 panic("pmap_pvo_to_pte: pvo %p has invalid pte %p in " 1858 "pmap_pteg_table but valid in pvo", pvo, pt); 1859 } 1860 1861 return (NULL); 1862} 1863 |
1864static void * 1865pmap_pvo_allocf(uma_zone_t zone, int bytes, u_int8_t *flags, int wait) 1866{ 1867 vm_page_t m; 1868 1869 if (bytes != PAGE_SIZE) 1870 panic("pmap_pvo_allocf: benno was shortsighted. hit him."); 1871 1872 *flags = UMA_SLAB_PRIV; 1873 m = vm_page_alloc(pmap_pvo_obj, pmap_pvo_count, VM_ALLOC_SYSTEM); 1874 pmap_pvo_count++; 1875 if (m == NULL) 1876 return (NULL); 1877 return ((void *)VM_PAGE_TO_PHYS(m)); 1878} 1879 |
1880/* 1881 * XXX: THIS STUFF SHOULD BE IN pte.c? 1882 */ 1883int 1884pmap_pte_spill(vm_offset_t addr) 1885{ 1886 struct pvo_entry *source_pvo, *victim_pvo; 1887 struct pvo_entry *pvo; --- 236 unchanged lines hidden --- |