Home | History | Annotate | Line # | Download | only in include
pmap.h revision 1.35.34.1
      1  1.35.34.1   bouyer /*	$NetBSD: pmap.h,v 1.35.34.1 2008/01/11 19:19:08 bouyer Exp $	*/
      2        1.1      leo 
      3        1.1      leo /*
      4        1.1      leo  * Copyright (c) 1991 Regents of the University of California.
      5        1.1      leo  * All rights reserved.
      6       1.31      agc  *
      7       1.31      agc  * This code is derived from software contributed to Berkeley by
      8       1.31      agc  * the Systems Programming Group of the University of Utah Computer
      9       1.31      agc  * Science Department.
     10       1.31      agc  *
     11       1.31      agc  * Redistribution and use in source and binary forms, with or without
     12       1.31      agc  * modification, are permitted provided that the following conditions
     13       1.31      agc  * are met:
     14       1.31      agc  * 1. Redistributions of source code must retain the above copyright
     15       1.31      agc  *    notice, this list of conditions and the following disclaimer.
     16       1.31      agc  * 2. Redistributions in binary form must reproduce the above copyright
     17       1.31      agc  *    notice, this list of conditions and the following disclaimer in the
     18       1.31      agc  *    documentation and/or other materials provided with the distribution.
     19       1.31      agc  * 3. Neither the name of the University nor the names of its contributors
     20       1.31      agc  *    may be used to endorse or promote products derived from this software
     21       1.31      agc  *    without specific prior written permission.
     22       1.31      agc  *
     23       1.31      agc  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     24       1.31      agc  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     25       1.31      agc  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     26       1.31      agc  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     27       1.31      agc  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     28       1.31      agc  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     29       1.31      agc  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     30       1.31      agc  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     31       1.31      agc  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     32       1.31      agc  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     33       1.31      agc  * SUCH DAMAGE.
     34       1.31      agc  *
     35       1.31      agc  *	@(#)pmap.h	7.6 (Berkeley) 5/10/91
     36       1.31      agc  */
     37       1.31      agc 
     38       1.31      agc /*
     39       1.31      agc  * Copyright (c) 1987 Carnegie-Mellon University
     40        1.1      leo  *
     41        1.1      leo  * This code is derived from software contributed to Berkeley by
     42        1.1      leo  * the Systems Programming Group of the University of Utah Computer
     43        1.1      leo  * Science Department.
     44        1.1      leo  *
     45        1.1      leo  * Redistribution and use in source and binary forms, with or without
     46        1.1      leo  * modification, are permitted provided that the following conditions
     47        1.1      leo  * are met:
     48        1.1      leo  * 1. Redistributions of source code must retain the above copyright
     49        1.1      leo  *    notice, this list of conditions and the following disclaimer.
     50        1.1      leo  * 2. Redistributions in binary form must reproduce the above copyright
     51        1.1      leo  *    notice, this list of conditions and the following disclaimer in the
     52        1.1      leo  *    documentation and/or other materials provided with the distribution.
     53        1.1      leo  * 3. All advertising materials mentioning features or use of this software
     54        1.1      leo  *    must display the following acknowledgement:
     55        1.1      leo  *	This product includes software developed by the University of
     56        1.1      leo  *	California, Berkeley and its contributors.
     57        1.1      leo  * 4. Neither the name of the University nor the names of its contributors
     58        1.1      leo  *    may be used to endorse or promote products derived from this software
     59        1.1      leo  *    without specific prior written permission.
     60        1.1      leo  *
     61        1.1      leo  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     62        1.1      leo  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     63        1.1      leo  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     64        1.1      leo  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     65        1.1      leo  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     66        1.1      leo  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     67        1.1      leo  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     68        1.1      leo  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     69        1.1      leo  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     70        1.1      leo  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     71        1.1      leo  * SUCH DAMAGE.
     72        1.1      leo  *
     73        1.1      leo  *	@(#)pmap.h	7.6 (Berkeley) 5/10/91
     74        1.1      leo  */
     75        1.1      leo 
     76        1.1      leo #ifndef	_MACHINE_PMAP_H_
     77        1.1      leo #define	_MACHINE_PMAP_H_
     78        1.1      leo 
     79  1.35.34.1   bouyer #include <sys/simplelock.h>
     80  1.35.34.1   bouyer 
     81        1.1      leo /*
     82        1.9      leo  * Pmap stuff
     83        1.1      leo  */
     84        1.1      leo struct pmap {
     85        1.9      leo 	pt_entry_t 		*pm_ptab;	/* KVA of page table */
     86        1.9      leo 	st_entry_t		*pm_stab;	/* KVA of segment table */
     87        1.9      leo 	int			pm_stfree;	/* 040: free lev2 blocks */
     88        1.9      leo 	u_int			*pm_stpa;	/* 040: ST phys. address */
     89        1.9      leo 	short			pm_sref;	/* segment table ref count */
     90        1.9      leo 	short			pm_count;	/* pmap reference count */
     91        1.9      leo 	long			pm_ptpages;	/* more stats: PT pages */
     92       1.25      chs 	struct simplelock	pm_lock;	/* lock on pmap */
     93        1.1      leo 	struct pmap_statistics	pm_stats;	/* pmap statistics */
     94        1.1      leo };
     95        1.1      leo 
     96        1.1      leo typedef struct pmap *pmap_t;
     97        1.1      leo 
     98        1.1      leo /*
     99        1.9      leo  * On the 040 we keep track of which level 2 blocks are already in use
    100        1.9      leo  * with the pm_stfree mask.  Bits are arranged from LSB (block 0) to MSB
    101        1.9      leo  * (block 31).  For convenience, the level 1 table is considered to be
    102        1.9      leo  * block 0.
    103        1.9      leo  *
    104        1.9      leo  * MAX[KU]L2SIZE control how many pages of level 2 descriptors are allowed.
    105        1.9      leo  * for the kernel and users.  16 implies only the initial "segment table"
    106        1.9      leo  * page is used.  WARNING: don't change MAXUL2SIZE unless you can allocate
    107        1.9      leo  * physically contiguous pages for the ST in pmap.c!
    108        1.9      leo  */
    109        1.9      leo #define	MAXKL2SIZE	32
    110        1.9      leo #define MAXUL2SIZE	16
    111        1.9      leo #define l2tobm(n)	(1 << (n))
    112        1.9      leo #define	bmtol2(n)	(ffs(n) - 1)
    113        1.9      leo 
    114        1.9      leo /*
    115        1.1      leo  * Macros for speed
    116        1.1      leo  */
    117       1.15  thorpej #define	PMAP_ACTIVATE(pmap, loadhw)					\
    118       1.12  thorpej {									\
    119       1.15  thorpej 	if ((loadhw))							\
    120       1.19      leo 		loadustp(m68k_btop((pmap)->pm_stpa));	\
    121       1.12  thorpej }
    122        1.1      leo 
    123        1.1      leo /*
    124        1.6      leo  * Description of the memory segments. Build in atari_init/start_c().
    125        1.6      leo  * This gives a better separation between machine dependent stuff and
    126        1.6      leo  * the pmap-module.
    127        1.6      leo  */
    128        1.8      leo #define	NMEM_SEGS	8
    129        1.8      leo struct memseg {
    130       1.19      leo 	paddr_t	start;		/* PA of first page in segment	*/
    131       1.19      leo 	paddr_t	end;		/* PA of last  page in segment	*/
    132       1.19      leo 	int	first_page;	/* relative page# of 'start'	*/
    133        1.6      leo };
    134        1.6      leo 
    135        1.6      leo /*
    136       1.26      chs  * For each struct vm_page, there is a list of all currently valid virtual
    137        1.1      leo  * mappings of that page.  An entry is a pv_entry_t, the list is pv_table.
    138        1.1      leo  */
    139        1.1      leo typedef struct pv_entry {
    140        1.1      leo 	struct pv_entry	*pv_next;	/* next pv_entry */
    141        1.1      leo 	struct pmap	*pv_pmap;	/* pmap where mapping lies */
    142       1.19      leo 	vaddr_t		pv_va;		/* virtual address for mapping */
    143        1.1      leo 	u_int		*pv_ptste;	/* non-zero if VA maps a PT page */
    144        1.1      leo 	struct pmap	*pv_ptpmap;	/* if pv_ptste, pmap for PT page */
    145        1.1      leo 	int		pv_flags;	/* flags */
    146        1.1      leo } *pv_entry_t;
    147        1.1      leo 
    148        1.1      leo #define	PV_CI		0x01	/* all entries must be cache inhibited */
    149        1.1      leo #define PV_PTPAGE	0x02	/* entry maps a page table page */
    150        1.1      leo 
    151        1.9      leo struct pv_page;
    152        1.9      leo 
    153        1.9      leo struct pv_page_info {
    154        1.9      leo 	TAILQ_ENTRY(pv_page) pgi_list;
    155        1.9      leo 	struct pv_entry *pgi_freelist;
    156        1.9      leo 	int pgi_nfree;
    157        1.9      leo };
    158        1.9      leo 
    159        1.9      leo /*
    160        1.9      leo  * This is basically:
    161       1.30  thorpej  * ((PAGE_SIZE - sizeof(struct pv_page_info)) / sizeof(struct pv_entry))
    162        1.9      leo  */
    163        1.9      leo #define	NPVPPG	340
    164        1.9      leo 
    165        1.9      leo struct pv_page {
    166        1.9      leo 	struct pv_page_info pvp_pgi;
    167        1.9      leo 	struct pv_entry pvp_pv[NPVPPG];
    168        1.9      leo };
    169        1.9      leo 
    170        1.2      leo #ifdef	_KERNEL
    171        1.8      leo /*
    172        1.8      leo  * Memory segment descriptors.
    173        1.8      leo  *  - boot_segs
    174        1.8      leo  *	describes the segments obtainted from the bootcode.
    175        1.8      leo  *  - usable_segs
    176        1.8      leo  *	describes the segments available after system requirements are
    177        1.8      leo  *	substracted (reserved pages, etc...).
    178        1.8      leo  */
    179        1.8      leo struct memseg	boot_segs[NMEM_SEGS];
    180        1.8      leo struct memseg	usable_segs[NMEM_SEGS];
    181        1.8      leo 
    182        1.3  mycroft pv_entry_t	pv_table;	/* array of entries, one per page */
    183        1.3  mycroft u_int		*Sysmap;
    184        1.3  mycroft char		*vmmap;		/* map for mem, dumps, etc. */
    185        1.3  mycroft struct pmap	kernel_pmap_store;
    186        1.1      leo 
    187        1.6      leo #define	pmap_kernel()			(&kernel_pmap_store)
    188        1.1      leo #define	pmap_resident_count(pmap)	((pmap)->pm_stats.resident_count)
    189       1.21       is #define	pmap_wired_count(pmap)		((pmap)->pm_stats.wired_count)
    190       1.22  thorpej 
    191       1.27    chris #define	pmap_update(pmap)		/* nothing (yet) */
    192       1.28      chs 
    193       1.34    perry static __inline void
    194       1.29      chs pmap_remove_all(struct pmap *pmap)
    195       1.28      chs {
    196       1.28      chs 	/* Nothing. */
    197       1.28      chs }
    198        1.7      leo 
    199       1.12  thorpej #define	active_user_pmap(pm) \
    200       1.12  thorpej 	(curproc && \
    201       1.12  thorpej 	 (pm) != pmap_kernel() && (pm) == curproc->p_vmspace->vm_map.pmap)
    202       1.12  thorpej 
    203       1.19      leo void	pmap_bootstrap __P((psize_t, u_int, u_int));
    204       1.35  thorpej void	pmap_changebit __P((paddr_t, int, bool));
    205       1.17      cgd 
    206       1.19      leo vaddr_t	pmap_map __P((vaddr_t, paddr_t, paddr_t, int));
    207       1.20       is void	pmap_procwr __P((struct proc *, vaddr_t, u_long));
    208       1.20       is #define PMAP_NEED_PROCWR
    209       1.12  thorpej 
    210        1.5      leo #endif	/* _KERNEL */
    211        1.1      leo 
    212        1.1      leo #endif	/* !_MACHINE_PMAP_H_ */
    213