Annotation of XNU/osfmk/ppc/mappings.h, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * The contents of this file constitute Original Code as defined in and
        !             7:  * are subject to the Apple Public Source License Version 1.1 (the
        !             8:  * "License").  You may not use this file except in compliance with the
        !             9:  * License.  Please obtain a copy of the License at
        !            10:  * http://www.apple.com/publicsource and read it before using this file.
        !            11:  * 
        !            12:  * This Original Code and all software distributed under the License are
        !            13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
        !            17:  * License for the specific language governing rights and limitations
        !            18:  * under the License.
        !            19:  * 
        !            20:  * @APPLE_LICENSE_HEADER_END@
        !            21:  */
        !            22: /*
        !            23:  *             Header files for the hardware virtual memory mapping stuff 
        !            24:  */
        !            25: #ifndef        _PPC_MAPPINGS_H_
        !            26: #define        _PPC_MAPPINGS_H_
        !            27: 
        !            28: typedef struct PCA {                                   /* PTEG Control Area */
        !            29:        unsigned int            PCAlock;                /* PCA lock */
        !            30:        union flgs {
        !            31:                unsigned int    PCAallo;                /* Allocation controls */
        !            32:                struct PCAalflgs {                              /* Keep these in order!!! */
        !            33:                        unsigned char   PCAfree;        /* Indicates the slot is free */
        !            34:                        unsigned char   PCAauto;        /* Indicates that the PTE was autogenned */
        !            35:                        unsigned char   PCAslck;        /* Indicates that the slot is locked */
        !            36:                        unsigned char   PCAsteal;       /* Steal scan start position */
        !            37:                } PCAalflgs;
        !            38:        } flgs;
        !            39:        unsigned int            PCAgas[6];              /* Filler to 32 byte boundary */
        !            40:        unsigned int            PCAhash[8];             /* PTEG hash chains */
        !            41: } PCA;
        !            42: 
        !            43: typedef struct mapping {
        !            44:        struct mapping          *next;                  /* MUST BE FIRST - chain off physent */
        !            45:        struct mapping          *hashnext;              /* Next mapping in same hash group */
        !            46:        unsigned int            *PTEhash;               /* Pointer to the head of the mapping hash list */
        !            47:        unsigned int            *PTEent;                /* Pointer to PTE if exists */
        !            48:        struct phys_entry       *physent;               /* Quick pointer back to the physical entry */
        !            49:        unsigned int            PTEv;                   /* Virtual half of HW PTE */
        !            50:        unsigned int            PTEr;                   /* Real half of HW PTE. This is used ONLY if
        !            51:                                                                                   there is no physical entry associated
        !            52:                                                                                   with this mapping, ie.e, physent==0 */
        !            53:        struct pmap             *pmap;                  /* Quick pointer back to the containing pmap */
        !            54: } mapping;
        !            55: 
        !            56: #define MAPPING_NULL   ((struct mapping *) 0)
        !            57: 
        !            58: typedef struct mappingctl {
        !            59:        unsigned int            mapclock;               /* Mapping allocation lock */
        !            60:        unsigned int            mapcrecurse;    /* Mapping allocation recursion control */
        !            61:        struct mappingblok      *mapcnext;              /* First mapping block with free entries */
        !            62:        struct mappingblok      *mapclast;              /* Last mapping block with free entries */
        !            63:        struct mappingblok      *mapcrel;               /* List of deferred block releases */
        !            64:        unsigned int            mapcfree;               /* Total free entries on list */
        !            65:        unsigned int            mapcinuse;              /* Total entries in use */
        !            66:        unsigned int            mapcreln;               /* Total blocks on pending release list */
        !            67:        int                                     mapcholdoff;    /* Hold off clearing release list */
        !            68:        unsigned int            mapcfreec;              /* Total calls to mapping free */
        !            69:        unsigned int            mapcallocc;             /* Total calls to mapping alloc */
        !            70:        unsigned int            mapcmin;                /* Minimum free mappings to keep */
        !            71:        unsigned int            mapcgas[4];             /* Pad to 64 bytes */
        !            72: } mappingctl;
        !            73: 
        !            74: #define MAPPERBLOK 127
        !            75: #define MAPALTHRSH (4*MAPPERBLOK)
        !            76: #define MAPFRTHRSH (2 * ((MAPALTHRSH + MAPPERBLOK - 1) / MAPPERBLOK))
        !            77: typedef struct mappingblok {
        !            78:        unsigned int            mapblokfree[4]; /* Bit map of free mapping entrys */
        !            79:        unsigned int            mapblokvrswap;  /* Virtual address XORed with physical address */
        !            80:        unsigned int            mapblokflags;   /* Various flags */
        !            81: #define mbPerm 0x80000000                              /* Block is permanent */
        !            82:        struct mappingblok      *nextblok;              /* Pointer to the next mapping block */
        !            83: } mappingblok;
        !            84: 
        !            85: typedef struct autogenblok {
        !            86:        unsigned int            AGNstart;               /* Start of range */
        !            87:        unsigned int            AGNsize;                /* Length of range */
        !            88:        struct autogenblok      *AGNnext;               /* Next autogen block */
        !            89:        unsigned int            AGNpteX;                /* Real part of translation */
        !            90: } autogenblok;
        !            91: 
        !            92: extern mappingctl      mapCtl;                         /* Mapping allocation control */
        !            93: 
        !            94: extern void            mapping_phys_init(struct phys_entry *pp, unsigned int pa, unsigned int wimg);   /* Initializes hw specific storage attributes */
        !            95: extern boolean_t       mapping_remove(space_t space, vm_offset_t va);  /* Remove a single mapping for this VADDR */
        !            96: extern void            mapping_free_init(vm_offset_t mbl, int perm, boolean_t locked); /* Sets start and end of a block of mappings */
        !            97: extern void            mapping_adjust(void);                                           /* Adjust free mapping count */
        !            98: extern void            mapping_free_prime(void);                                       /* Primes the mapping block release list */
        !            99: extern void            mapping_prealloc(unsigned int);                         /* Preallocate mappings for large use */
        !           100: extern void            mapping_relpre(void);                                           /* Releases preallocate request */
        !           101: extern void            mapping_init(void);                                                     /* Do initial stuff */
        !           102: extern mapping                 *mapping_alloc(void);                                           /* Obtain a mapping */
        !           103: extern void            mapping_free(struct mapping *mp);                       /* Release a mapping */
        !           104: extern boolean_t       mapping_tst_ref(struct phys_entry *pp);         /* Tests the reference bit of a physical page */
        !           105: extern boolean_t       mapping_tst_mod(struct phys_entry *pp);         /* Tests the change bit of a physical page */
        !           106: extern void            mapping_set_ref(struct phys_entry *pp);         /* Sets the reference bit of a physical page */
        !           107: extern void            mapping_clr_ref(struct phys_entry *pp);         /* Clears the reference bit of a physical page */
        !           108: extern void            mapping_set_mod(struct phys_entry *pp);         /* Sets the change bit of a physical page */
        !           109: extern void            mapping_clr_mod(struct phys_entry *pp);         /* Clears the change bit of a physical page */
        !           110: extern void            mapping_invall(struct phys_entry *pp);          /* Clear all PTEs pointing to a physical page */
        !           111: extern void            mapping_protect(struct phys_entry *pp, vm_prot_t prot, boolean_t locked);       /* Change protection of all mappings to page */
        !           112: extern mapping                 *mapping_make(struct pmap *pmap, space_t space, struct phys_entry *pp, vm_offset_t va, vm_offset_t pa, vm_prot_t prot, int attr);       /* Make an address mapping */
        !           113: extern int                     mapping_remap(space_t space, vm_offset_t from, vm_offset_t to); /* Remap an address mapping */
        !           114: extern void            mapping_purge(struct phys_entry *pp);           /* Remove all mappings for this physent */
        !           115: extern boolean_t       mapping_remove(space_t space, vm_offset_t va);  /* Remove a single mapping for this VADDR */
        !           116: extern space_t                 mapping_space(void);                                            /* Generate a unique space ID */
        !           117: extern vm_offset_t     mapping_p2v(space_t space, struct phys_entry *pp);      /* Finds first virtual mapping of a physical page in a space */
        !           118: extern void            mapping_phys_attr(struct phys_entry *pp, vm_prot_t prot, unsigned int wimg);    /* Sets the default physical page attributes */
        !           119: extern int                     mapalc(struct mappingblok *mb);                         /* Finds and allcates a mapping entry */
        !           120: extern void                    ignore_zero_fault(boolean_t type);                      /* Sets up to ignore or honor any fault on page 0 access for the current thread */
        !           121: 
        !           122: 
        !           123: extern boolean_t       autogen_map(space_t space, vm_offset_t va, vm_offset_t spa, vm_offset_t epa, vm_prot_t prot, int attr); /* Build an autogen area */
        !           124: 
        !           125: extern mapping                 *hw_lock_phys_vir(space_t space, vm_offset_t va);       /* Finds and locks a physical entry by vaddr */
        !           126: extern mapping                 *hw_cpv(struct mapping *mapping);                       /* Converts a physical mapping control block address to virtual */
        !           127: extern mapping                 *hw_cvp(struct mapping *mapping);                       /* Converts a virtual mapping control block address to physical */
        !           128: extern void            hw_rem_map(struct mapping *mapping);            /* Remove a mapping from the system */
        !           129: extern void                    hw_add_map(struct mapping *mp, space_t space, vm_offset_t va);  /* Add a mapping to the PTEG hash list */
        !           130: extern void            hw_prot(struct phys_entry *pp, vm_prot_t prot); /* Change the protection of a physical page */
        !           131: extern void            hw_phys_attr(struct phys_entry *pp, vm_prot_t prot, unsigned int wimg); /* Sets the default physical page attributes */
        !           132: 
        !           133: extern boolean_t       hw_tst_mod(struct phys_entry *pp);                      /* Tests change bit */
        !           134: extern void            hw_set_mod(struct phys_entry *pp);                      /* Set change bit */
        !           135: extern void            hw_clr_mod(struct phys_entry *pp);                      /* Clear change bit */
        !           136: 
        !           137: extern boolean_t       hw_tst_ref(struct phys_entry *pp);                      /* Tests reference bit */
        !           138: extern void            hw_set_ref(struct phys_entry *pp);                      /* Set reference bit */
        !           139: extern void            hw_clr_ref(struct phys_entry *pp);                      /* Clear reference bit */
        !           140: 
        !           141: extern void            hw_inv_all(struct phys_entry *pp);                      /* Invalidate all PTEs associated with page */
        !           142: extern void            hw_set_user_space(space_t space);                       /* Indicate we need a space switch */
        !           143: extern void                    *LRA(space_t space, void *vaddr);                       /* Translate virtual to real using only HW tables */
        !           144: extern void            dumpaddr(space_t space, vm_offset_t va);
        !           145: extern void                    dumpmapping(struct mapping *mp);                        /* Print contents of a mapping */
        !           146: extern void                    dumppca(struct mapping *mp);                            /* Print contents of a PCA */
        !           147: extern void                    dumpphys(struct phys_entry *pp);                        /* Prints stuff starting at phys */
        !           148: extern unsigned int    mappingdeb0;                                                            /* (TEST/DEBUG) */
        !           149: 
        !           150: #endif /* _PPC_MAPPINGS_H_ */
        !           151: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.