Changeset c03ee1c in mainline for kernel/arch/mips32/include/mm/page.h


Ignore:
Timestamp:
2007-06-13T17:49:57Z (18 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
de7663f
Parents:
6b781c0
Message:

Improve comments for arch-specific implementations of hierarchical
4-level page tables. Improve formatting.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/mips32/include/mm/page.h

    r6b781c0 rc03ee1c  
    5959 * - 32-bit virtual addresses
    6060 * - Offset is 14 bits => pages are 16K long
    61  * - PTE's use similar format as CP0 EntryLo[01] registers => PTE is therefore 4 bytes long
     61 * - PTE's use similar format as CP0 EntryLo[01] registers => PTE is therefore
     62 *   4 bytes long
    6263 * - PTE's replace EntryLo v (valid) bit with p (present) bit
    63  * - PTE's use only one bit to distinguish between cacheable and uncacheable mappings
    64  * - PTE's define soft_valid field to ensure there is at least one 1 bit even if the p bit is cleared
    65  * - PTE's make use of CP0 EntryLo's two-bit reserved field for bit W (writable) and bit A (accessed)
     64 * - PTE's use only one bit to distinguish between cacheable and uncacheable
     65 *   mappings
     66 * - PTE's define soft_valid field to ensure there is at least one 1 bit even if
     67 *   the p bit is cleared
     68 * - PTE's make use of CP0 EntryLo's two-bit reserved field for bit W (writable)
     69 *   and bit A (accessed)
    6670 * - PTL0 has 64 entries (6 bits)
    6771 * - PTL1 is not used
     
    7074 */
    7175 
     76/* Macros describing number of entries in each level. */
    7277#define PTL0_ENTRIES_ARCH       64
    7378#define PTL1_ENTRIES_ARCH       0
     
    7580#define PTL3_ENTRIES_ARCH       4096
    7681
    77 #define PTL0_SIZE_ARCH       ONE_FRAME
    78 #define PTL1_SIZE_ARCH       0
    79 #define PTL2_SIZE_ARCH       0
    80 #define PTL3_SIZE_ARCH       ONE_FRAME
     82/* Macros describing size of page tables in each level. */
     83#define PTL0_SIZE_ARCH          ONE_FRAME
     84#define PTL1_SIZE_ARCH          0
     85#define PTL2_SIZE_ARCH          0
     86#define PTL3_SIZE_ARCH          ONE_FRAME
    8187
    82 #define PTL0_INDEX_ARCH(vaddr)  ((vaddr)>>26)
    83 #define PTL1_INDEX_ARCH(vaddr)  0
    84 #define PTL2_INDEX_ARCH(vaddr)  0
    85 #define PTL3_INDEX_ARCH(vaddr)  (((vaddr)>>14) & 0xfff)
     88/* Macros calculating entry indices for each level. */
     89#define PTL0_INDEX_ARCH(vaddr)  ((vaddr) >> 26)
     90#define PTL1_INDEX_ARCH(vaddr)  0
     91#define PTL2_INDEX_ARCH(vaddr)  0
     92#define PTL3_INDEX_ARCH(vaddr)  (((vaddr) >> 14) & 0xfff)
    8693
     94/* Set accessor for PTL0 address. */
    8795#define SET_PTL0_ADDRESS_ARCH(ptl0)
    8896
    89 #define GET_PTL1_ADDRESS_ARCH(ptl0, i)          (((pte_t *)(ptl0))[(i)].pfn<<12)
    90 #define GET_PTL2_ADDRESS_ARCH(ptl1, i)          (ptl1)
    91 #define GET_PTL3_ADDRESS_ARCH(ptl2, i)          (ptl2)
    92 #define GET_FRAME_ADDRESS_ARCH(ptl3, i)         (((pte_t *)(ptl3))[(i)].pfn<<12)
     97/* Get PTE address accessors for each level. */
     98#define GET_PTL1_ADDRESS_ARCH(ptl0, i) \
     99        (((pte_t *) (ptl0))[(i)].pfn << 12)
     100#define GET_PTL2_ADDRESS_ARCH(ptl1, i) \
     101        (ptl1)
     102#define GET_PTL3_ADDRESS_ARCH(ptl2, i) \
     103        (ptl2)
     104#define GET_FRAME_ADDRESS_ARCH(ptl3, i) \
     105        (((pte_t *) (ptl3))[(i)].pfn << 12)
    93106
    94 #define SET_PTL1_ADDRESS_ARCH(ptl0, i, a)       (((pte_t *)(ptl0))[(i)].pfn = (a)>>12)
     107/* Set PTE address accessors for each level. */
     108#define SET_PTL1_ADDRESS_ARCH(ptl0, i, a) \
     109        (((pte_t *) (ptl0))[(i)].pfn = (a) >> 12)
    95110#define SET_PTL2_ADDRESS_ARCH(ptl1, i, a)
    96111#define SET_PTL3_ADDRESS_ARCH(ptl2, i, a)
    97 #define SET_FRAME_ADDRESS_ARCH(ptl3, i, a)      (((pte_t *)(ptl3))[(i)].pfn = (a)>>12)
     112#define SET_FRAME_ADDRESS_ARCH(ptl3, i, a) \
     113        (((pte_t *) (ptl3))[(i)].pfn = (a) >> 12)
    98114
    99 #define GET_PTL1_FLAGS_ARCH(ptl0, i)            get_pt_flags((pte_t *)(ptl0), (index_t)(i))
    100 #define GET_PTL2_FLAGS_ARCH(ptl1, i)            PAGE_PRESENT
    101 #define GET_PTL3_FLAGS_ARCH(ptl2, i)            PAGE_PRESENT
    102 #define GET_FRAME_FLAGS_ARCH(ptl3, i)           get_pt_flags((pte_t *)(ptl3), (index_t)(i))
     115/* Get PTE flags accessors for each level. */
     116#define GET_PTL1_FLAGS_ARCH(ptl0, i) \
     117        get_pt_flags((pte_t *) (ptl0), (index_t) (i))
     118#define GET_PTL2_FLAGS_ARCH(ptl1, i) \
     119        PAGE_PRESENT
     120#define GET_PTL3_FLAGS_ARCH(ptl2, i) \
     121        PAGE_PRESENT
     122#define GET_FRAME_FLAGS_ARCH(ptl3, i) \
     123        get_pt_flags((pte_t *) (ptl3), (index_t) (i))
    103124
    104 #define SET_PTL1_FLAGS_ARCH(ptl0, i, x)         set_pt_flags((pte_t *)(ptl0), (index_t)(i), (x))
     125/* Set PTE flags accessors for each level. */
     126#define SET_PTL1_FLAGS_ARCH(ptl0, i, x) \
     127        set_pt_flags((pte_t *) (ptl0), (index_t) (i), (x))
    105128#define SET_PTL2_FLAGS_ARCH(ptl1, i, x)
    106129#define SET_PTL3_FLAGS_ARCH(ptl2, i, x)
    107 #define SET_FRAME_FLAGS_ARCH(ptl3, i, x)        set_pt_flags((pte_t *)(ptl3), (index_t)(i), (x))
     130#define SET_FRAME_FLAGS_ARCH(ptl3, i, x) \
     131        set_pt_flags((pte_t *) (ptl3), (index_t) (i), (x))
    108132
     133/* Last-level info macros. */
    109134#define PTE_VALID_ARCH(pte)                     (*((uint32_t *) (pte)) != 0)
    110135#define PTE_PRESENT_ARCH(pte)                   ((pte)->p != 0)
    111 #define PTE_GET_FRAME_ARCH(pte)                 ((pte)->pfn<<12)
     136#define PTE_GET_FRAME_ARCH(pte)                 ((pte)->pfn << 12)
    112137#define PTE_WRITABLE_ARCH(pte)                  ((pte)->w != 0)
    113138#define PTE_EXECUTABLE_ARCH(pte)                1
     
    122147        pte_t *p = &pt[i];
    123148       
    124         return (
    125                 (p->cacheable<<PAGE_CACHEABLE_SHIFT) |
    126                 ((!p->p)<<PAGE_PRESENT_SHIFT) |
    127                 (1<<PAGE_USER_SHIFT) |
    128                 (1<<PAGE_READ_SHIFT) |
    129                 ((p->w)<<PAGE_WRITE_SHIFT) |
    130                 (1<<PAGE_EXEC_SHIFT) |
    131                 (p->g<<PAGE_GLOBAL_SHIFT)
    132         );
    133                
     149        return ((p->cacheable << PAGE_CACHEABLE_SHIFT) |
     150            ((!p->p) << PAGE_PRESENT_SHIFT) |
     151            (1 << PAGE_USER_SHIFT) |
     152            (1 << PAGE_READ_SHIFT) |
     153            ((p->w) << PAGE_WRITE_SHIFT) |
     154            (1 << PAGE_EXEC_SHIFT) |
     155            (p->g << PAGE_GLOBAL_SHIFT));
    134156}
    135157
Note: See TracChangeset for help on using the changeset viewer.