[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

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