Home | History | Annotate | Line # | Download | only in include
pte.h revision 1.3
      1  1.2    mhitch /*	$NetBSD: pte.h,v 1.3 1997/06/16 23:41:45 jonathan Exp $	*/
      2  1.1  jonathan 
      3  1.3  jonathan /*-
      4  1.3  jonathan  * Copyright (c) 1997 The NetBSD Foundation, Inc.
      5  1.3  jonathan  * All rights reserved.
      6  1.3  jonathan  *
      7  1.3  jonathan  * This code is derived from software contributed to The NetBSD Foundation
      8  1.3  jonathan  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
      9  1.3  jonathan  * NASA Ames Research Center.
     10  1.3  jonathan  *
     11  1.3  jonathan  * Redistribution and use in source and binary forms, with or without
     12  1.3  jonathan  * modification, are permitted provided that the following conditions
     13  1.3  jonathan  * are met:
     14  1.3  jonathan  * 1. Redistributions of source code must retain the above copyright
     15  1.3  jonathan  *    notice, this list of conditions and the following disclaimer.
     16  1.3  jonathan  * 2. Redistributions in binary form must reproduce the above copyright
     17  1.3  jonathan  *    notice, this list of conditions and the following disclaimer in the
     18  1.3  jonathan  *    documentation and/or other materials provided with the distribution.
     19  1.3  jonathan  * 3. All advertising materials mentioning features or use of this software
     20  1.3  jonathan  *    must display the following acknowledgement:
     21  1.3  jonathan  *	This product includes software developed by the NetBSD
     22  1.3  jonathan  *	Foundation, Inc. and its contributors.
     23  1.3  jonathan  * 4. Neither the name of The NetBSD Foundation nor the names of its
     24  1.3  jonathan  *    contributors may be used to endorse or promote products derived
     25  1.3  jonathan  *    from this software without specific prior written permission.
     26  1.3  jonathan  *
     27  1.3  jonathan  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     28  1.3  jonathan  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     29  1.3  jonathan  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     30  1.3  jonathan  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     31  1.3  jonathan  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     32  1.3  jonathan  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     33  1.3  jonathan  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     34  1.3  jonathan  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     35  1.3  jonathan  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     36  1.3  jonathan  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     37  1.3  jonathan  * POSSIBILITY OF SUCH DAMAGE.
     38  1.3  jonathan  */
     39  1.3  jonathan 
     40  1.1  jonathan /*
     41  1.1  jonathan  * Copyright 1996 The Board of Trustees of The Leland Stanford
     42  1.1  jonathan  * Junior University. All Rights Reserved.
     43  1.1  jonathan  *
     44  1.1  jonathan  * Permission to use, copy, modify, and distribute this
     45  1.1  jonathan  * software and its documentation for any purpose and without
     46  1.1  jonathan  * fee is hereby granted, provided that the above copyright
     47  1.1  jonathan  * notice appear in all copies.  Stanford University
     48  1.1  jonathan  * makes no representations about the suitability of this
     49  1.1  jonathan  * software for any purpose.  It is provided "as is" without
     50  1.1  jonathan  * express or implied warranty.
     51  1.1  jonathan  */
     52  1.1  jonathan 
     53  1.1  jonathan #ifndef  __MIPS_PTE_H__
     54  1.1  jonathan #define  __MIPS_PTE_H__
     55  1.1  jonathan 
     56  1.3  jonathan #include <mips/mips1_pte.h>
     57  1.3  jonathan #include <mips/mips3_pte.h>
     58  1.3  jonathan 
     59  1.3  jonathan #if !defined(MIPS1) && !defined(MIPS3)
     60  1.3  jonathan #error Must include at least one MIPS architecture.
     61  1.3  jonathan #endif
     62  1.3  jonathan 
     63  1.3  jonathan #define	PG_ASID	0x000000ff	/* Address space ID */
     64  1.3  jonathan 
     65  1.3  jonathan #ifndef _LOCORE
     66  1.3  jonathan #include <mips/cpu.h>
     67  1.3  jonathan 
     68  1.3  jonathan typedef union pt_entry {
     69  1.3  jonathan 	unsigned int	 pt_entry;	/* for copying, etc. */
     70  1.3  jonathan 	struct mips1_pte pt_mips1_pte;	/* for getting to bits by name */
     71  1.3  jonathan 	struct mips3_pte pt_mips3_pte;
     72  1.3  jonathan } pt_entry_t;
     73  1.3  jonathan 
     74  1.3  jonathan #define	PT_ENTRY_NULL	((pt_entry_t *) 0)
     75  1.3  jonathan 
     76  1.3  jonathan /*
     77  1.3  jonathan  * Macros/inline functions to hide PTE format differences.
     78  1.3  jonathan  */
     79  1.3  jonathan 
     80  1.3  jonathan #define	mips_pg_nv_bit()	(MIPS1_PG_NV)	/* same on mips1 and mips3 */
     81  1.3  jonathan 
     82  1.3  jonathan 
     83  1.3  jonathan int pmap_is_page_ro(pmap_t, vm_offset_t, int);
     84  1.3  jonathan 
     85  1.3  jonathan 
     86  1.3  jonathan /* MIPS1-only */
     87  1.3  jonathan #if defined(MIPS1) && !defined(MIPS3)
     88  1.3  jonathan #define	mips_pg_v(entry)	((entry) & MIPS1_PG_V)
     89  1.3  jonathan #define	mips_pg_wired(entry)	((entry) & MIPS1_PG_WIRED)
     90  1.3  jonathan 
     91  1.3  jonathan #define	mips_pg_m_bit()		(MIPS1_PG_M)
     92  1.3  jonathan #define	mips_pg_rw_bit()	(MIPS1_PG_RW)	/* no RW bits for mips1 */
     93  1.3  jonathan #define	mips_pg_ro_bit()	(MIPS1_PG_RO)
     94  1.3  jonathan #define	mips_pg_ropage_bit()	(MIPS1_PG_RO)	/* XXX not MIPS1_PG_ROPAGE? */
     95  1.3  jonathan #define	mips_pg_rwpage_bit()	(MIPS1_PG_RWPAGE)
     96  1.3  jonathan #define	mips_pg_cwpage_bit()	(MIPS1_PG_CWPAGE)
     97  1.3  jonathan #define	mips_pg_global_bit()	(MIPS1_PG_G)
     98  1.3  jonathan #define	mips_pg_wired_bit()	(MIPS1_PG_WIRED)
     99  1.3  jonathan 
    100  1.3  jonathan #define	PTE_TO_PADDR(pte)	MIPS1_PTE_TO_PADDR((pte))
    101  1.3  jonathan #define	PAGE_IS_RDONLY(pte, va)	MIPS1_PAGE_IS_RDONLY((pte), (va))
    102  1.3  jonathan 
    103  1.3  jonathan #define	pfn_to_vad(x)		mips1_pfn_to_vad((x))
    104  1.3  jonathan #define	vad_to_pfn(x)		mips1_vad_to_pfn((x))
    105  1.3  jonathan #endif /* mips1 */
    106  1.3  jonathan 
    107  1.3  jonathan 
    108  1.3  jonathan /* MIPS3-only */
    109  1.3  jonathan #if !defined(MIPS1) && defined(MIPS3)
    110  1.3  jonathan #define	mips_pg_v(entry)	((entry) & MIPS3_PG_V)
    111  1.3  jonathan #define	mips_pg_wired(entry)	((entry) & MIPS3_PG_WIRED)
    112  1.3  jonathan 
    113  1.3  jonathan #define	mips_pg_m_bit()		(MIPS3_PG_M)
    114  1.3  jonathan #define	mips_pg_rw_bit()	(MIPS3_PG_M)
    115  1.3  jonathan #define	mips_pg_ro_bit()	(MIPS3_PG_RO)
    116  1.3  jonathan #define	mips_pg_ropage_bit()	(MIPS3_PG_ROPAGE)
    117  1.3  jonathan #define	mips_pg_rwpage_bit()	(MIPS3_PG_RWPAGE)
    118  1.3  jonathan #define	mips_pg_cwpage_bit()	(MIPS3_PG_CWPAGE)
    119  1.3  jonathan #define	mips_pg_global_bit()	(MIPS3_PG_G)
    120  1.3  jonathan #define	mips_pg_wired_bit()	(MIPS3_PG_WIRED)
    121  1.1  jonathan 
    122  1.3  jonathan #define	PTE_TO_PADDR(pte)	MIPS3_PTE_TO_PADDR((pte))
    123  1.3  jonathan #define	PAGE_IS_RDONLY(pte, va)	MIPS3_PAGE_IS_RDONLY((pte), (va))
    124  1.3  jonathan 
    125  1.3  jonathan #define	pfn_to_vad(x)		mips3_pfn_to_vad((x))
    126  1.3  jonathan #define	vad_to_pfn(x)		mips3_vad_to_pfn((x))
    127  1.3  jonathan #endif /* mips3 */
    128  1.3  jonathan 
    129  1.3  jonathan /* MIPS1 and MIPS3 */
    130  1.1  jonathan #if defined(MIPS1) && defined(MIPS3)
    131  1.1  jonathan 
    132  1.3  jonathan static __inline int
    133  1.3  jonathan     mips_pg_v(unsigned int entry),
    134  1.3  jonathan     mips_pg_wired(unsigned int entry),
    135  1.3  jonathan     PAGE_IS_RDONLY(unsigned int pte, vm_offset_t va);
    136  1.3  jonathan 
    137  1.3  jonathan static __inline unsigned int
    138  1.3  jonathan     mips_pg_wired_bit(void), mips_pg_m_bit(void),
    139  1.3  jonathan     mips_pg_ro_bit(void), mips_pg_rw_bit(void),
    140  1.3  jonathan     mips_pg_ropage_bit(void),
    141  1.3  jonathan     mips_pg_cwpage_bit(void),
    142  1.3  jonathan     mips_pg_rwpage_bit(void),
    143  1.3  jonathan     mips_pg_global_bit(void),
    144  1.3  jonathan     PTE_TO_PADDR(unsigned int entry);
    145  1.3  jonathan 
    146  1.3  jonathan static __inline vm_offset_t pfn_to_vad(unsigned int x);
    147  1.3  jonathan static __inline int vad_to_pfn(vm_offset_t x);
    148  1.3  jonathan 
    149  1.3  jonathan 
    150  1.3  jonathan static __inline int
    151  1.3  jonathan mips_pg_v(entry)
    152  1.3  jonathan 	unsigned int entry;
    153  1.3  jonathan {
    154  1.3  jonathan 	if (CPUISMIPS3)
    155  1.3  jonathan 		return (entry & MIPS3_PG_V);
    156  1.3  jonathan 	return (entry & MIPS1_PG_V);
    157  1.3  jonathan }
    158  1.3  jonathan 
    159  1.3  jonathan static __inline int
    160  1.3  jonathan mips_pg_wired(entry)
    161  1.3  jonathan 	unsigned int entry;
    162  1.3  jonathan {
    163  1.3  jonathan 	if (CPUISMIPS3)
    164  1.3  jonathan 		return (entry & MIPS3_PG_WIRED);
    165  1.3  jonathan 	return (entry & MIPS1_PG_WIRED);
    166  1.3  jonathan }
    167  1.3  jonathan 
    168  1.3  jonathan static __inline unsigned int
    169  1.3  jonathan mips_pg_m_bit()
    170  1.3  jonathan {
    171  1.3  jonathan 	if (CPUISMIPS3)
    172  1.3  jonathan 		return (MIPS3_PG_M);
    173  1.3  jonathan 	return (MIPS1_PG_M);
    174  1.3  jonathan }
    175  1.3  jonathan 
    176  1.3  jonathan static __inline unsigned int
    177  1.3  jonathan mips_pg_ro_bit()
    178  1.3  jonathan {
    179  1.3  jonathan 	if (CPUISMIPS3)
    180  1.3  jonathan 		return (MIPS3_PG_RO);
    181  1.3  jonathan 	return (MIPS1_PG_RO);
    182  1.3  jonathan }
    183  1.3  jonathan 
    184  1.3  jonathan static __inline unsigned int
    185  1.3  jonathan mips_pg_rw_bit()
    186  1.3  jonathan {
    187  1.3  jonathan 	if (CPUISMIPS3)
    188  1.3  jonathan 		return (MIPS3_PG_M);
    189  1.3  jonathan 	return (MIPS1_PG_RW);
    190  1.3  jonathan }
    191  1.3  jonathan 
    192  1.3  jonathan static __inline unsigned int
    193  1.3  jonathan mips_pg_ropage_bit()
    194  1.3  jonathan {
    195  1.3  jonathan 	if (CPUISMIPS3)
    196  1.3  jonathan 		return (MIPS3_PG_ROPAGE);
    197  1.3  jonathan 	return (MIPS1_PG_RO);
    198  1.3  jonathan }
    199  1.3  jonathan 
    200  1.3  jonathan static __inline unsigned int
    201  1.3  jonathan mips_pg_rwpage_bit()
    202  1.3  jonathan {
    203  1.3  jonathan 	if (CPUISMIPS3)
    204  1.3  jonathan 		return (MIPS3_PG_RWPAGE);
    205  1.3  jonathan 	return (MIPS1_PG_RWPAGE);
    206  1.3  jonathan }
    207  1.3  jonathan 
    208  1.3  jonathan static __inline unsigned int
    209  1.3  jonathan mips_pg_cwpage_bit()
    210  1.3  jonathan {
    211  1.3  jonathan 	if (CPUISMIPS3)
    212  1.3  jonathan 		return (MIPS3_PG_CWPAGE);
    213  1.3  jonathan 	return (MIPS1_PG_CWPAGE);
    214  1.3  jonathan }
    215  1.3  jonathan 
    216  1.3  jonathan 
    217  1.3  jonathan static __inline unsigned int
    218  1.3  jonathan mips_pg_global_bit()
    219  1.3  jonathan {
    220  1.3  jonathan 	if (CPUISMIPS3)
    221  1.3  jonathan 		return (MIPS3_PG_G);
    222  1.3  jonathan 	return (MIPS1_PG_G);
    223  1.3  jonathan }
    224  1.3  jonathan 
    225  1.3  jonathan static __inline unsigned int
    226  1.3  jonathan mips_pg_wired_bit()
    227  1.3  jonathan {
    228  1.3  jonathan 	if (CPUISMIPS3)
    229  1.3  jonathan 		return (MIPS3_PG_WIRED);
    230  1.3  jonathan 	return (MIPS1_PG_WIRED);
    231  1.3  jonathan }
    232  1.3  jonathan 
    233  1.3  jonathan static __inline unsigned int
    234  1.3  jonathan PTE_TO_PADDR(pte)
    235  1.3  jonathan 	unsigned int pte;
    236  1.3  jonathan {
    237  1.3  jonathan 	if (CPUISMIPS3)
    238  1.3  jonathan 		return (MIPS3_PTE_TO_PADDR(pte));
    239  1.3  jonathan 	return (MIPS1_PTE_TO_PADDR(pte));
    240  1.3  jonathan }
    241  1.3  jonathan 
    242  1.3  jonathan static __inline int
    243  1.3  jonathan PAGE_IS_RDONLY(pte, va)
    244  1.3  jonathan 	unsigned int pte;
    245  1.3  jonathan 	vm_offset_t va;
    246  1.3  jonathan {
    247  1.3  jonathan 	if (CPUISMIPS3)
    248  1.3  jonathan 		return (MIPS3_PAGE_IS_RDONLY(pte, va));
    249  1.3  jonathan 	return (MIPS1_PAGE_IS_RDONLY(pte, va));
    250  1.3  jonathan }
    251  1.3  jonathan 
    252  1.3  jonathan static __inline vm_offset_t
    253  1.3  jonathan pfn_to_vad(x)
    254  1.3  jonathan 	unsigned int x;
    255  1.3  jonathan {
    256  1.3  jonathan 	if (CPUISMIPS3)
    257  1.3  jonathan 		return (mips3_pfn_to_vad(x));
    258  1.3  jonathan 	return (mips1_pfn_to_vad(x));
    259  1.3  jonathan }
    260  1.1  jonathan 
    261  1.3  jonathan static __inline int
    262  1.3  jonathan vad_to_pfn(x)
    263  1.3  jonathan 	vm_offset_t x;
    264  1.3  jonathan {
    265  1.3  jonathan 	if (CPUISMIPS3)
    266  1.3  jonathan 		return (mips3_vad_to_pfn(x));
    267  1.3  jonathan 	return (mips1_vad_to_pfn(x));
    268  1.3  jonathan }
    269  1.1  jonathan #endif
    270  1.1  jonathan 
    271  1.3  jonathan #define	mips_pg_global_bit()	(MIPS1_PG_G)
    272  1.3  jonathan #endif /* ! _LOCORE */
    273  1.1  jonathan 
    274  1.1  jonathan #if defined(_KERNEL) && !defined(_LOCORE)
    275  1.1  jonathan /*
    276  1.1  jonathan  * Kernel virtual address to page table entry and visa versa.
    277  1.1  jonathan  */
    278  1.1  jonathan #define	kvtopte(va) \
    279  1.1  jonathan 	(Sysmap + (((vm_offset_t)(va) - VM_MIN_KERNEL_ADDRESS) >> PGSHIFT))
    280  1.1  jonathan #define	ptetokv(pte) \
    281  1.1  jonathan 	((((pt_entry_t *)(pte) - Sysmap) << PGSHIFT) + VM_MIN_KERNEL_ADDRESS)
    282  1.1  jonathan 
    283  1.1  jonathan extern	pt_entry_t *Sysmap;		/* kernel pte table */
    284  1.1  jonathan extern	u_int Sysmapsize;		/* number of pte's in Sysmap */
    285  1.1  jonathan #endif	/* defined(_KERNEL) && !defined(_LOCORE) */
    286  1.3  jonathan 
    287  1.3  jonathan /*
    288  1.3  jonathan  * User virtual to pte page entry.  Same on mips1 and mips3.
    289  1.3  jonathan  */
    290  1.3  jonathan #define	uvtopte(adr)	(((adr) >> PGSHIFT) & (NPTEPG - 1))
    291  1.3  jonathan 
    292  1.1  jonathan 
    293  1.1  jonathan #endif /* __MIPS_PTE_H__ */
    294