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

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

1.1     ! nbrk        1: /*     $OpenBSD: pmap.h,v 1.7 2007/04/21 19:26:04 miod Exp $   */
        !             2: /*     $NetBSD: pmap.h,v 1.76 2003/09/06 09:10:46 rearnsha Exp $       */
        !             3:
        !             4: /*
        !             5:  * Copyright (c) 2002, 2003 Wasabi Systems, Inc.
        !             6:  * All rights reserved.
        !             7:  *
        !             8:  * Written by Jason R. Thorpe & Steve C. Woodford for Wasabi Systems, Inc.
        !             9:  *
        !            10:  * Redistribution and use in source and binary forms, with or without
        !            11:  * modification, are permitted provided that the following conditions
        !            12:  * are met:
        !            13:  * 1. Redistributions of source code must retain the above copyright
        !            14:  *    notice, this list of conditions and the following disclaimer.
        !            15:  * 2. Redistributions in binary form must reproduce the above copyright
        !            16:  *    notice, this list of conditions and the following disclaimer in the
        !            17:  *    documentation and/or other materials provided with the distribution.
        !            18:  * 3. All advertising materials mentioning features or use of this software
        !            19:  *    must display the following acknowledgement:
        !            20:  *     This product includes software developed for the NetBSD Project by
        !            21:  *     Wasabi Systems, Inc.
        !            22:  * 4. The name of Wasabi Systems, Inc. may not be used to endorse
        !            23:  *    or promote products derived from this software without specific prior
        !            24:  *    written permission.
        !            25:  *
        !            26:  * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
        !            27:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
        !            28:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
        !            29:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
        !            30:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
        !            31:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
        !            32:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
        !            33:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
        !            34:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
        !            35:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
        !            36:  * POSSIBILITY OF SUCH DAMAGE.
        !            37:  */
        !            38:
        !            39: /*
        !            40:  * Copyright (c) 1994,1995 Mark Brinicombe.
        !            41:  * All rights reserved.
        !            42:  *
        !            43:  * Redistribution and use in source and binary forms, with or without
        !            44:  * modification, are permitted provided that the following conditions
        !            45:  * are met:
        !            46:  * 1. Redistributions of source code must retain the above copyright
        !            47:  *    notice, this list of conditions and the following disclaimer.
        !            48:  * 2. Redistributions in binary form must reproduce the above copyright
        !            49:  *    notice, this list of conditions and the following disclaimer in the
        !            50:  *    documentation and/or other materials provided with the distribution.
        !            51:  * 3. All advertising materials mentioning features or use of this software
        !            52:  *    must display the following acknowledgement:
        !            53:  *     This product includes software developed by Mark Brinicombe
        !            54:  * 4. The name of the author may not be used to endorse or promote products
        !            55:  *    derived from this software without specific prior written permission.
        !            56:  *
        !            57:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
        !            58:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
        !            59:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
        !            60:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
        !            61:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
        !            62:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
        !            63:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
        !            64:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        !            65:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
        !            66:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        !            67:  */
        !            68:
        !            69: #ifndef        _ARM32_PMAP_H_
        !            70: #define        _ARM32_PMAP_H_
        !            71:
        !            72: #ifdef _KERNEL
        !            73:
        !            74: #include <arm/cpuconf.h>
        !            75: #include <arm/pte.h>
        !            76: #ifndef _LOCORE
        !            77: #include <arm/cpufunc.h>
        !            78: #endif
        !            79:
        !            80: /*
        !            81:  * a pmap describes a processes' 4GB virtual address space.  this
        !            82:  * virtual address space can be broken up into 4096 1MB regions which
        !            83:  * are described by L1 PTEs in the L1 table.
        !            84:  *
        !            85:  * There is a line drawn at KERNEL_BASE.  Everything below that line
        !            86:  * changes when the VM context is switched.  Everything above that line
        !            87:  * is the same no matter which VM context is running.  This is achieved
        !            88:  * by making the L1 PTEs for those slots above KERNEL_BASE reference
        !            89:  * kernel L2 tables.
        !            90:  *
        !            91:  * The basic layout of the virtual address space thus looks like this:
        !            92:  *
        !            93:  *     0xffffffff
        !            94:  *     .
        !            95:  *     .
        !            96:  *     .
        !            97:  *     KERNEL_BASE
        !            98:  *     --------------------
        !            99:  *     .
        !           100:  *     .
        !           101:  *     .
        !           102:  *     0x00000000
        !           103:  */
        !           104:
        !           105: /*
        !           106:  * The number of L2 descriptor tables which can be tracked by an l2_dtable.
        !           107:  * A bucket size of 16 provides for 16MB of contiguous virtual address
        !           108:  * space per l2_dtable. Most processes will, therefore, require only two or
        !           109:  * three of these to map their whole working set.
        !           110:  */
        !           111: #define        L2_BUCKET_LOG2  4
        !           112: #define        L2_BUCKET_SIZE  (1 << L2_BUCKET_LOG2)
        !           113:
        !           114: /*
        !           115:  * Given the above "L2-descriptors-per-l2_dtable" constant, the number
        !           116:  * of l2_dtable structures required to track all possible page descriptors
        !           117:  * mappable by an L1 translation table is given by the following constants:
        !           118:  */
        !           119: #define        L2_LOG2         ((32 - L1_S_SHIFT) - L2_BUCKET_LOG2)
        !           120: #define        L2_SIZE         (1 << L2_LOG2)
        !           121:
        !           122: #ifndef _LOCORE
        !           123:
        !           124: struct l1_ttable;
        !           125: struct l2_dtable;
        !           126:
        !           127: /*
        !           128:  * Track cache/tlb occupancy using the following structure
        !           129:  */
        !           130: union pmap_cache_state {
        !           131:        struct {
        !           132:                union {
        !           133:                        u_int8_t csu_cache_b[2];
        !           134:                        u_int16_t csu_cache;
        !           135:                } cs_cache_u;
        !           136:
        !           137:                union {
        !           138:                        u_int8_t csu_tlb_b[2];
        !           139:                        u_int16_t csu_tlb;
        !           140:                } cs_tlb_u;
        !           141:        } cs_s;
        !           142:        u_int32_t cs_all;
        !           143: };
        !           144: #define        cs_cache_id     cs_s.cs_cache_u.csu_cache_b[0]
        !           145: #define        cs_cache_d      cs_s.cs_cache_u.csu_cache_b[1]
        !           146: #define        cs_cache        cs_s.cs_cache_u.csu_cache
        !           147: #define        cs_tlb_id       cs_s.cs_tlb_u.csu_tlb_b[0]
        !           148: #define        cs_tlb_d        cs_s.cs_tlb_u.csu_tlb_b[1]
        !           149: #define        cs_tlb          cs_s.cs_tlb_u.csu_tlb
        !           150:
        !           151: /*
        !           152:  * Assigned to cs_all to force cacheops to work for a particular pmap
        !           153:  */
        !           154: #define        PMAP_CACHE_STATE_ALL    0xffffffffu
        !           155:
        !           156: /*
        !           157:  * This structure is used by machine-dependent code to describe
        !           158:  * static mappings of devices, created at bootstrap time.
        !           159:  */
        !           160: struct pmap_devmap {
        !           161:        vaddr_t         pd_va;          /* virtual address */
        !           162:        paddr_t         pd_pa;          /* physical address */
        !           163:        psize_t         pd_size;        /* size of region */
        !           164:        vm_prot_t       pd_prot;        /* protection code */
        !           165:        int             pd_cache;       /* cache attributes */
        !           166: };
        !           167:
        !           168: /*
        !           169:  * The pmap structure itself
        !           170:  */
        !           171: struct pmap {
        !           172:        u_int8_t                pm_domain;
        !           173:        boolean_t               pm_remove_all;
        !           174:        struct l1_ttable        *pm_l1;
        !           175:        union pmap_cache_state  pm_cstate;
        !           176:        u_int                   pm_refs;
        !           177:        simple_lock_data_t      pm_lock;
        !           178:        struct l2_dtable        *pm_l2[L2_SIZE];
        !           179:        struct pmap_statistics  pm_stats;
        !           180:        LIST_ENTRY(pmap)        pm_list;
        !           181: };
        !           182:
        !           183: typedef struct pmap *pmap_t;
        !           184:
        !           185: /*
        !           186:  * Physical / virtual address structure. In a number of places (particularly
        !           187:  * during bootstrapping) we need to keep track of the physical and virtual
        !           188:  * addresses of various pages
        !           189:  */
        !           190: typedef struct pv_addr {
        !           191:        SLIST_ENTRY(pv_addr) pv_list;
        !           192:        paddr_t pv_pa;
        !           193:        vaddr_t pv_va;
        !           194: } pv_addr_t;
        !           195:
        !           196: /*
        !           197:  * Determine various modes for PTEs (user vs. kernel, cacheable
        !           198:  * vs. non-cacheable).
        !           199:  */
        !           200: #define        PTE_KERNEL      0
        !           201: #define        PTE_USER        1
        !           202: #define        PTE_NOCACHE     0
        !           203: #define        PTE_CACHE       1
        !           204: #define        PTE_PAGETABLE   2
        !           205:
        !           206: /*
        !           207:  * Flags that indicate attributes of pages or mappings of pages.
        !           208:  *
        !           209:  * The PVF_MOD and PVF_REF flags are stored in the mdpage for each
        !           210:  * page.  PVF_WIRED, PVF_WRITE, and PVF_NC are kept in individual
        !           211:  * pv_entry's for each page.  They live in the same "namespace" so
        !           212:  * that we can clear multiple attributes at a time.
        !           213:  *
        !           214:  * Note the "non-cacheable" flag generally means the page has
        !           215:  * multiple mappings in a given address space.
        !           216:  */
        !           217: #define        PVF_MOD         0x01            /* page is modified */
        !           218: #define        PVF_REF         0x02            /* page is referenced */
        !           219: #define        PVF_WIRED       0x04            /* mapping is wired */
        !           220: #define        PVF_WRITE       0x08            /* mapping is writable */
        !           221: #define        PVF_EXEC        0x10            /* mapping is executable */
        !           222: #define        PVF_UNC         0x20            /* mapping is 'user' non-cacheable */
        !           223: #define        PVF_KNC         0x40            /* mapping is 'kernel' non-cacheable */
        !           224: #define        PVF_NC          (PVF_UNC|PVF_KNC)
        !           225:
        !           226: /*
        !           227:  * Commonly referenced structures
        !           228:  */
        !           229: extern struct pmap     kernel_pmap_store;
        !           230: extern int             pmap_debug_level; /* Only exists if PMAP_DEBUG */
        !           231:
        !           232: /*
        !           233:  * Macros that we need to export
        !           234:  */
        !           235: #define pmap_kernel()                  (&kernel_pmap_store)
        !           236: #define        pmap_resident_count(pmap)       ((pmap)->pm_stats.resident_count)
        !           237: #define        pmap_wired_count(pmap)          ((pmap)->pm_stats.wired_count)
        !           238:
        !           239: #define        pmap_is_modified(pg)    \
        !           240:        (((pg)->mdpage.pvh_attrs & PVF_MOD) != 0)
        !           241: #define        pmap_is_referenced(pg)  \
        !           242:        (((pg)->mdpage.pvh_attrs & PVF_REF) != 0)
        !           243:
        !           244: #define        pmap_copy(dp, sp, da, l, sa)    /* nothing */
        !           245:
        !           246: #define pmap_phys_address(ppn)         (ptoa(ppn))
        !           247:
        !           248: #define pmap_proc_iflush(p, va, len)   /* nothing */
        !           249: #define pmap_unuse_final(p)            /* nothing */
        !           250:
        !           251: /*
        !           252:  * Functions that we need to export
        !           253:  */
        !           254: void   pmap_procwr(struct proc *, vaddr_t, int);
        !           255: void   pmap_remove_all(pmap_t);
        !           256: boolean_t pmap_extract(pmap_t, vaddr_t, paddr_t *);
        !           257:
        !           258: #define        PMAP_NEED_PROCWR
        !           259: #define PMAP_GROWKERNEL                /* turn on pmap_growkernel interface */
        !           260:
        !           261: /* Functions we use internally. */
        !           262: void   pmap_bootstrap(pd_entry_t *, vaddr_t, vaddr_t);
        !           263:
        !           264: int    pmap_fault_fixup(pmap_t, vaddr_t, vm_prot_t, int);
        !           265: boolean_t pmap_get_pde_pte(pmap_t, vaddr_t, pd_entry_t **, pt_entry_t **);
        !           266: boolean_t pmap_get_pde(pmap_t, vaddr_t, pd_entry_t **);
        !           267: void   pmap_set_pcb_pagedir(pmap_t, struct pcb *);
        !           268:
        !           269: void   pmap_debug(int);
        !           270: void   pmap_postinit(void);
        !           271:
        !           272: void   vector_page_setprot(int);
        !           273:
        !           274: const struct pmap_devmap *pmap_devmap_find_pa(paddr_t, psize_t);
        !           275: const struct pmap_devmap *pmap_devmap_find_va(vaddr_t, vsize_t);
        !           276:
        !           277: /* Bootstrapping routines. */
        !           278: void   pmap_map_section(vaddr_t, vaddr_t, paddr_t, int, int);
        !           279: void   pmap_map_entry(vaddr_t, vaddr_t, paddr_t, int, int);
        !           280: vsize_t        pmap_map_chunk(vaddr_t, vaddr_t, paddr_t, vsize_t, int, int);
        !           281: void   pmap_link_l2pt(vaddr_t, vaddr_t, pv_addr_t *);
        !           282: void   pmap_devmap_bootstrap(vaddr_t, const struct pmap_devmap *);
        !           283: void   pmap_devmap_register(const struct pmap_devmap *);
        !           284:
        !           285: /*
        !           286:  * Special page zero routine for use by the idle loop (no cache cleans).
        !           287:  */
        !           288: boolean_t      pmap_pageidlezero(struct vm_page *);
        !           289: #define PMAP_PAGEIDLEZERO(pg)  pmap_pageidlezero((pg))
        !           290:
        !           291: /*
        !           292:  * The current top of kernel VM
        !           293:  */
        !           294: extern vaddr_t pmap_curmaxkvaddr;
        !           295:
        !           296: /*
        !           297:  * Useful macros and constants
        !           298:  */
        !           299:
        !           300: /* Virtual address to page table entry */
        !           301: static __inline pt_entry_t *
        !           302: vtopte(vaddr_t va)
        !           303: {
        !           304:        pd_entry_t *pdep;
        !           305:        pt_entry_t *ptep;
        !           306:
        !           307:        if (pmap_get_pde_pte(pmap_kernel(), va, &pdep, &ptep) == FALSE)
        !           308:                return (NULL);
        !           309:        return (ptep);
        !           310: }
        !           311:
        !           312: /*
        !           313:  * The new pmap ensures that page-tables are always mapping Write-Thru.
        !           314:  * Thus, on some platforms we can run fast and loose and avoid syncing PTEs
        !           315:  * on every change.
        !           316:  *
        !           317:  * Unfortunately, not all CPUs have a write-through cache mode.  So we
        !           318:  * define PMAP_NEEDS_PTE_SYNC for C code to conditionally do PTE syncs,
        !           319:  * and if there is the chance for PTE syncs to be needed, we define
        !           320:  * PMAP_INCLUDE_PTE_SYNC so e.g. assembly code can include (and run)
        !           321:  * the code.
        !           322:  */
        !           323: extern int pmap_needs_pte_sync;
        !           324:
        !           325: /*
        !           326:  * StrongARM SA-1 caches do not have a write-through mode.  So, on these,
        !           327:  * we need to do PTE syncs.  If only SA-1 is configured, then evaluate
        !           328:  * this at compile time.
        !           329:  */
        !           330: #if (ARM_MMU_SA1 == 1) && (ARM_NMMUS == 1)
        !           331: #define        PMAP_NEEDS_PTE_SYNC     1
        !           332: #define        PMAP_INCLUDE_PTE_SYNC
        !           333: #elif (ARM_MMU_SA1 == 0)
        !           334: #define        PMAP_NEEDS_PTE_SYNC     0
        !           335: #endif
        !           336:
        !           337: /*
        !           338:  * Provide a fallback in case we were not able to determine it at
        !           339:  * compile-time.
        !           340:  */
        !           341: #ifndef PMAP_NEEDS_PTE_SYNC
        !           342: #define        PMAP_NEEDS_PTE_SYNC     pmap_needs_pte_sync
        !           343: #define        PMAP_INCLUDE_PTE_SYNC
        !           344: #endif
        !           345:
        !           346: #define        PTE_SYNC(pte)                                                   \
        !           347: do {                                                                   \
        !           348:        if (PMAP_NEEDS_PTE_SYNC)                                        \
        !           349:                cpu_dcache_wb_range((vaddr_t)(pte), sizeof(pt_entry_t));\
        !           350: } while (/*CONSTCOND*/0)
        !           351:
        !           352: #define        PTE_SYNC_RANGE(pte, cnt)                                        \
        !           353: do {                                                                   \
        !           354:        if (PMAP_NEEDS_PTE_SYNC) {                                      \
        !           355:                cpu_dcache_wb_range((vaddr_t)(pte),                     \
        !           356:                    (cnt) << 2); /* * sizeof(pt_entry_t) */             \
        !           357:        }                                                               \
        !           358: } while (/*CONSTCOND*/0)
        !           359:
        !           360: #define        l1pte_valid(pde)        ((pde) != 0)
        !           361: #define        l1pte_section_p(pde)    (((pde) & L1_TYPE_MASK) == L1_TYPE_S)
        !           362: #define        l1pte_page_p(pde)       (((pde) & L1_TYPE_MASK) == L1_TYPE_C)
        !           363: #define        l1pte_fpage_p(pde)      (((pde) & L1_TYPE_MASK) == L1_TYPE_F)
        !           364:
        !           365: #define l2pte_index(v)         (((v) & L2_ADDR_BITS) >> L2_S_SHIFT)
        !           366: #define        l2pte_valid(pte)        ((pte) != 0)
        !           367: #define        l2pte_pa(pte)           ((pte) & L2_S_FRAME)
        !           368: #define l2pte_minidata(pte)    (((pte) & \
        !           369:                                 (L2_B | L2_C | L2_XSCALE_T_TEX(TEX_XSCALE_X)))\
        !           370:                                 == (L2_C | L2_XSCALE_T_TEX(TEX_XSCALE_X)))
        !           371:
        !           372: /* L1 and L2 page table macros */
        !           373: #define pmap_pde_v(pde)                l1pte_valid(*(pde))
        !           374: #define pmap_pde_section(pde)  l1pte_section_p(*(pde))
        !           375: #define pmap_pde_page(pde)     l1pte_page_p(*(pde))
        !           376: #define pmap_pde_fpage(pde)    l1pte_fpage_p(*(pde))
        !           377:
        !           378: #define        pmap_pte_v(pte)         l2pte_valid(*(pte))
        !           379: #define        pmap_pte_pa(pte)        l2pte_pa(*(pte))
        !           380:
        !           381: /* Size of the kernel part of the L1 page table */
        !           382: #define KERNEL_PD_SIZE \
        !           383:        (L1_TABLE_SIZE - (KERNEL_BASE >> L1_S_SHIFT) * sizeof(pd_entry_t))
        !           384:
        !           385: /************************* ARM MMU configuration *****************************/
        !           386:
        !           387: #if (ARM_MMU_GENERIC + ARM_MMU_SA1) != 0
        !           388: void   pmap_copy_page_generic(struct vm_page *, struct vm_page *);
        !           389: void   pmap_zero_page_generic(struct vm_page *);
        !           390:
        !           391: void   pmap_pte_init_generic(void);
        !           392: #if defined(CPU_ARM8)
        !           393: void   pmap_pte_init_arm8(void);
        !           394: #endif
        !           395: #if defined(CPU_ARM9)
        !           396: void   pmap_pte_init_arm9(void);
        !           397: #endif /* CPU_ARM9 */
        !           398: #if defined(CPU_ARM10)
        !           399: void   pmap_pte_init_arm10(void);
        !           400: #endif /* CPU_ARM10 */
        !           401: #endif /* (ARM_MMU_GENERIC + ARM_MMU_SA1) != 0 */
        !           402:
        !           403: #if ARM_MMU_SA1 == 1
        !           404: void   pmap_pte_init_sa1(void);
        !           405: #endif /* ARM_MMU_SA1 == 1 */
        !           406:
        !           407: #if ARM_MMU_XSCALE == 1
        !           408: void   pmap_copy_page_xscale(struct vm_page *, struct vm_page *);
        !           409: void   pmap_zero_page_xscale(struct vm_page *);
        !           410:
        !           411: void   pmap_pte_init_xscale(void);
        !           412:
        !           413: void   xscale_setup_minidata(vaddr_t, vaddr_t, paddr_t);
        !           414:
        !           415: #define        PMAP_UAREA(va)          pmap_uarea(va)
        !           416: void   pmap_uarea(vaddr_t);
        !           417: #endif /* ARM_MMU_XSCALE == 1 */
        !           418:
        !           419: extern pt_entry_t              pte_l1_s_cache_mode;
        !           420: extern pt_entry_t              pte_l1_s_cache_mask;
        !           421:
        !           422: extern pt_entry_t              pte_l2_l_cache_mode;
        !           423: extern pt_entry_t              pte_l2_l_cache_mask;
        !           424:
        !           425: extern pt_entry_t              pte_l2_s_cache_mode;
        !           426: extern pt_entry_t              pte_l2_s_cache_mask;
        !           427:
        !           428: extern pt_entry_t              pte_l1_s_cache_mode_pt;
        !           429: extern pt_entry_t              pte_l2_l_cache_mode_pt;
        !           430: extern pt_entry_t              pte_l2_s_cache_mode_pt;
        !           431:
        !           432: extern pt_entry_t              pte_l2_s_prot_u;
        !           433: extern pt_entry_t              pte_l2_s_prot_w;
        !           434: extern pt_entry_t              pte_l2_s_prot_mask;
        !           435:
        !           436: extern pt_entry_t              pte_l1_s_proto;
        !           437: extern pt_entry_t              pte_l1_c_proto;
        !           438: extern pt_entry_t              pte_l2_s_proto;
        !           439:
        !           440: extern void (*pmap_copy_page_func)(struct vm_page *, struct vm_page *);
        !           441: extern void (*pmap_zero_page_func)(struct vm_page *);
        !           442:
        !           443: #endif /* !_LOCORE */
        !           444:
        !           445: /*****************************************************************************/
        !           446:
        !           447: /*
        !           448:  * tell MI code that the cache is virtually-indexed *and* virtually-tagged.
        !           449:  */
        !           450: #define PMAP_CACHE_VIVT
        !           451:
        !           452: /*
        !           453:  * Definitions for MMU domains
        !           454:  */
        !           455: #define        PMAP_DOMAINS            15      /* 15 'user' domains (0-14) */
        !           456: #define        PMAP_DOMAIN_KERNEL      15      /* The kernel uses domain #15 */
        !           457:
        !           458: /*
        !           459:  * These macros define the various bit masks in the PTE.
        !           460:  *
        !           461:  * We use these macros since we use different bits on different processor
        !           462:  * models.
        !           463:  */
        !           464: #define        L1_S_PROT_U             (L1_S_AP(AP_U))
        !           465: #define        L1_S_PROT_W             (L1_S_AP(AP_W))
        !           466: #define        L1_S_PROT_MASK          (L1_S_PROT_U|L1_S_PROT_W)
        !           467:
        !           468: #define        L1_S_CACHE_MASK_generic (L1_S_B|L1_S_C)
        !           469: #define        L1_S_CACHE_MASK_xscale  (L1_S_B|L1_S_C|L1_S_XSCALE_TEX(TEX_XSCALE_X))
        !           470:
        !           471: #define        L2_L_PROT_U             (L2_AP(AP_U))
        !           472: #define        L2_L_PROT_W             (L2_AP(AP_W))
        !           473: #define        L2_L_PROT_MASK          (L2_L_PROT_U|L2_L_PROT_W)
        !           474:
        !           475: #define        L2_L_CACHE_MASK_generic (L2_B|L2_C)
        !           476: #define        L2_L_CACHE_MASK_xscale  (L2_B|L2_C|L2_XSCALE_L_TEX(TEX_XSCALE_X))
        !           477:
        !           478: #define        L2_S_PROT_U_generic     (L2_AP(AP_U))
        !           479: #define        L2_S_PROT_W_generic     (L2_AP(AP_W))
        !           480: #define        L2_S_PROT_MASK_generic  (L2_S_PROT_U|L2_S_PROT_W)
        !           481:
        !           482: #define        L2_S_PROT_U_xscale      (L2_AP0(AP_U))
        !           483: #define        L2_S_PROT_W_xscale      (L2_AP0(AP_W))
        !           484: #define        L2_S_PROT_MASK_xscale   (L2_S_PROT_U|L2_S_PROT_W)
        !           485:
        !           486: #define        L2_S_CACHE_MASK_generic (L2_B|L2_C)
        !           487: #define        L2_S_CACHE_MASK_xscale  (L2_B|L2_C|L2_XSCALE_T_TEX(TEX_XSCALE_X))
        !           488:
        !           489: #define        L1_S_PROTO_generic      (L1_TYPE_S | L1_S_IMP)
        !           490: #define        L1_S_PROTO_xscale       (L1_TYPE_S)
        !           491:
        !           492: #define        L1_C_PROTO_generic      (L1_TYPE_C | L1_C_IMP2)
        !           493: #define        L1_C_PROTO_xscale       (L1_TYPE_C)
        !           494:
        !           495: #define        L2_L_PROTO              (L2_TYPE_L)
        !           496:
        !           497: #define        L2_S_PROTO_generic      (L2_TYPE_S)
        !           498: #define        L2_S_PROTO_xscale       (L2_TYPE_XSCALE_XS)
        !           499:
        !           500: /*
        !           501:  * User-visible names for the ones that vary with MMU class.
        !           502:  */
        !           503:
        !           504: #if ARM_NMMUS > 1
        !           505: /* More than one MMU class configured; use variables. */
        !           506: #define        L2_S_PROT_U             pte_l2_s_prot_u
        !           507: #define        L2_S_PROT_W             pte_l2_s_prot_w
        !           508: #define        L2_S_PROT_MASK          pte_l2_s_prot_mask
        !           509:
        !           510: #define        L1_S_CACHE_MASK         pte_l1_s_cache_mask
        !           511: #define        L2_L_CACHE_MASK         pte_l2_l_cache_mask
        !           512: #define        L2_S_CACHE_MASK         pte_l2_s_cache_mask
        !           513:
        !           514: #define        L1_S_PROTO              pte_l1_s_proto
        !           515: #define        L1_C_PROTO              pte_l1_c_proto
        !           516: #define        L2_S_PROTO              pte_l2_s_proto
        !           517:
        !           518: #define        pmap_copy_page(s, d)    (*pmap_copy_page_func)((s), (d))
        !           519: #define        pmap_zero_page(d)       (*pmap_zero_page_func)((d))
        !           520: #elif (ARM_MMU_GENERIC + ARM_MMU_SA1) != 0
        !           521: #define        L2_S_PROT_U             L2_S_PROT_U_generic
        !           522: #define        L2_S_PROT_W             L2_S_PROT_W_generic
        !           523: #define        L2_S_PROT_MASK          L2_S_PROT_MASK_generic
        !           524:
        !           525: #define        L1_S_CACHE_MASK         L1_S_CACHE_MASK_generic
        !           526: #define        L2_L_CACHE_MASK         L2_L_CACHE_MASK_generic
        !           527: #define        L2_S_CACHE_MASK         L2_S_CACHE_MASK_generic
        !           528:
        !           529: #define        L1_S_PROTO              L1_S_PROTO_generic
        !           530: #define        L1_C_PROTO              L1_C_PROTO_generic
        !           531: #define        L2_S_PROTO              L2_S_PROTO_generic
        !           532:
        !           533: #define        pmap_copy_page(s, d)    pmap_copy_page_generic((s), (d))
        !           534: #define        pmap_zero_page(d)       pmap_zero_page_generic((d))
        !           535: #elif ARM_MMU_XSCALE == 1
        !           536: #define        L2_S_PROT_U             L2_S_PROT_U_xscale
        !           537: #define        L2_S_PROT_W             L2_S_PROT_W_xscale
        !           538: #define        L2_S_PROT_MASK          L2_S_PROT_MASK_xscale
        !           539:
        !           540: #define        L1_S_CACHE_MASK         L1_S_CACHE_MASK_xscale
        !           541: #define        L2_L_CACHE_MASK         L2_L_CACHE_MASK_xscale
        !           542: #define        L2_S_CACHE_MASK         L2_S_CACHE_MASK_xscale
        !           543:
        !           544: #define        L1_S_PROTO              L1_S_PROTO_xscale
        !           545: #define        L1_C_PROTO              L1_C_PROTO_xscale
        !           546: #define        L2_S_PROTO              L2_S_PROTO_xscale
        !           547:
        !           548: #define        pmap_copy_page(s, d)    pmap_copy_page_xscale((s), (d))
        !           549: #define        pmap_zero_page(d)       pmap_zero_page_xscale((d))
        !           550: #endif /* ARM_NMMUS > 1 */
        !           551:
        !           552: /*
        !           553:  * These macros return various bits based on kernel/user and protection.
        !           554:  * Note that the compiler will usually fold these at compile time.
        !           555:  */
        !           556: #define        L1_S_PROT(ku, pr)       ((((ku) == PTE_USER) ? L1_S_PROT_U : 0) | \
        !           557:                                 (((pr) & VM_PROT_WRITE) ? L1_S_PROT_W : 0))
        !           558:
        !           559: #define        L2_L_PROT(ku, pr)       ((((ku) == PTE_USER) ? L2_L_PROT_U : 0) | \
        !           560:                                 (((pr) & VM_PROT_WRITE) ? L2_L_PROT_W : 0))
        !           561:
        !           562: #define        L2_S_PROT(ku, pr)       ((((ku) == PTE_USER) ? L2_S_PROT_U : 0) | \
        !           563:                                 (((pr) & VM_PROT_WRITE) ? L2_S_PROT_W : 0))
        !           564:
        !           565: /*
        !           566:  * Macros to test if a mapping is mappable with an L1 Section mapping
        !           567:  * or an L2 Large Page mapping.
        !           568:  */
        !           569: #define        L1_S_MAPPABLE_P(va, pa, size)                                   \
        !           570:        ((((va) | (pa)) & L1_S_OFFSET) == 0 && (size) >= L1_S_SIZE)
        !           571:
        !           572: #define        L2_L_MAPPABLE_P(va, pa, size)                                   \
        !           573:        ((((va) | (pa)) & L2_L_OFFSET) == 0 && (size) >= L2_L_SIZE)
        !           574:
        !           575: #endif /* _KERNEL */
        !           576:
        !           577: #endif /* _ARM32_PMAP_H_ */

CVSweb