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

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

1.1     ! nbrk        1: /*     $OpenBSD: pte.h,v 1.7 2006/06/02 19:53:30 miod Exp $    */
        !             2: /*     $NetBSD: pte.h,v 1.7 2001/07/31 06:55:46 eeh Exp $ */
        !             3:
        !             4: /*
        !             5:  * Copyright (c) 1996-1999 Eduardo Horvath
        !             6:  *
        !             7:  * Redistribution and use in source and binary forms, with or without
        !             8:  * modification, are permitted provided that the following conditions
        !             9:  * are met:
        !            10:  * 1. Redistributions of source code must retain the above copyright
        !            11:  *    notice, this list of conditions and the following disclaimer.
        !            12:  *
        !            13:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR  ``AS IS'' AND
        !            14:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            15:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            16:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR  BE LIABLE
        !            17:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            18:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            19:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            20:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            21:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            22:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            23:  * SUCH DAMAGE.
        !            24:  *
        !            25:  */
        !            26:
        !            27: /*
        !            28:  * Address translation works as follows:
        !            29:  *
        !            30:  **
        !            31:  * For sun4u:
        !            32:  *
        !            33:  *     Take your pick; it's all S/W anyway.  We'll start by emulating a sun4.
        !            34:  *     Oh, here's the sun4u TTE for reference:
        !            35:  *
        !            36:  *     struct sun4u_tte {
        !            37:  *             u_int64 tag_g:1,        (global flag)
        !            38:  *                     tag_ctxt:15,    (context for mapping)
        !            39:  *                     tag_unassigned:6,
        !            40:  *                     tag_va:42;      (virtual address bits<64:22>)
        !            41:  *             u_int64 data_v:1,       (valid bit)
        !            42:  *                     data_size:2,    (page size [8K*8**<SIZE>])
        !            43:  *                     data_nfo:1,     (no-fault only)
        !            44:  *                     data_ie:1,      (invert endianness [inefficient])
        !            45:  *                     data_soft2:2,   (reserved for S/W)
        !            46:  *                     data_pa:36,     (physical address)
        !            47:  *                     data_soft:6,    (reserved for S/W)
        !            48:  *                     data_lock:1,    (lock into TLB)
        !            49:  *                     data_cacheable:2,       (cacheability control)
        !            50:  *                     data_e:1,       (explicit accesses only)
        !            51:  *                     data_priv:1,    (privileged page)
        !            52:  *                     data_w:1,       (writeable)
        !            53:  *                     data_g:1;       (same as tag_g)
        !            54:  *     };
        !            55:  */
        !            56:
        !            57: /* virtual address to virtual page number */
        !            58: #define        VA_SUN4U_VPG(va)        (((int)(va) >> 13) & 31)
        !            59:
        !            60: /* virtual address to offset within page */
        !            61: #define VA_SUN4U_OFF(va)               (((int)(va)) & 0x1FFF)
        !            62:
        !            63: /* When we go to 64-bit VAs we need to handle the hole */
        !            64: #define VA_VPG(va)     VA_SUN4U_VPG(va)
        !            65: #define VA_OFF(va)     VA_SUN4U_OFF(va)
        !            66:
        !            67: #define PG_SHIFT4U     13
        !            68: #define MMU_PAGE_ALIGN 8192
        !            69:
        !            70: /* If you know where a tte is in the tsb, how do you find its va? */
        !            71: #define TSBVA(i)       ((tsb[(i)].tag.f.tag_va<<22)|(((i)<<13)&0x3ff000))
        !            72:
        !            73: #ifndef _LOCORE
        !            74: /*
        !            75:  *  This is the spitfire TTE.
        !            76:  *
        !            77:  *  We could use bitmasks and shifts to construct this if
        !            78:  *  we had a 64-bit compiler w/64-bit longs.  Otherwise it's
        !            79:  *  a real pain to do this in C.
        !            80:  */
        !            81: #if 0
        !            82: /* We don't use bitfields anyway. */
        !            83: struct sun4u_tag_fields {
        !            84:        u_int64_t       tag_g:1,        /* global flag */
        !            85:                tag_ctxt:15,    /* context for mapping */
        !            86:                tag_unassigned:6,
        !            87:                tag_va:42;      /* virtual address bits<64:22> */
        !            88: };
        !            89: union sun4u_tag { struct sun4u_tag_fields f; int64_t tag; };
        !            90: struct sun4u_data_fields {
        !            91:        u_int64_t       data_v:1,       /* valid bit */
        !            92:                data_size:2,    /* page size [8K*8**<SIZE>] */
        !            93:                data_nfo:1,     /* no-fault only */
        !            94:                data_ie:1,      /* invert endianness [inefficient] */
        !            95:                data_soft2:2,   /* reserved for S/W */
        !            96:                data_pa:36,     /* physical address */
        !            97:                data_accessed:1,/* S/W accessed bit */
        !            98:                data_modified:1,/* S/W modified bit */
        !            99:                data_realw:1,   /* S/W real writable bit (to manage modified) */
        !           100:                data_tsblock:1, /* S/W TSB locked entry */
        !           101:                data_exec:1,    /* S/W Executable */
        !           102:                data_onlyexec:1,/* S/W Executable only */
        !           103:                data_lock:1,    /* lock into TLB */
        !           104:                data_cacheable:2,       /* cacheability control */
        !           105:                data_e:1,       /* explicit accesses only */
        !           106:                data_priv:1,    /* privileged page */
        !           107:                data_w:1,       /* writeable */
        !           108:                data_g:1;       /* same as tag_g */
        !           109: };
        !           110: union sun4u_data { struct sun4u_data_fields f; int64_t data; };
        !           111: struct sun4u_tte {
        !           112:        union sun4u_tag tag;
        !           113:        union sun4u_data data;
        !           114: };
        !           115: #else
        !           116: struct sun4u_tte {
        !           117:        int64_t tag;
        !           118:        int64_t data;
        !           119: };
        !           120: #endif
        !           121: typedef struct sun4u_tte pte_t;
        !           122:
        !           123: /* Assembly routine to flush a mapping */
        !           124: extern void tlb_flush_pte(vaddr_t addr, int ctx);
        !           125: extern void tlb_flush_ctx(int ctx);
        !           126:
        !           127: #endif /* _LOCORE */
        !           128:
        !           129: /* TSB tag masks */
        !           130: #define CTX_MASK               ((1<<13)-1)
        !           131: #define TSB_TAG_CTX_SHIFT      48
        !           132: #define TSB_TAG_VA_SHIFT       22
        !           133: #define TSB_TAG_G              0x8000000000000000LL
        !           134:
        !           135: #define TSB_TAG_CTX(t)         ((((int64_t)(t))>>TSB_TAG_CTX_SHIFT)&CTX_MASK)
        !           136: #define TSB_TAG_VA(t)          ((((int64_t)(t))<<TSB_TAG_VA_SHIFT))
        !           137: #define TSB_TAG(g,ctx,va)      ((((u_int64_t)((g)!=0))<<63)|(((u_int64_t)(ctx)&CTX_MASK)<<TSB_TAG_CTX_SHIFT)|(((u_int64_t)va)>>TSB_TAG_VA_SHIFT))
        !           138:
        !           139: /* Page sizes */
        !           140: #define        PGSZ_8K                 0
        !           141: #define        PGSZ_64K                1
        !           142: #define        PGSZ_512K               2
        !           143: #define        PGSZ_4M                 3
        !           144:
        !           145: #define        PGSZ_SHIFT              61
        !           146: #define        TLB_SZ(s)               (((uint64_t)(s))<<PGSZ_SHIFT)
        !           147:
        !           148: /* TLB data masks */
        !           149: #define TLB_V                  0x8000000000000000LL
        !           150: #define TLB_8K                 TLB_SZ(PGSZ_8K)
        !           151: #define TLB_64K                        TLB_SZ(PGSZ_64K)
        !           152: #define TLB_512K               TLB_SZ(PGSZ_512K)
        !           153: #define TLB_4M                 TLB_SZ(PGSZ_4M)
        !           154: #define TLB_SZ_MASK            0x6000000000000000LL
        !           155: #define TLB_NFO                        0x1000000000000000LL
        !           156: #define TLB_IE                 0x0800000000000000LL
        !           157: #define TLB_SOFT2_MASK         0x07fc000000000000LL
        !           158: #define TLB_RESERVED_MASK      0x0003f80000000000LL
        !           159: #define TLB_PA_MASK            0x000007ffffffe000LL
        !           160: #define TLB_SOFT_MASK          0x0000000000001f80LL
        !           161: /* S/W bits */
        !           162: /* Access & TSB locked bits are swapped so I can set access w/one insn */
        !           163: /* #define TLB_ACCESS          0x0000000000001000LL */
        !           164: #define TLB_ACCESS             0x0000000000000200LL
        !           165: #define TLB_MODIFY             0x0000000000000800LL
        !           166: #define TLB_REAL_W             0x0000000000000400LL
        !           167: /* #define TLB_TSB_LOCK                0x0000000000000200LL */
        !           168: #define TLB_TSB_LOCK           0x0000000000001000LL
        !           169: #define TLB_EXEC               0x0000000000000100LL
        !           170: #define TLB_EXEC_ONLY          0x0000000000000080LL
        !           171: /* H/W bits */
        !           172: #define TLB_L                  0x0000000000000040LL
        !           173: #define TLB_CACHE_MASK         0x0000000000000030LL
        !           174: #define TLB_CP                 0x0000000000000020LL
        !           175: #define TLB_CV                 0x0000000000000010LL
        !           176: #define TLB_E                  0x0000000000000008LL
        !           177: #define TLB_P                  0x0000000000000004LL
        !           178: #define TLB_W                  0x0000000000000002LL
        !           179: #define TLB_G                  0x0000000000000001LL
        !           180:
        !           181: #define TSB_DATA(g,sz,pa,priv,write,cache,aliased,valid,ie) \
        !           182: (((valid)?TLB_V:0LL)|TLB_SZ(sz)|(((u_int64_t)(pa))&TLB_PA_MASK)|\
        !           183: ((cache)?((aliased)?TLB_CP:TLB_CACHE_MASK):TLB_E)|\
        !           184: ((priv)?TLB_P:0LL)|((write)?TLB_W:0LL)|((g)?TLB_G:0LL)|((ie)?TLB_IE:0LL))
        !           185:
        !           186: #define MMU_CACHE_VIRT 0x3
        !           187: #define MMU_CACHE_PHYS 0x2
        !           188: #define MMU_CACHE_NONE 0x0
        !           189:
        !           190: /* This needs to be updated for sun4u IOMMUs */
        !           191: /*
        !           192:  * IOMMU PTE bits.
        !           193:  */
        !           194: #define IOPTE_PPN_MASK  0x07ffff00
        !           195: #define IOPTE_PPN_SHIFT 8
        !           196: #define IOPTE_RSVD      0x000000f1
        !           197: #define IOPTE_WRITE     0x00000004
        !           198: #define IOPTE_VALID     0x00000002

CVSweb