[BACK]Return to pmap.h CVS log [TXT][DIR] Up to [local] / sys / arch / sparc64 / include

Annotation of sys/arch/sparc64/include/pmap.h, Revision 1.1

1.1     ! nbrk        1: /*     $NetBSD: pmap.h,v 1.16 2001/04/22 23:19:30 thorpej Exp $        */
        !             2:
        !             3: /*-
        !             4:  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
        !             5:  * Copyright (C) 1995, 1996 TooLs GmbH.
        !             6:  * All rights reserved.
        !             7:  *
        !             8:  * Redistribution and use in source and binary forms, with or without
        !             9:  * modification, are permitted provided that the following conditions
        !            10:  * are met:
        !            11:  * 1. Redistributions of source code must retain the above copyright
        !            12:  *    notice, this list of conditions and the following disclaimer.
        !            13:  * 2. Redistributions in binary form must reproduce the above copyright
        !            14:  *    notice, this list of conditions and the following disclaimer in the
        !            15:  *    documentation and/or other materials provided with the distribution.
        !            16:  * 3. All advertising materials mentioning features or use of this software
        !            17:  *    must display the following acknowledgement:
        !            18:  *     This product includes software developed by TooLs GmbH.
        !            19:  * 4. The name of TooLs GmbH may not be used to endorse or promote products
        !            20:  *    derived from this software without specific prior written permission.
        !            21:  *
        !            22:  * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
        !            23:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
        !            24:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
        !            25:  * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
        !            26:  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
        !            27:  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
        !            28:  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
        !            29:  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
        !            30:  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
        !            31:  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        !            32:  */
        !            33:
        !            34: #ifndef        _MACHINE_PMAP_H_
        !            35: #define        _MACHINE_PMAP_H_
        !            36:
        !            37: #ifndef _LOCORE
        !            38: #include <machine/pte.h>
        !            39: #include <sys/queue.h>
        !            40: #endif
        !            41:
        !            42: /*
        !            43:  * This scheme uses 2-level page tables.
        !            44:  *
        !            45:  * While we're still in 32-bit mode we do the following:
        !            46:  *
        !            47:  *   offset:                                           13 bits
        !            48:  * 1st level: 1024 64-bit TTEs in an 8K page for       10 bits
        !            49:  * 2nd level: 512 32-bit pointers in the pmap for       9 bits
        !            50:  *                                                     -------
        !            51:  * total:                                              32 bits
        !            52:  *
        !            53:  * In 64-bit mode the Spitfire and Blackbird CPUs support only
        !            54:  * 44-bit virtual addresses.  All addresses between
        !            55:  * 0x0000 07ff ffff ffff and 0xffff f800 0000 0000 are in the
        !            56:  * "VA hole" and trap, so we don't have to track them.  However,
        !            57:  * we do need to keep them in mind during PT walking.  If they
        !            58:  * ever change the size of the address "hole" we need to rework
        !            59:  * all the page table handling.
        !            60:  *
        !            61:  *   offset:                                           13 bits
        !            62:  * 1st level: 1024 64-bit TTEs in an 8K page for       10 bits
        !            63:  * 2nd level: 1024 64-bit pointers in an 8K page for   10 bits
        !            64:  * 3rd level: 1024 64-bit pointers in the segmap for   10 bits
        !            65:  *                                                     -------
        !            66:  * total:                                              43 bits
        !            67:  *
        !            68:  * Of course, this means for 32-bit spaces we always have a (practically)
        !            69:  * wasted page for the segmap (only one entry used) and half a page wasted
        !            70:  * for the page directory.  We still have need of one extra bit 8^(.
        !            71:  */
        !            72:
        !            73: #define HOLESHIFT      (43)
        !            74:
        !            75: #define PTSZ   (NBPG/8)
        !            76: #define PDSZ   (PTSZ)
        !            77: #define STSZ   (PTSZ)
        !            78:
        !            79: #define PTSHIFT                (13)
        !            80: #define        PDSHIFT         (10+PTSHIFT)
        !            81: #define STSHIFT                (10+PDSHIFT)
        !            82:
        !            83: #define PTMASK         (PTSZ-1)
        !            84: #define PDMASK         (PDSZ-1)
        !            85: #define STMASK         (STSZ-1)
        !            86:
        !            87: #ifndef _LOCORE
        !            88:
        !            89: /*
        !            90:  * Support for big page sizes.  This maps the page size to the
        !            91:  * page bits.
        !            92:  */
        !            93: struct page_size_map {
        !            94:        u_int64_t mask;
        !            95:        u_int64_t code;
        !            96: #ifdef DEBUG
        !            97:        u_int64_t use;
        !            98: #endif
        !            99: };
        !           100: extern struct page_size_map page_size_map[];
        !           101:
        !           102: /*
        !           103:  * Pmap stuff
        !           104:  */
        !           105:
        !           106: #define va_to_seg(v)   (int)((((paddr_t)(v))>>STSHIFT)&STMASK)
        !           107: #define va_to_dir(v)   (int)((((paddr_t)(v))>>PDSHIFT)&PDMASK)
        !           108: #define va_to_pte(v)   (int)((((paddr_t)(v))>>PTSHIFT)&PTMASK)
        !           109:
        !           110: struct pmap {
        !           111:        int pm_ctx;             /* Current context */
        !           112:        int pm_refs;            /* ref count */
        !           113:        /*
        !           114:         * This contains 64-bit pointers to pages that contain
        !           115:         * 1024 64-bit pointers to page tables.  All addresses
        !           116:         * are physical.
        !           117:         *
        !           118:         * !!! Only touch this through pseg_get() and pseg_set() !!!
        !           119:         */
        !           120:        paddr_t pm_physaddr;    /* physical address of pm_segs */
        !           121:        int64_t *pm_segs;
        !           122:        struct simplelock pm_lock;
        !           123: };
        !           124:
        !           125: /*
        !           126:  * This comes from the PROM and is used to map prom entries.
        !           127:  */
        !           128: struct prom_map {
        !           129:        u_int64_t       vstart;
        !           130:        u_int64_t       vsize;
        !           131:        u_int64_t       tte;
        !           132: };
        !           133:
        !           134: #define PMAP_NC                0x001   /* Set the E bit in the page */
        !           135: #define PMAP_NVC       0x002   /* Don't enable the virtual cache */
        !           136: #define PMAP_LITTLE    0x004   /* Map in little endian mode */
        !           137: /* Large page size hints -- we really should use another param to pmap_enter() */
        !           138: #define PMAP_8K                0x000
        !           139: #define PMAP_64K       0x008   /* Use 64K page */
        !           140: #define PMAP_512K      0x010
        !           141: #define PMAP_4M                0x018
        !           142: #define PMAP_SZ_TO_TTE(x)      (((x)&0x018)<<58)
        !           143: /* If these bits are different in va's to the same PA then there is an aliasing in the d$ */
        !           144: #define VA_ALIAS_MASK   (1<<13)
        !           145:
        !           146: typedef        struct pmap *pmap_t;
        !           147:
        !           148: /*
        !           149:  * Encode IO space for pmap_enter()
        !           150:  *
        !           151:  * Since sun4u machines don't have separate IO spaces, this is a noop.
        !           152:  */
        !           153: #define PMAP_IOENC(io) 0
        !           154:
        !           155: #ifdef _KERNEL
        !           156: extern struct pmap kernel_pmap_;
        !           157: #define        pmap_kernel()   (&kernel_pmap_)
        !           158:
        !           159: int pmap_count_res(pmap_t pmap);
        !           160: /* int pmap_change_wiring(pmap_t pm, vaddr_t va, boolean_t wired); */
        !           161: #define        pmap_resident_count(pm)         pmap_count_res((pm))
        !           162: #define        pmap_phys_address(x)            (x)
        !           163: #define        pmap_update(pm)                 /* nothing (yet) */
        !           164:
        !           165: #define pmap_proc_iflush(p,va,len)     /* nothing */
        !           166:
        !           167: void pmap_bootstrap(u_long kernelstart, u_long kernelend, u_int numctx);
        !           168: /* make sure all page mappings are modulo 16K to prevent d$ aliasing */
        !           169: #define PMAP_PREFER(pa, va)    (*(va) += (((*(va)) ^ (pa)) & VA_ALIAS_MASK))
        !           170:
        !           171: #define PMAP_GROWKERNEL         /* turn on pmap_growkernel interface */
        !           172:
        !           173: /* SPARC specific? */
        !           174: void           pmap_redzone(void);
        !           175: int             pmap_dumpsize(void);
        !           176: int             pmap_dumpmmu(int (*)(dev_t, daddr64_t, caddr_t, size_t), daddr64_t);
        !           177: int            pmap_pa_exists(paddr_t);
        !           178: struct proc;
        !           179: void           switchexit(struct proc *);
        !           180:
        !           181: /* SPARC64 specific */
        !           182: int    ctx_alloc(struct pmap*);
        !           183: void   ctx_free(struct pmap*);
        !           184:
        !           185:
        !           186: #endif /* _KERNEL */
        !           187: #endif /* _LOCORE */
        !           188: #endif /* _MACHINE_PMAP_H_ */

CVSweb