Changeset a1a03f9 in mainline for arch/mips/include/mm/page.h
- Timestamp:
- 2005-07-14T22:10:05Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 26649537
- Parents:
- ff9f858
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/mips/include/mm/page.h
rff9f858 ra1a03f9 30 30 #define __mips_PAGE_H__ 31 31 32 #include <arch/mm/tlb.h> 33 #include <mm/page.h> 32 34 #include <arch/mm/frame.h> 33 35 #include <arch/types.h> 36 #include <arch.h> 34 37 35 38 #define PAGE_SIZE FRAME_SIZE … … 38 41 #define PA2KA(x) ((x) + 0x80000000) 39 42 40 #define page_arch_init() ;41 42 43 /* 43 44 * Implementation of generic 4-level page table interface. 44 * TODO: this is a fake implementation provided to satisfy the compiler 45 * NOTE: this implementation is under construction 46 * 47 * Page table layout: 48 * - 32-bit virtual addresses 49 * - Offset is 14 bits => pages are 16K long 50 * - PTE's use the same format as CP0 EntryLo[01] registers => PTE is therefore 4 bytes long 51 * - PTL0 has 64 entries (6 bits) 52 * - PTL1 is not used 53 * - PTL2 is not used 54 * - PTL3 has 4096 entries (12 bits) 45 55 */ 46 #define PTL0_INDEX_ARCH(vaddr) 0 56 57 #define PTL0_INDEX_ARCH(vaddr) ((vaddr)>>26) 47 58 #define PTL1_INDEX_ARCH(vaddr) 0 48 59 #define PTL2_INDEX_ARCH(vaddr) 0 49 #define PTL3_INDEX_ARCH(vaddr) 060 #define PTL3_INDEX_ARCH(vaddr) (((vaddr)>>14)&0xfff) 50 61 51 #define GET_PTL0_ADDRESS_ARCH() ((pte_t *) 0) 52 #define GET_PTL1_ADDRESS_ARCH(ptl0, i) ((pte_t *) 0) 53 #define GET_PTL2_ADDRESS_ARCH(ptl1, i) ((pte_t *) 0) 54 #define GET_PTL3_ADDRESS_ARCH(ptl2, i) ((pte_t *) 0) 55 #define GET_FRAME_ADDRESS_ARCH(ptl3, i) ((pte_t *) 0) 62 #define GET_PTL0_ADDRESS_ARCH() (PTL0) 63 #define SET_PTL0_ADDRESS_ARCH(ptl0) (PTL0 = (pte_t *)(ptl0)) 56 64 57 #define SET_PTL0_ADDRESS_ARCH(ptl0) 58 #define SET_PTL1_ADDRESS_ARCH(ptl0, i, a) 65 #define GET_PTL1_ADDRESS_ARCH(ptl0, i) (((pte_t *)(ptl0))[(i)].pfn<<14) 66 #define GET_PTL2_ADDRESS_ARCH(ptl1, i) (ptl1) 67 #define GET_PTL3_ADDRESS_ARCH(ptl2, i) (ptl2) 68 #define GET_FRAME_ADDRESS_ARCH(ptl3, i) (((pte_t *)(ptl3))[(i)].pfn<<14) 69 70 #define SET_PTL1_ADDRESS_ARCH(ptl0, i, a) (((pte_t *)(ptl0))[(i)].pfn = (a)>>14) 59 71 #define SET_PTL2_ADDRESS_ARCH(ptl1, i, a) 60 72 #define SET_PTL3_ADDRESS_ARCH(ptl2, i, a) 61 #define SET_FRAME_ADDRESS_ARCH(ptl3, i, a) 73 #define SET_FRAME_ADDRESS_ARCH(ptl3, i, a) (((pte_t *)(ptl3))[(i)].pfn = (a)>>14) 62 74 63 #define GET_PTL1_FLAGS_ARCH(ptl0, i) 064 #define GET_PTL2_FLAGS_ARCH(ptl1, i) 065 #define GET_PTL3_FLAGS_ARCH(ptl2, i) 066 #define GET_FRAME_FLAGS_ARCH(ptl3, i) 075 #define GET_PTL1_FLAGS_ARCH(ptl0, i) get_pt_flags((pte_t *)(ptl0), (index_t)(i)) 76 #define GET_PTL2_FLAGS_ARCH(ptl1, i) PAGE_PRESENT 77 #define GET_PTL3_FLAGS_ARCH(ptl2, i) PAGE_PRESENT 78 #define GET_FRAME_FLAGS_ARCH(ptl3, i) get_pt_flags((pte_t *)(ptl3), (index_t)(i)) 67 79 68 #define SET_PTL1_FLAGS_ARCH(ptl0, i, x) 80 #define SET_PTL1_FLAGS_ARCH(ptl0, i, x) set_pt_flags((pte_t *)(ptl0), (index_t)(i), (x)) 69 81 #define SET_PTL2_FLAGS_ARCH(ptl1, i, x) 70 82 #define SET_PTL3_FLAGS_ARCH(ptl2, i, x) 71 #define SET_FRAME_FLAGS_ARCH(ptl3, i, x) 83 #define SET_FRAME_FLAGS_ARCH(ptl3, i, x) set_pt_flags((pte_t *)(ptl3), (index_t)(i), (x)) 72 84 73 typedef __u32 pte_t; 85 static inline int get_pt_flags(pte_t *pt, index_t i) 86 { 87 pte_t *p = &pt[i]; 88 89 return ( 90 ((p->c>PAGE_UNCACHED)<<PAGE_CACHEABLE_SHIFT) | 91 ((!p->v)<<PAGE_PRESENT_SHIFT) | 92 (1<<PAGE_USER_SHIFT) | 93 (1<<PAGE_READ_SHIFT) | 94 ((p->d)<<PAGE_WRITE_SHIFT) | 95 (1<<PAGE_EXEC_SHIFT) 96 ); 97 98 } 99 100 static inline void set_pt_flags(pte_t *pt, index_t i, int flags) 101 { 102 pte_t *p = &pt[i]; 103 104 p->c = (flags & PAGE_CACHEABLE) ? PAGE_CACHEABLE_EXC_WRITE : PAGE_UNCACHED; 105 p->v = !(flags & PAGE_NOT_PRESENT); 106 p->d = flags & PAGE_WRITE; 107 } 108 109 extern void page_arch_init(void); 110 111 extern pte_t *PTL0; 74 112 75 113 #endif
Note:
See TracChangeset
for help on using the changeset viewer.