[BACK]Return to pmap.h CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / arch / powerpc / include / oea

Annotation of src/sys/arch/powerpc/include/oea/pmap.h, Revision 1.16

1.16    ! cegger      1: /*     $NetBSD: pmap.h,v 1.15 2008/12/28 10:23:11 he Exp $     */
1.1       matt        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        _POWERPC_OEA_PMAP_H_
                     35: #define        _POWERPC_OEA_PMAP_H_
                     36:
1.15      he         37: #ifdef _KERNEL_OPT
1.12      garbled    38: #include "opt_ppcarch.h"
1.15      he         39: #endif
1.1       matt       40: #include <powerpc/oea/pte.h>
                     41:
                     42: #ifndef _LOCORE
                     43: /*
                     44:  * Pmap stuff
                     45:  */
                     46: struct pmap {
1.6       matt       47: #ifdef PPC_OEA64
                     48:        struct steg *pm_steg_table;             /* segment table pointer */
                     49:        /* XXX need way to track exec pages */
                     50: #endif
1.9       sanjayl    51:
                     52: #if defined(PPC_OEA) || defined (PPC_OEA64_BRIDGE)
1.2       matt       53:        register_t pm_sr[16];                   /* segments used in this pmap */
1.5       chs        54:        int pm_exec[16];                        /* counts of exec mappings */
1.6       matt       55: #endif
                     56:        register_t pm_vsid;                     /* VSID bits */
1.2       matt       57:        int pm_refs;                            /* ref count */
1.1       matt       58:        struct pmap_statistics pm_stats;        /* pmap statistics */
1.2       matt       59:        unsigned int pm_evictions;              /* pvo's not in page table */
1.9       sanjayl    60:
1.6       matt       61: #ifdef PPC_OEA64
                     62:        unsigned int pm_ste_evictions;
                     63: #endif
1.1       matt       64: };
                     65:
1.12      garbled    66: struct pmap_ops {
                     67:        int (*pmapop_pte_spill)(struct pmap *, vaddr_t, bool);
                     68:        void (*pmapop_real_memory)(paddr_t *, psize_t *);
                     69:        void (*pmapop_init)(void);
                     70:        void (*pmapop_virtual_space)(vaddr_t *, vaddr_t *);
                     71:        pmap_t (*pmapop_create)(void);
                     72:        void (*pmapop_reference)(pmap_t);
                     73:        void (*pmapop_destroy)(pmap_t);
                     74:        void (*pmapop_copy)(pmap_t, pmap_t, vaddr_t, vsize_t, vaddr_t);
                     75:        void (*pmapop_update)(pmap_t);
                     76:        void (*pmapop_collect)(pmap_t);
1.16    ! cegger     77:        int (*pmapop_enter)(pmap_t, vaddr_t, paddr_t, vm_prot_t, u_int);
1.12      garbled    78:        void (*pmapop_remove)(pmap_t, vaddr_t, vaddr_t);
                     79:        void (*pmapop_kenter_pa)(vaddr_t, paddr_t, vm_prot_t);
                     80:        void (*pmapop_kremove)(vaddr_t, vsize_t);
                     81:        bool (*pmapop_extract)(pmap_t, vaddr_t, paddr_t *);
                     82:
                     83:        void (*pmapop_protect)(pmap_t, vaddr_t, vaddr_t, vm_prot_t);
                     84:        void (*pmapop_unwire)(pmap_t, vaddr_t);
                     85:        void (*pmapop_page_protect)(struct vm_page *, vm_prot_t);
                     86:        bool (*pmapop_query_bit)(struct vm_page *, int);
                     87:        bool (*pmapop_clear_bit)(struct vm_page *, int);
                     88:
                     89:        void (*pmapop_activate)(struct lwp *);
                     90:        void (*pmapop_deactivate)(struct lwp *);
                     91:
                     92:        void (*pmapop_pinit)(pmap_t);
                     93:        void (*pmapop_procwr)(struct proc *, vaddr_t, size_t);
                     94:
                     95:        void (*pmapop_pte_print)(volatile struct pte *);
                     96:        void (*pmapop_pteg_check)(void);
                     97:        void (*pmapop_print_mmuregs)(void);
                     98:        void (*pmapop_print_pte)(pmap_t, vaddr_t);
                     99:        void (*pmapop_pteg_dist)(void);
                    100:        void (*pmapop_pvo_verify)(void);
                    101:        vaddr_t (*pmapop_steal_memory)(vsize_t, vaddr_t *, vaddr_t *);
                    102:        void (*pmapop_bootstrap)(paddr_t, paddr_t);
                    103: };
                    104:
