/* * Copyright (c) 1987 Carnegie-Mellon University * Copyright (c) 1992, 1993 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Ralph Campbell. * * %sccs.include.redist.c% * * @(#)pmap.h 8.1 (Berkeley) 06/10/93 */ #ifndef _PMAP_MACHINE_ #define _PMAP_MACHINE_ /* * The user address space is 2Gb (0x0 - 0x80000000). * User programs are laid out in memory as follows: * address * USRTEXT 0x00001000 * USRDATA USRTEXT + text_size * USRSTACK 0x7FFFFFFF * * The user address space is mapped using a two level structure where * virtual address bits 30..22 are used to index into a segment table which * points to a page worth of PTEs (4096 page can hold 1024 PTEs). * Bits 21..12 are then used to index a PTE which describes a page within * a segment. * * The wired entries in the TLB will contain the following: * 0-1 (UPAGES) for curproc user struct and kernel stack. * * Note: The kernel doesn't use the same data structures as user programs. * All the PTE entries are stored in a single array in Sysmap which is * dynamically allocated at boot time. */ #define pmax_trunc_seg(x) ((vm_offset_t)(x) & ~SEGOFSET) #define pmax_round_seg(x) (((vm_offset_t)(x) + SEGOFSET) & ~SEGOFSET) #define pmap_segmap(m, v) ((m)->pm_segtab->seg_tab[((v) >> SEGSHIFT)]) #define PMAP_SEGTABSIZE 512 union pt_entry; struct segtab { union pt_entry *seg_tab[PMAP_SEGTABSIZE]; }; /* * Machine dependent pmap structure. */ typedef struct pmap { int pm_count; /* pmap reference count */ simple_lock_data_t pm_lock; /* lock on pmap */ struct pmap_statistics pm_stats; /* pmap statistics */ int pm_tlbpid; /* address space tag */ u_int pm_tlbgen; /* TLB PID generation number */ struct segtab *pm_segtab; /* pointers to pages of PTEs */ } *pmap_t; /* * Defines for pmap_attributes[phys_mach_page]; */ #define PMAP_ATTR_MOD 0x01 /* page has been modified */ #define PMAP_ATTR_REF 0x02 /* page has been referenced */ #ifdef KERNEL extern char *pmap_attributes; /* reference and modify bits */ extern struct pmap kernel_pmap_store; #define kernel_pmap (&kernel_pmap_store) #define pmap_wired_count(pmap) ((pmap)->pm_stats.wired_count) #endif /* KERNEL */ #endif /* _PMAP_MACHINE_ */