diff options
Diffstat (limited to 'sys/amd64/include')
-rw-r--r-- | sys/amd64/include/bus_amd64.h | 12 | ||||
-rw-r--r-- | sys/amd64/include/param.h | 12 | ||||
-rw-r--r-- | sys/amd64/include/pmap.h | 79 | ||||
-rw-r--r-- | sys/amd64/include/vmparam.h | 36 |
4 files changed, 68 insertions, 71 deletions
diff --git a/sys/amd64/include/bus_amd64.h b/sys/amd64/include/bus_amd64.h index 5f0e22a..71a25e4 100644 --- a/sys/amd64/include/bus_amd64.h +++ b/sys/amd64/include/bus_amd64.h @@ -401,7 +401,7 @@ bus_space_read_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, else #endif { - int _port_ = bsh + offset; + bus_space_handle_t _port_ = bsh + offset; #ifdef __GNUC__ __asm __volatile(" \n\ cld \n\ @@ -443,7 +443,7 @@ bus_space_read_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, else #endif { - int _port_ = bsh + offset; + bus_space_handle_t _port_ = bsh + offset; #ifdef __GNUC__ __asm __volatile(" \n\ cld \n\ @@ -485,7 +485,7 @@ bus_space_read_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, else #endif { - int _port_ = bsh + offset; + bus_space_handle_t _port_ = bsh + offset; #ifdef __GNUC__ __asm __volatile(" \n\ cld \n\ @@ -741,7 +741,7 @@ bus_space_write_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, else #endif { - int _port_ = bsh + offset; + bus_space_handle_t _port_ = bsh + offset; #ifdef __GNUC__ __asm __volatile(" \n\ cld \n\ @@ -783,7 +783,7 @@ bus_space_write_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, else #endif { - int _port_ = bsh + offset; + bus_space_handle_t _port_ = bsh + offset; #ifdef __GNUC__ __asm __volatile(" \n\ cld \n\ @@ -825,7 +825,7 @@ bus_space_write_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, else #endif { - int _port_ = bsh + offset; + bus_space_handle_t _port_ = bsh + offset; #ifdef __GNUC__ __asm __volatile(" \n\ cld \n\ diff --git a/sys/amd64/include/param.h b/sys/amd64/include/param.h index 355e95d..9f73c2c 100644 --- a/sys/amd64/include/param.h +++ b/sys/amd64/include/param.h @@ -89,34 +89,32 @@ #define ALIGN(p) _ALIGN(p) #define ALIGNED_POINTER(p,t) _ALIGNED_POINTER((p),(t)) + /* Size of the level 1 page table units */ #define NPTEPG (PAGE_SIZE/(sizeof (pt_entry_t))) +#define NPTEPGSHIFT 9 /* LOG2(NPTEPG) */ #define PAGE_SHIFT 12 /* LOG2(PAGE_SIZE) */ #define PAGE_SIZE (1<<PAGE_SHIFT) /* bytes/page */ #define PAGE_MASK (PAGE_SIZE-1) /* Size of the level 2 page directory units */ #define NPDEPG (PAGE_SIZE/(sizeof (pd_entry_t))) +#define NPDEPGSHIFT 9 /* LOG2(NPDEPG) */ #define PDRSHIFT 21 /* LOG2(NBPDR) */ #define NBPDR (1<<PDRSHIFT) /* bytes/page dir */ #define PDRMASK (NBPDR-1) /* Size of the level 3 page directory pointer table units */ #define NPDPEPG (PAGE_SIZE/(sizeof (pdp_entry_t))) +#define NPDPEPGSHIFT 9 /* LOG2(NPDPEPG) */ #define PDPSHIFT 30 /* LOG2(NBPDP) */ #define NBPDP (1<<PDPSHIFT) /* bytes/page dir ptr table */ #define PDPMASK (NBPDP-1) /* Size of the level 4 page-map level-4 table units */ #define NPML4EPG (PAGE_SIZE/(sizeof (pml4_entry_t))) +#define NPML4EPGSHIFT 9 /* LOG2(NPML4EPG) */ #define PML4SHIFT 39 /* LOG2(NBPML4T) */ #define NBPML4T (1ul<<PML4SHIFT)/* bytes/page map lev4 table */ #define PML4MASK (NBPML4T-1) -#define NKPML4E 1 /* addressable number of page tables/pde's */ -#define NKPDPE 1 /* addressable number of page tables/pde's */ -#define NPGPTD 4 - -#define NBPTD (NPGPTD<<PAGE_SHIFT) -#define NPDEPTD (NBPTD/(sizeof (pd_entry_t))) - #define IOPAGES 2 /* pages of i/o permission bitmap */ #define KSTACK_PAGES 4 /* pages of kstack (with pcb) */ diff --git a/sys/amd64/include/pmap.h b/sys/amd64/include/pmap.h index 5ffa054..ef02ac1 100644 --- a/sys/amd64/include/pmap.h +++ b/sys/amd64/include/pmap.h @@ -83,13 +83,6 @@ #define PGEX_U 0x04 /* access from User mode (UPL) */ /* - * Size of Kernel address space. This is the number of level 4 (top) - * entries. We use half of them for the kernel due to the 48 bit - * virtual address sign extension. - */ -#define KVA_PAGES 1536 - -/* * Pte related macros. This is complicated by having to deal with * the sign extension of the 48th bit. */ @@ -105,15 +98,26 @@ #ifndef NKPT #define NKPT 120 /* initial number of kernel page tables */ #endif -#ifndef NKPDE -#define NKPDE (KVA_PAGES) /* number of page tables/pde's */ -#endif + +#define NKPML4E 1 /* number of kernel PML4 slots */ +#define NKPDPE 1 /* number of kernel PDP slots */ +#define NKPDE (NKPDPE*NPDEPG) /* number of kernel PD slots */ + +#define NUPML4E 1 /* number of userland PML4 pages */ +#define NUPDPE (NUPML4E*NPDPEPG)/* number of userland PDP pages */ +#define NUPDE (NUPDPE*NPDEPG) /* number of userland PD entries */ + +#define NDMPML4E 1 /* number of dmap PML4 slots */ /* - * The *PTDI values control the layout of virtual memory + * The *PDI values control the layout of virtual memory */ -#define KPTDI (NPDEPTD-NKPDE) /* start of kernel virtual pde's */ -#define PTDPTDI (KPTDI-NPGPTD) /* ptd entry that points to ptd! */ +#define PML4PML4I (NPML4EPG/2) /* Index of recursive pml4 mapping */ + +#define KPML4I (NPML4EPG-1) +#define DMPML4I (KPML4I-1) + +#define KPDPI (NPDPEPG-1) /* * XXX doesn't really belong here I guess... @@ -145,13 +149,18 @@ typedef u_int64_t pml4_entry_t; * in the page tables and the evil overlapping. */ #ifdef _KERNEL -#define PTmap ((pt_entry_t *)(VADDR(0, 0, PTDPTDI, 0))) -#define PTD ((pd_entry_t *)(VADDR(0, 0, PTDPTDI, PTDPTDI))) -#define PTDpde ((pd_entry_t *)(VADDR(0, 0, PTDPTDI, PTDPTDI) + (PTDPTDI * sizeof(pd_entry_t)))) - -extern u_int64_t IdlePML4; /* physical address of "Idle" state directory */ -extern u_int64_t IdlePDP; /* physical address of "Idle" state directory */ -extern u_int64_t IdlePTD; /* physical address of "Idle" state directory */ +#define addr_PTmap (VADDR(PML4PML4I, 0, 0, 0)) +#define addr_PDmap (VADDR(PML4PML4I, PML4PML4I, 0, 0)) +#define addr_PDPmap (VADDR(PML4PML4I, PML4PML4I, PML4PML4I, 0)) +#define addr_PML4map (VADDR(PML4PML4I, PML4PML4I, PML4PML4I, PML4PML4I)) +#define addr_PML4pml4e (addr_PML4map + (PML4PML4I * sizeof(pml4_entry_t))) +#define PTmap ((pt_entry_t *)(addr_PTmap)) +#define PDmap ((pd_entry_t *)(addr_PDmap)) +#define PDPmap ((pd_entry_t *)(addr_PDPmap)) +#define PML4map ((pd_entry_t *)(addr_PML4map)) +#define PML4pml4e ((pd_entry_t *)(addr_PML4pml4e)) + +extern u_int64_t KPML4phys; /* physical address of kernel level 4 */ #endif #ifdef _KERNEL @@ -161,28 +170,8 @@ extern u_int64_t IdlePTD; /* physical address of "Idle" state directory */ * Note: these work recursively, thus vtopte of a pte will give * the corresponding pde that in turn maps it. */ -#define vtopte(va) (PTmap + amd64_btop(va)) - -/* - * Routine: pmap_kextract - * Function: - * Extract the physical page address associated - * kernel virtual address. - */ -static __inline vm_paddr_t -pmap_kextract(vm_offset_t va) -{ - vm_paddr_t pa; - - pa = PTD[va >> PDRSHIFT]; - if (pa & PG_PS) { - pa = (pa & ~(NBPDR - 1)) | (va & (NBPDR - 1)); - } else { - pa = *vtopte(va); - pa = (pa & PG_FRAME) | (va & PAGE_MASK); - } - return pa; -} +pt_entry_t *vtopte(vm_offset_t); +vm_paddr_t pmap_kextract(vm_offset_t); #define vtophys(va) pmap_kextract(((vm_offset_t) (va))) @@ -225,14 +214,12 @@ struct md_page { }; struct pmap { - pd_entry_t *pm_pdir; /* KVA of page directory */ + pml4_entry_t *pm_pml4; /* KVA of level 4 page table */ vm_object_t pm_pteobj; /* Container for pte's */ TAILQ_HEAD(,pv_entry) pm_pvlist; /* list of mappings in pmap */ u_long pm_active; /* active on cpus */ struct pmap_statistics pm_stats; /* pmap statistics */ LIST_ENTRY(pmap) pm_list; /* List of all pmaps */ - pdp_entry_t *pm_pdp; /* KVA of level 3 page table */ - pml4_entry_t *pm_pml4; /* KVA of level 4 page table */ }; #define pmap_page_is_mapped(m) (!TAILQ_EMPTY(&(m)->md.pv_list)) @@ -278,7 +265,7 @@ extern char *ptvmmap; /* poor name! */ extern vm_offset_t virtual_avail; extern vm_offset_t virtual_end; -void pmap_bootstrap(vm_paddr_t, vm_paddr_t); +void pmap_bootstrap(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); diff --git a/sys/amd64/include/vmparam.h b/sys/amd64/include/vmparam.h index 0e9697d..91a62ed 100644 --- a/sys/amd64/include/vmparam.h +++ b/sys/amd64/include/vmparam.h @@ -41,7 +41,7 @@ #ifndef _MACHINE_VMPARAM_H_ -#define _MACHINE_VMPARAM_H_ 1 +#define _MACHINE_VMPARAM_H_ 1 /* * Machine dependent constants for AMD64. @@ -64,7 +64,7 @@ #define MAXSSIZ (64UL*1024*1024) /* max stack size */ #endif #ifndef SGROWSIZ -#define SGROWSIZ (128UL*1024) /* amount to grow stack */ +#define SGROWSIZ (128UL*1024) /* amount to grow stack */ #endif /* @@ -78,6 +78,12 @@ */ #define MAXSLP 20 +/* + * We provide a machine specific single page allocator through the tuse + * of the direct mapped segment. This uses 2MB pages for reduced + * TLB pressure. + */ +#define UMA_MD_SMALL_ALLOC /* * Virtual addresses of things. Derived from the page directory and @@ -86,24 +92,30 @@ * messy at times, but hey, we'll do anything to save a page :-) */ -#define VM_MAX_KERNEL_ADDRESS VADDR(0, 0, KPTDI+NKPDE-1, NPTEPG-1) -#define VM_MIN_KERNEL_ADDRESS VADDR(0, 0, PTDPTDI, PTDPTDI) +#define VM_MAX_KERNEL_ADDRESS VADDR(KPML4I, NPDPEPG-1, NKPDE-1, NPTEPG-1) +#define VM_MIN_KERNEL_ADDRESS VADDR(KPML4I, KPDPI, 0, 0) + +#define DMAP_MIN_ADDRESS VADDR(DMPML4I, 0, 0, 0) +#define DMAP_MAX_ADDRESS VADDR(DMPML4I+1, 0, 0, 0) + +#define KERNBASE VADDR(KPML4I, KPDPI, 0, 0) -#define KERNBASE VADDR(0, 0, KPTDI, 0) +#define UPT_MAX_ADDRESS VADDR(PML4PML4I, PML4PML4I, PML4PML4I, PML4PML4I) +#define UPT_MIN_ADDRESS VADDR(PML4PML4I, 0, 0, 0) -#define UPT_MAX_ADDRESS VADDR(0, 0, PTDPTDI, PTDPTDI) -#define UPT_MIN_ADDRESS VADDR(0, 0, PTDPTDI, 0) +#define VM_MAXUSER_ADDRESS VADDR(NUPML4E, 0, 0, 0) -#define VM_MAXUSER_ADDRESS UPT_MIN_ADDRESS +#define USRSTACK VM_MAXUSER_ADDRESS -#define USRSTACK VM_MAXUSER_ADDRESS +#define VM_MAX_ADDRESS UPT_MAX_ADDRESS +#define VM_MIN_ADDRESS (0) -#define VM_MAX_ADDRESS UPT_MAX_ADDRESS -#define VM_MIN_ADDRESS (0) +#define PHYS_TO_DMAP(x) ((x) | DMAP_MIN_ADDRESS) +#define DMAP_TO_PHYS(x) ((x) & ~DMAP_MIN_ADDRESS) /* virtual sizes (bytes) for various kernel submaps */ #ifndef VM_KMEM_SIZE -#define VM_KMEM_SIZE (12 * 1024 * 1024) +#define VM_KMEM_SIZE (12 * 1024 * 1024) #endif /* |