1.1       matt      105: #ifdef _KERNEL
1.12      garbled   106: #include <sys/cdefs.h>
                    107: __BEGIN_DECLS
1.6       matt      108: #include <sys/param.h>
1.4       matt      109: #include <sys/systm.h>
                    110:
1.9       sanjayl   111: #if defined (PPC_OEA) || defined (PPC_OEA64_BRIDGE)
1.2       matt      112: extern register_t iosrtable[];
1.6       matt      113: #endif
1.1       matt      114: extern int pmap_use_altivec;
                    115:
                    116: #define pmap_clear_modify(pg)          (pmap_clear_bit((pg), PTE_CHG))
                    117: #define        pmap_clear_reference(pg)        (pmap_clear_bit((pg), PTE_REF))
                    118: #define        pmap_is_modified(pg)            (pmap_query_bit((pg), PTE_CHG))
                    119: #define        pmap_is_referenced(pg)          (pmap_query_bit((pg), PTE_REF))
                    120:
                    121: #define        pmap_phys_address(x)            (x)
                    122:
                    123: #define        pmap_resident_count(pmap)       ((pmap)->pm_stats.resident_count)
                    124: #define        pmap_wired_count(pmap)          ((pmap)->pm_stats.wired_count)
                    125:
1.3       matt      126: /* ARGSUSED */
1.8       perry     127: static inline void
1.1       matt      128: pmap_remove_all(struct pmap *pmap)
                    129: {
                    130:        /* Nothing. */
                    131: }
                    132:
1.13      matt      133: #if (defined(PPC_OEA) + defined(PPC_OEA64) + defined(PPC_OEA64_BRIDGE)) != 1
1.12      garbled   134: #define        PMAP_EXCLUDE_DECLS
1.6       matt      135: #endif
1.1       matt      136:
1.12      garbled   137: #ifndef PMAP_NOOPNAMES
1.11      garbled   138:
1.12      garbled   139: #if !defined(PMAP_EXCLUDE_DECLS)
                    140: void pmap_bootstrap(vaddr_t, vaddr_t);
                    141: bool pmap_extract(pmap_t, vaddr_t, paddr_t *);
                    142: bool pmap_query_bit(struct vm_page *, int);
                    143: bool pmap_clear_bit(struct vm_page *, int);
                    144: void pmap_real_memory(paddr_t *, psize_t *);
1.5       chs       145: void pmap_procwr(struct proc *, vaddr_t, size_t);
1.12      garbled   146: int pmap_pte_spill(pmap_t, vaddr_t, bool);
                    147: void pmap_pinit(pmap_t);
1.1       matt      148:
1.12      garbled   149: #else
                    150: #define        PMAPOPNAME(name) (*pmapops->pmapop_##name)
                    151: extern const struct pmap_ops *pmapops;
                    152: #define        pmap_pte_spill          PMAPOPNAME(pte_spill)
                    153: #define        pmap_real_memory        PMAPOPNAME(real_memory)
                    154: #define        pmap_init               PMAPOPNAME(init)
                    155: #define        pmap_virtual_space      PMAPOPNAME(virtual_space)
                    156: #define        pmap_create             PMAPOPNAME(create)
                    157: #define        pmap_reference          PMAPOPNAME(reference)
                    158: #define        pmap_destroy            PMAPOPNAME(destroy)
                    159: #define        pmap_copy               PMAPOPNAME(copy)
                    160: #define        pmap_update             PMAPOPNAME(update)
                    161: #define        pmap_collect            PMAPOPNAME(collect)
                    162: #define        pmap_enter              PMAPOPNAME(enter)
                    163: #define        pmap_remove             PMAPOPNAME(remove)
                    164: #define        pmap_kenter_pa          PMAPOPNAME(kenter_pa)
                    165: #define        pmap_kremove            PMAPOPNAME(kremove)
                    166: #define        pmap_extract            PMAPOPNAME(extract)
                    167: #define        pmap_protect            PMAPOPNAME(protect)
                    168: #define        pmap_unwire             PMAPOPNAME(unwire)
                    169: #define        pmap_page_protect       PMAPOPNAME(page_protect)
                    170: #define        pmap_query_bit          PMAPOPNAME(query_bit)
                    171: #define        pmap_clear_bit          PMAPOPNAME(clear_bit)
                    172:
                    173: #define        pmap_activate           PMAPOPNAME(activate)
                    174: #define        pmap_deactivate         PMAPOPNAME(deactivate)
                    175:
                    176: #define        pmap_pinit              PMAPOPNAME(pinit)
                    177: #define        pmap_procwr             PMAPOPNAME(procwr)
                    178:
                    179: #define        pmap_pte_print          PMAPOPNAME(pte_print)
                    180: #define        pmap_pteg_check         PMAPOPNAME(pteg_check)
                    181: #define        pmap_print_mmuregs      PMAPOPNAME(print_mmuregs)
                    182: #define        pmap_print_pte          PMAPOPNAME(print_pte)
                    183: #define        pmap_pteg_dist          PMAPOPNAME(pteg_dist)
                    184: #define        pmap_pvo_verify         PMAPOPNAME(pvo_verify)
                    185: #define        pmap_steal_memory       PMAPOPNAME(steal_memory)
                    186: #define        pmap_bootstrap          PMAPOPNAME(bootstrap)
                    187: #endif /* PMAP_EXCLUDE_DECLS */
