Date: Tue, 8 Apr 2003 01:51:44 -0700 (PDT) From: Peter Wemm <peter@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 28502 for review Message-ID: <200304080851.h388pi3A011857@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=28502 Change 28502 by peter@peter_daintree on 2003/04/08 01:50:45 actually create the 4-level structure. extra mappings are needed because I'm not using UMA for the pages. Affected files ... .. //depot/projects/hammer/sys/x86_64/x86_64/pmap.c#18 edit Differences ... ==== //depot/projects/hammer/sys/x86_64/x86_64/pmap.c#18 (text+ko) ==== @@ -1036,6 +1036,8 @@ register struct pmap *pmap; { vm_page_t ptdpg[NPGPTD]; + vm_page_t pdppg; + vm_page_t pml4pg; vm_paddr_t pa; int i; @@ -1057,7 +1059,7 @@ */ if (pmap->pm_pteobj == NULL) pmap->pm_pteobj = vm_object_allocate(OBJT_DEFAULT, PTDPTDI + - NPGPTD); + NPGPTD + 2); /* * allocate the page directory page(s) @@ -1072,12 +1074,32 @@ vm_page_unlock_queues(); } + pml4pg = vm_page_grab(pmap->pm_pteobj, PTDPTDI + NPGPTD, + VM_ALLOC_NORMAL | VM_ALLOC_RETRY | VM_ALLOC_WIRED | VM_ALLOC_ZERO); + vm_page_lock_queues(); + vm_page_flag_clear(pml4pg, PG_BUSY); + pml4pg->valid = VM_PAGE_BITS_ALL; + vm_page_unlock_queues(); + + pdppg = vm_page_grab(pmap->pm_pteobj, PTDPTDI + NPGPTD + 1, + VM_ALLOC_NORMAL | VM_ALLOC_RETRY | VM_ALLOC_WIRED | VM_ALLOC_ZERO); + vm_page_lock_queues(); + vm_page_flag_clear(pdppg, PG_BUSY); + pdppg->valid = VM_PAGE_BITS_ALL; + vm_page_unlock_queues(); + pmap_qenter((vm_offset_t)pmap->pm_pdir, ptdpg, NPGPTD); + pmap_qenter((vm_offset_t)pmap->pm_pdp, &pdppg, 1); + pmap_qenter((vm_offset_t)pmap->pm_pml4, &pml4pg, 1); for (i = 0; i < NPGPTD; i++) { if ((ptdpg[i]->flags & PG_ZERO) == 0) bzero(pmap->pm_pdir + (i * NPDEPG), PAGE_SIZE); } + if ((pdppg->flags & PG_ZERO) == 0) + bzero(pmap->pm_pdp, PAGE_SIZE); + if ((pml4pg->flags & PG_ZERO) == 0) + bzero(pmap->pm_pml4, PAGE_SIZE); mtx_lock_spin(&allpmaps_lock); LIST_INSERT_HEAD(&allpmaps, pmap, pm_list); @@ -1089,10 +1111,9 @@ for (i = 0; i < NPGPTD; i++) { pa = VM_PAGE_TO_PHYS(ptdpg[i]); pmap->pm_pdir[PTDPTDI + i] = pa | PG_V | PG_RW | PG_A | PG_M; -#ifdef PAE pmap->pm_pdp[i] = pa | PG_V; -#endif } + pmap->pm_pml4[0] = VM_PAGE_TO_PHYS(pdppg) | PG_V; pmap->pm_active = 0; TAILQ_INIT(&pmap->pm_pvlist);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200304080851.h388pi3A011857>