PERFORCE change 28089 for review
Peter Wemm
peter at FreeBSD.org
Fri Apr 4 16:40:24 PST 2003
http://perforce.freebsd.org/chv.cgi?CH=28089
Change 28089 by peter at peter_daintree on 2003/04/04 16:39:32
IFC @28080 on i386_hammer
Affected files ...
.. //depot/projects/hammer/sys/x86_64/include/pmap.h#6 integrate
.. //depot/projects/hammer/sys/x86_64/x86_64/locore.s#19 integrate
Differences ...
==== //depot/projects/hammer/sys/x86_64/include/pmap.h#6 (text+ko) ====
@@ -42,7 +42,7 @@
*
* from: hp300: @(#)pmap.h 7.2 (Berkeley) 12/16/90
* from: @(#)pmap.h 7.4 (Berkeley) 5/12/91
- * $FreeBSD: src/sys/i386/include/pmap.h,v 1.88 2003/02/27 20:13:20 alc Exp $
+ * $FreeBSD: src/sys/i386/include/pmap.h,v 1.96 2003/04/04 10:09:44 jake Exp $
*/
#ifndef _MACHINE_PMAP_H_
@@ -70,7 +70,7 @@
/* Our various interpretations of the above */
#define PG_W PG_AVAIL1 /* "Wired" pseudoflag */
#define PG_MANAGED PG_AVAIL2
-#define PG_FRAME (~PAGE_MASK)
+#define PG_FRAME (~((vm_paddr_t)PAGE_MASK))
#define PG_PROT (PG_RW|PG_U) /* all protection bits . */
#define PG_N (PG_NC_PWT|PG_NC_PCD) /* Non-cacheable */
@@ -131,10 +131,12 @@
typedef u_int64_t pdp_entry_t;
typedef u_int64_t pml4_entry_t;
-#define PML4ESHIFT (2)
-#define PDPESHIFT (2)
-#define PTESHIFT (2)
-#define PDESHIFT (2)
+#define PML4ESHIFT (3)
+#define PDPESHIFT (3)
+#define PTESHIFT (3)
+#define PDESHIFT (3)
+
+#endif
/*
* Address of current and alternate address space page table maps
@@ -146,11 +148,11 @@
* in the page tables and the evil overlapping.
*/
#ifdef _KERNEL
-extern pt_entry_t PTmap[], APTmap[];
-extern pd_entry_t PDmap[], APDmap[];
-extern pdp_entry_t PDPmap[], APDPmap[];
-extern pml4_entry_t PML4[], APML4;
-extern pd_entry_t PML4pml4e[], APML4pml4e[];
+extern pt_entry_t PTmap[]:
+extern pd_entry_t PDmap[]:
+extern pdp_entry_t PDPmap[]:
+extern pml4_entry_t PML4[]:
+extern pd_entry_t PML4pml4e[]:
extern pd_entry_t *IdlePML4; /* physical address of "Idle" state directory */
#endif
@@ -163,7 +165,6 @@
* the corresponding pde that in turn maps it.
*/
#define vtopte(va) (PTmap + x86_64_btop(va))
-#define avtopte(va) (APTmap + x86_64_btop(va))
/*
* Routine: pmap_kextract
@@ -171,24 +172,48 @@
* Extract the physical page address associated
* kernel virtual address.
*/
-static __inline vm_offset_t
+static __inline vm_paddr_t
pmap_kextract(vm_offset_t va)
{
- vm_offset_t pa;
+ vm_paddr_t pa;
/* XXX the acronyms are giving me headaches at the moment */
/* XXX if ((pa = (vm_offset_t) PTD[va >> PDRSHIFT]) & PG_PS) {
pa = (pa & ~(NBPDR - 1)) | (va & (NBPDR - 1));
} else */ {
- pa = *(vm_offset_t *)vtopte(va);
+ pa = *vtopte(va);
pa = (pa & PG_FRAME) | (va & PAGE_MASK);
}
return pa;
}
#define vtophys(va) pmap_kextract(((vm_offset_t) (va)))
+
+#ifdef PAE
+
+static __inline pt_entry_t
+pte_load_clear(pt_entry_t *pte)
+{
+ pt_entry_t r;
+
+ r = *pte;
+ __asm __volatile(
+ "1:\n"
+ "\tcmpxchg8b %1\n"
+ "\tjnz 1b"
+ : "+A" (r)
+ : "m" (*pte), "b" (0), "c" (0));
+ return (r);
+}
+
+#else
+
+#define pte_load_clear(pte) atomic_readandclear_int(pte)
+
#endif
+#endif
+
/*
* Pmap stuff
*/
@@ -203,9 +228,13 @@
pd_entry_t *pm_pdir; /* KVA of page directory */
vm_object_t pm_pteobj; /* Container for pte's */
TAILQ_HEAD(,pv_entry) pm_pvlist; /* list of mappings in pmap */
- int pm_active; /* active on cpus */
+ u_int pm_active; /* active on cpus */
struct pmap_statistics pm_stats; /* pmap statistics */
LIST_ENTRY(pmap) pm_list; /* List of all pmaps */
+#ifdef PAE
+ pdpt_entry_t *pm_pdpt; /* KVA of page director pointer
+ table */
+#endif
};
#define pmap_page_is_mapped(m) (!TAILQ_EMPTY(&(m)->md.pv_list))
@@ -242,19 +271,21 @@
extern caddr_t CADDR1;
extern pt_entry_t *CMAP1;
-extern vm_offset_t avail_end;
-extern vm_offset_t avail_start;
+extern vm_paddr_t avail_end;
+extern vm_paddr_t avail_start;
extern vm_offset_t clean_eva;
extern vm_offset_t clean_sva;
-extern vm_offset_t phys_avail[];
+extern vm_paddr_t phys_avail[];
extern char *ptvmmap; /* poor name! */
extern vm_offset_t virtual_avail;
extern vm_offset_t virtual_end;
-void pmap_bootstrap(vm_offset_t, vm_offset_t);
-void *pmap_mapdev(vm_offset_t, vm_size_t);
+void pmap_bootstrap(vm_paddr_t, vm_paddr_t);
+void pmap_kenter(vm_offset_t va, vm_paddr_t pa);
+void pmap_kremove(vm_offset_t);
+void *pmap_mapdev(vm_paddr_t, vm_size_t);
void pmap_unmapdev(vm_offset_t, vm_size_t);
-pt_entry_t *pmap_pte(pmap_t, vm_offset_t) __pure2;
+pt_entry_t *pmap_pte_quick(pmap_t, vm_offset_t) __pure2;
void pmap_set_opt(void);
void pmap_invalidate_page(pmap_t, vm_offset_t);
void pmap_invalidate_range(pmap_t, vm_offset_t, vm_offset_t);
==== //depot/projects/hammer/sys/x86_64/x86_64/locore.s#19 (text+ko) ====
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* from: @(#)locore.s 7.3 (Berkeley) 5/13/91
- * $FreeBSD: src/sys/i386/i386/locore.s,v 1.169 2003/02/23 22:12:07 jake Exp $
+ * $FreeBSD: src/sys/i386/i386/locore.s,v 1.171 2003/04/03 23:44:34 jake Exp $
*
* originally from: locore.s, by William F. Jolitz
*
@@ -54,12 +54,6 @@
/*
* PTmap is recursive pagemap at top of virtual address space.
* Within PTmap, the page directory can be found (third indirection).
- *
- * NOTE: PTDpde, PTmap, and PTD are being defined as address symbols.
- * In C you access them directly, and not with a '*'. Storage is not being
- * allocated. They will magically address the correct locations in KVM
- * which C will treat as normal variables of the type they are defined in
- * machine/pmap.h, i.e. PTDpde = XX ; to set a PDE entry, NOT *PTDpde = XX;
*/
.globl PTmap,PTD,PTDpde
.set PTmap,(PTDPTDI << PDRSHIFT)
@@ -67,16 +61,6 @@
.set PTDpde,PTD + (PTDPTDI * PDESIZE)
/*
- * APTmap, APTD is the alternate recursive pagemap.
- * It's used when modifying another process's page tables.
- * See the note above. It is true here as well.
- */
- .globl APTmap,APTD,APTDpde
- .set APTmap,APTDPTDI << PDRSHIFT
- .set APTD,APTmap + (APTDPTDI * PAGE_SIZE)
- .set APTDpde,PTD + (APTDPTDI * PDESIZE)
-
-/*
* Compiled KERNBASE location
*/
.globl kernbase
@@ -223,7 +207,11 @@
xorl %ebp,%ebp /* mark end of frames */
+#ifdef PAE
+ movl IdlePDPT,%esi
+#else
movl IdlePTD,%esi
+#endif
movl %esi,(KSTACK_PAGES*PAGE_SIZE-PCB_SIZE+PCB_CR3)(%eax)
pushl physfree /* value of first for init386(first) */
@@ -308,6 +296,11 @@
movl %esi,R(KPTphys)
/* Allocate Page Table Directory */
+#ifdef PAE
+ /* XXX only need 32 bytes (easier for now) */
+ ALLOCPAGES(1)
+ movl %esi,R(IdlePDPT)
+#endif
ALLOCPAGES(NPGPTD)
movl %esi,R(IdlePTD)
@@ -341,6 +334,12 @@
fillkptphys(%edx)
/* Map page directory. */
+#ifdef PAE
+ movl R(IdlePDPT), %eax
+ movl $1, %ecx
+ fillkptphys($PG_RW)
+#endif
+
movl R(IdlePTD), %eax
movl $NPGPTD, %ecx
fillkptphys($PG_RW)
@@ -378,6 +377,13 @@
movl $NPGPTD,%ecx
fillkpt(R(IdlePTD), $PG_RW)
+#ifdef PAE
+ movl R(IdlePTD), %eax
+ xorl %ebx, %ebx
+ movl $NPGPTD, %ecx
+ fillkpt(R(IdlePDPT), $0x0)
+#endif
+
ret
/**********************************************************************
More information about the p4-projects
mailing list