Changeset 0882a9a in mainline for arch/mips32/include/mm/page.h


Ignore:
Timestamp:
2006-02-10T16:11:14Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
ecbdc724
Parents:
d0a0f12
Message:

Make use of one unused bit in PTE formats of amd64, ia32 and mips32 to store 1 in valid mappings.
This helps to distinguish valid entries from not present entries with 0 content (i.e. not present
entries with PFN 0 and other bits cleared).

File:
1 edited

Legend:

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

    rd0a0f12 r0882a9a  
    4949 * - Offset is 14 bits => pages are 16K long
    5050 * - PTE's use similar format as CP0 EntryLo[01] registers => PTE is therefore 4 bytes long
     51 * - PTE's replace EntryLo v (valid) bit with p (present) bit
     52 * - PTE's use only one bit to distinguish between cacheable and uncacheable mappings
     53 * - PTE's define soft_valid field to ensure there is at least one 1 bit even if the p bit is cleared
    5154 * - PTE's make use of CP0 EntryLo's two-bit reserved field for bit W (writable) and bit A (accessed)
    5255 * - PTL0 has 64 entries (6 bits)
     
    6366#define SET_PTL0_ADDRESS_ARCH(ptl0)
    6467
    65 #define GET_PTL1_ADDRESS_ARCH(ptl0, i)          (((pte_t *)(ptl0))[(i)].lo.pfn<<12)
     68#define GET_PTL1_ADDRESS_ARCH(ptl0, i)          (((pte_t *)(ptl0))[(i)].pfn<<12)
    6669#define GET_PTL2_ADDRESS_ARCH(ptl1, i)          (ptl1)
    6770#define GET_PTL3_ADDRESS_ARCH(ptl2, i)          (ptl2)
    68 #define GET_FRAME_ADDRESS_ARCH(ptl3, i)         (((pte_t *)(ptl3))[(i)].lo.pfn<<12)
     71#define GET_FRAME_ADDRESS_ARCH(ptl3, i)         (((pte_t *)(ptl3))[(i)].pfn<<12)
    6972
    70 #define SET_PTL1_ADDRESS_ARCH(ptl0, i, a)       (((pte_t *)(ptl0))[(i)].lo.pfn = (a)>>12)
     73#define SET_PTL1_ADDRESS_ARCH(ptl0, i, a)       (((pte_t *)(ptl0))[(i)].pfn = (a)>>12)
    7174#define SET_PTL2_ADDRESS_ARCH(ptl1, i, a)
    7275#define SET_PTL3_ADDRESS_ARCH(ptl2, i, a)
    73 #define SET_FRAME_ADDRESS_ARCH(ptl3, i, a)      (((pte_t *)(ptl3))[(i)].lo.pfn = (a)>>12)
     76#define SET_FRAME_ADDRESS_ARCH(ptl3, i, a)      (((pte_t *)(ptl3))[(i)].pfn = (a)>>12)
    7477
    7578#define GET_PTL1_FLAGS_ARCH(ptl0, i)            get_pt_flags((pte_t *)(ptl0), (index_t)(i))
     
    9598       
    9699        return (
    97                 ((p->lo.c>PAGE_UNCACHED)<<PAGE_CACHEABLE_SHIFT) |
    98                 ((!p->lo.v)<<PAGE_PRESENT_SHIFT) |
     100                (p->cacheable<<PAGE_CACHEABLE_SHIFT) |
     101                ((!p->p)<<PAGE_PRESENT_SHIFT) |
    99102                (1<<PAGE_USER_SHIFT) |
    100103                (1<<PAGE_READ_SHIFT) |
    101104                ((p->w)<<PAGE_WRITE_SHIFT) |
    102105                (1<<PAGE_EXEC_SHIFT) |
    103                 p->lo.g<<PAGE_GLOBAL_SHIFT
     106                (p->g<<PAGE_GLOBAL_SHIFT)
    104107        );
    105108               
     
    110113        pte_t *p = &pt[i];
    111114       
    112         p->lo.c = (flags & PAGE_CACHEABLE) != 0 ? PAGE_CACHEABLE_EXC_WRITE : PAGE_UNCACHED;
    113         p->lo.v = !(flags & PAGE_NOT_PRESENT);
    114         p->lo.g = (flags & PAGE_GLOBAL) != 0;
     115        p->cacheable = (flags & PAGE_CACHEABLE) != 0;
     116        p->p = !(flags & PAGE_NOT_PRESENT);
     117        p->g = (flags & PAGE_GLOBAL) != 0;
    115118        p->w = (flags & PAGE_WRITE) != 0;
     119       
     120        /*
     121         * Ensure that valid entries have at least one bit set.
     122         */
     123        p->soft_valid = 1;
    116124}
    117125
Note: See TracChangeset for help on using the changeset viewer.