1.1       matt      188:
1.8       perry     189: static inline paddr_t vtophys (vaddr_t);
1.4       matt      190:
1.1       matt      191: /*
                    192:  * Alternate mapping hooks for pool pages.  Avoids thrashing the TLB.
                    193:  *
                    194:  * Note: This won't work if we have more memory than can be direct-mapped
                    195:  * VA==PA all at once.  But pmap_copy_page() and pmap_zero_page() will have
                    196:  * this problem, too.
                    197:  */
1.9       sanjayl   198: #if !defined(PPC_OEA64) && !defined (PPC_OEA64_BRIDGE)
1.1       matt      199: #define        PMAP_MAP_POOLPAGE(pa)   (pa)
                    200: #define        PMAP_UNMAP_POOLPAGE(pa) (pa)
1.4       matt      201: #define POOL_VTOPHYS(va)       vtophys((vaddr_t) va)
1.6       matt      202: #endif
1.1       matt      203:
1.8       perry     204: static inline paddr_t
1.1       matt      205: vtophys(vaddr_t va)
                    206: {
                    207:        paddr_t pa;
                    208:
                    209:        if (pmap_extract(pmap_kernel(), va, &pa))
                    210:                return pa;
1.4       matt      211:        KASSERT(0);
                    212:        return (paddr_t) -1;
1.1       matt      213: }
                    214:
1.12      garbled   215: extern const struct pmap_ops *pmapops;
                    216: extern const struct pmap_ops pmap32_ops;
                    217: extern const struct pmap_ops pmap64_ops;
                    218: extern const struct pmap_ops pmap64bridge_ops;
                    219:
                    220: static inline void
                    221: pmap_setup32(void)
                    222: {
                    223:        pmapops = &pmap32_ops;
                    224: }
                    225:
                    226: static inline void
                    227: pmap_setup64(void)
                    228: {
                    229:        pmapops = &pmap64_ops;
                    230: }
                    231:
                    232: static inline void
                    233: pmap_setup64bridge(void)
                    234: {
                    235:        pmapops = &pmap64bridge_ops;
                    236: }
                    237:
                    238: #endif /* !PMAP_NOOPNAMES */
                    239:
                    240: bool pmap_pageidlezero (paddr_t);
                    241: void pmap_syncicache (paddr_t, psize_t);
                    242: #ifdef PPC_OEA64
                    243: vaddr_t pmap_setusr (vaddr_t);
                    244: vaddr_t pmap_unsetusr (void);
                    245: #endif
                    246:
                    247: #ifdef PPC_OEA64_BRIDGE
                    248: int pmap_setup_segment0_map(int use_large_pages, ...);
                    249: #endif
                    250:
                    251: #define        PMAP_NC                 0x1000
                    252: #define PMAP_STEAL_MEMORY
                    253: #define PMAP_NEED_PROCWR
                    254:
                    255: void pmap_zero_page(paddr_t);
                    256: void pmap_copy_page(paddr_t, paddr_t);
                    257:
                    258: __END_DECLS
1.1       matt      259: #endif /* _KERNEL */
                    260: #endif /* _LOCORE */
                    261:
                    262: #endif /* _POWERPC_OEA_PMAP_H_ */

CVSweb <webmaster@jp.NetBSD.org>