Changeset 48c1ef9 in mainline for arch/ppc64/include/mm/page.h


Ignore:
Timestamp:
2006-05-21T20:38:18Z (19 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
040542aa
Parents:
bd55bbb
Message:

port ppc32 changes to ppc64 (raw)

File:
1 edited

Legend:

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

    rbd55bbb r48c1ef9  
    4545#endif
    4646
    47 #define PTL0_ENTRIES_ARCH               0
    48 #define PTL1_ENTRIES_ARCH               0
    49 #define PTL2_ENTRIES_ARCH               0
    50 #define PTL3_ENTRIES_ARCH               0
     47/*
     48 * Implementation of generic 4-level page table interface,
     49 * the hardware Page Hash Table is used as cache.
     50 *
     51 * Page table layout:
     52 * - 32-bit virtual addressess
     53 * - Offset is 12 bits => pages are 4K long
     54 * - PTL0 has 1024 entries (10 bits)
     55 * - PTL1 is not used
     56 * - PTL2 is not used
     57 * - PLT3 has 1024 entries (10 bits)
     58 */
    5159
    52 #define PTL0_INDEX_ARCH(vaddr)          0
    53 #define PTL1_INDEX_ARCH(vaddr)          0
    54 #define PTL2_INDEX_ARCH(vaddr)          0
    55 #define PTL3_INDEX_ARCH(vaddr)          0
     60#define PTL0_ENTRIES_ARCH       1024
     61#define PTL1_ENTRIES_ARCH       0
     62#define PTL2_ENTRIES_ARCH       0
     63#define PTL3_ENTRIES_ARCH       1024
     64
     65#define PTL0_INDEX_ARCH(vaddr)  (((vaddr) >> 22) & 0x3ff)
     66#define PTL1_INDEX_ARCH(vaddr)  0
     67#define PTL2_INDEX_ARCH(vaddr)  0
     68#define PTL3_INDEX_ARCH(vaddr)  (((vaddr) >> 12) & 0x3ff)
     69
     70#define GET_PTL1_ADDRESS_ARCH(ptl0, i)          (((pte_t *) (ptl0))[(i)].pfn << 12)
     71#define GET_PTL2_ADDRESS_ARCH(ptl1, i)          (ptl1)
     72#define GET_PTL3_ADDRESS_ARCH(ptl2, i)          (ptl2)
     73#define GET_FRAME_ADDRESS_ARCH(ptl3, i)         (((pte_t *) (ptl3))[(i)].pfn << 12)
    5674
    5775#define SET_PTL0_ADDRESS_ARCH(ptl0)
    58 
    59 #define GET_PTL1_ADDRESS_ARCH(ptl0, i)          ((pte_t *) 0)
    60 #define GET_PTL2_ADDRESS_ARCH(ptl1, i)          ((pte_t *) 0)
    61 #define GET_PTL3_ADDRESS_ARCH(ptl2, i)          ((pte_t *) 0)
    62 #define GET_FRAME_ADDRESS_ARCH(ptl3, i)         ((pte_t *) 0)
    63 
    64 #define SET_PTL1_ADDRESS_ARCH(ptl0, i, a)
     76#define SET_PTL1_ADDRESS_ARCH(ptl0, i, a)       (((pte_t *) (ptl0))[(i)].pfn = (a) >> 12)
    6577#define SET_PTL2_ADDRESS_ARCH(ptl1, i, a)
    6678#define SET_PTL3_ADDRESS_ARCH(ptl2, i, a)
    67 #define SET_FRAME_ADDRESS_ARCH(ptl3, i, a)
     79#define SET_FRAME_ADDRESS_ARCH(ptl3, i, a)      (((pte_t *) (ptl3))[(i)].pfn = (a) >> 12)
    6880
    69 #define GET_PTL1_FLAGS_ARCH(ptl0, i)            0
    70 #define GET_PTL2_FLAGS_ARCH(ptl1, i)            0
    71 #define GET_PTL3_FLAGS_ARCH(ptl2, i)            0
    72 #define GET_FRAME_FLAGS_ARCH(ptl3, i)           0
     81#define GET_PTL1_FLAGS_ARCH(ptl0, i)            get_pt_flags((pte_t *) (ptl0), (index_t) (i))
     82#define GET_PTL2_FLAGS_ARCH(ptl1, i)            PAGE_PRESENT
     83#define GET_PTL3_FLAGS_ARCH(ptl2, i)            PAGE_PRESENT
     84#define GET_FRAME_FLAGS_ARCH(ptl3, i)           get_pt_flags((pte_t *) (ptl3), (index_t) (i))
    7385
    74 #define SET_PTL1_FLAGS_ARCH(ptl0, i, x)
     86#define SET_PTL1_FLAGS_ARCH(ptl0, i, x)         set_pt_flags((pte_t *) (ptl0), (index_t) (i), (x))
    7587#define SET_PTL2_FLAGS_ARCH(ptl1, i, x)
    7688#define SET_PTL3_FLAGS_ARCH(ptl2, i, x)
    77 #define SET_FRAME_FLAGS_ARCH(ptl3, i, x)
     89#define SET_FRAME_FLAGS_ARCH(ptl3, i, x)        set_pt_flags((pte_t *) (ptl3), (index_t) (i), (x))
    7890
    79 #define PTE_VALID_ARCH(p)               1
    80 #define PTE_PRESENT_ARCH(p)             1
    81 #define PTE_GET_FRAME_ARCH(p)           0
     91#define PTE_VALID_ARCH(pte)                     (*((__u32 *) (pte)) != 0)
     92#define PTE_PRESENT_ARCH(pte)           ((pte)->p != 0)
     93#define PTE_GET_FRAME_ARCH(pte)         ((pte)->pfn << 12)
    8294
    8395#ifndef __ASM__
     
    8799#include <arch/types.h>
    88100
     101static inline int get_pt_flags(pte_t *pt, index_t i)
     102{
     103        pte_t *p = &pt[i];
     104       
     105        return (
     106                (1 << PAGE_CACHEABLE_SHIFT) |
     107                ((!p->p) << PAGE_PRESENT_SHIFT) |
     108                (1 << PAGE_USER_SHIFT) |
     109                (1 << PAGE_READ_SHIFT) |
     110                (1 << PAGE_WRITE_SHIFT) |
     111                (1 << PAGE_EXEC_SHIFT) |
     112                (p->g << PAGE_GLOBAL_SHIFT)
     113        );
     114}
     115
     116static inline void set_pt_flags(pte_t *pt, index_t i, int flags)
     117{
     118        pte_t *p = &pt[i];
     119       
     120        p->p = !(flags & PAGE_NOT_PRESENT);
     121        p->g = (flags & PAGE_GLOBAL) != 0;
     122        p->valid = 1;
     123}
     124
    89125extern void page_arch_init(void);
     126
     127#define PHT_BITS        16
     128#define PHT_ORDER       4
     129
     130typedef struct {
     131        unsigned v : 1;          /**< Valid */
     132        unsigned vsid : 24;      /**< Virtual Segment ID */
     133        unsigned h : 1;          /**< Primary/secondary hash */
     134        unsigned api : 6;        /**< Abbreviated Page Index */
     135        unsigned rpn : 20;       /**< Real Page Number */
     136        unsigned reserved0 : 3;
     137        unsigned r : 1;          /**< Reference */
     138        unsigned c : 1;          /**< Change */
     139        unsigned wimg : 4;       /**< Access control */
     140        unsigned reserved1 : 1;
     141        unsigned pp : 2;         /**< Page protection */
     142} phte_t;
     143
     144extern void pht_refill(bool data, istate_t *istate);
     145extern void pht_init(void);
    90146
    91147#endif /* __ASM__ */
Note: See TracChangeset for help on using the changeset viewer.