Changeset 0882a9a in mainline
- Timestamp:
- 2006-02-10T16:11:14Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- ecbdc724
- Parents:
- d0a0f12
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/amd64/include/mm/page.h
rd0a0f12 r0882a9a 76 76 #ifndef __ASM__ 77 77 78 /** Page Table Entry. */ 78 79 struct page_specifier { 79 80 unsigned present : 1; … … 86 87 unsigned unused: 1; 87 88 unsigned global : 1; 88 unsigned avl : 3; 89 unsigned soft_valid : 1; /**< Valid content even if present bit is cleared. */ 90 unsigned avl : 2; 89 91 unsigned addr_12_31 : 30; 90 92 unsigned addr_32_51 : 21; … … 125 127 p->no_execute = (flags & PAGE_EXEC) == 0; 126 128 p->global = (flags & PAGE_GLOBAL) != 0; 129 130 /* 131 * Ensure that there is at least one bit set even if the present bit is cleared. 132 */ 133 p->soft_valid = 1; 127 134 } 128 135 -
arch/ia32/include/mm/page.h
rd0a0f12 r0882a9a 78 78 #include <typedefs.h> 79 79 80 /** Page Table Entry. */ 80 81 struct page_specifier { 81 82 unsigned present : 1; … … 88 89 unsigned pat : 1; 89 90 unsigned global : 1; 90 unsigned avl : 3; 91 unsigned soft_valid : 1; /**< Valid content even if the present bit is not set. */ 92 unsigned avl : 2; 91 93 unsigned frame_address : 20; 92 94 } __attribute__ ((packed)); … … 116 118 p->writeable = (flags & PAGE_WRITE) != 0; 117 119 p->global = (flags & PAGE_GLOBAL) != 0; 120 121 /* 122 * Ensure that there is at least one bit set even if the present bit is cleared. 123 */ 124 p->soft_valid = true; 118 125 } 119 126 -
arch/mips32/include/mm/page.h
rd0a0f12 r0882a9a 49 49 * - Offset is 14 bits => pages are 16K long 50 50 * - 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 51 54 * - PTE's make use of CP0 EntryLo's two-bit reserved field for bit W (writable) and bit A (accessed) 52 55 * - PTL0 has 64 entries (6 bits) … … 63 66 #define SET_PTL0_ADDRESS_ARCH(ptl0) 64 67 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) 66 69 #define GET_PTL2_ADDRESS_ARCH(ptl1, i) (ptl1) 67 70 #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) 69 72 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) 71 74 #define SET_PTL2_ADDRESS_ARCH(ptl1, i, a) 72 75 #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) 74 77 75 78 #define GET_PTL1_FLAGS_ARCH(ptl0, i) get_pt_flags((pte_t *)(ptl0), (index_t)(i)) … … 95 98 96 99 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) | 99 102 (1<<PAGE_USER_SHIFT) | 100 103 (1<<PAGE_READ_SHIFT) | 101 104 ((p->w)<<PAGE_WRITE_SHIFT) | 102 105 (1<<PAGE_EXEC_SHIFT) | 103 p->lo.g<<PAGE_GLOBAL_SHIFT106 (p->g<<PAGE_GLOBAL_SHIFT) 104 107 ); 105 108 … … 110 113 pte_t *p = &pt[i]; 111 114 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; 115 118 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; 116 124 } 117 125 -
arch/mips32/include/mm/tlb.h
rd0a0f12 r0882a9a 64 64 }; 65 65 66 union pte { 67 entry_lo_t lo; 68 struct { 69 unsigned : 30; 70 unsigned w : 1; /* writable */ 71 unsigned a : 1; /* accessed */ 72 } __attribute__ ((packed)); 66 /** Page Table Entry. */ 67 struct pte { 68 unsigned g : 1; /**< Global bit. */ 69 unsigned p : 1; /**< Present bit. */ 70 unsigned d : 1; /**< Dirty bit. */ 71 unsigned cacheable : 1; /**< Cacheable bit. */ 72 unsigned : 1; /**< Unused. */ 73 unsigned soft_valid : 1; /**< Valid content even if not present. */ 74 unsigned pfn : 24; /**< Physical frame number. */ 75 unsigned w : 1; /**< Page writable bit. */ 76 unsigned a : 1; /**< Accessed bit. */ 73 77 }; 74 78 -
arch/mips32/include/types.h
rd0a0f12 r0882a9a 50 50 typedef __u32 __native; 51 51 52 typedef unionpte pte_t;52 typedef struct pte pte_t; 53 53 54 54 typedef __u32 pfn_t; -
arch/mips32/src/mm/tlb.c
rd0a0f12 r0882a9a 46 46 static pte_t *find_mapping_and_check(__address badvaddr); 47 47 48 static void prepare_entry_lo(entry_lo_t *lo, bool g, bool v, bool d, int c, __address pfn);48 static void prepare_entry_lo(entry_lo_t *lo, bool g, bool v, bool d, bool cacheable, __address pfn); 49 49 static void prepare_entry_hi(entry_hi_t *hi, asid_t asid, __address addr); 50 50 … … 105 105 106 106 prepare_entry_hi(&hi, AS->asid, badvaddr); 107 prepare_entry_lo(&lo, pte-> lo.g, pte->lo.v, pte->lo.d, pte->lo.c, pte->lo.pfn);107 prepare_entry_lo(&lo, pte->g, pte->p, pte->d, pte->cacheable, pte->pfn); 108 108 109 109 /* … … 179 179 pte->a = 1; 180 180 181 prepare_entry_lo(&lo, pte-> lo.g, pte->lo.v, pte->lo.d, pte->lo.c, pte->lo.pfn);181 prepare_entry_lo(&lo, pte->g, pte->p, pte->d, pte->cacheable, pte->pfn); 182 182 183 183 /* … … 253 253 */ 254 254 pte->a = 1; 255 pte-> lo.d = 1;256 257 prepare_entry_lo(&lo, pte-> lo.g, pte->lo.v, pte->w, pte->lo.c, pte->lo.pfn);255 pte->d = 1; 256 257 prepare_entry_lo(&lo, pte->g, pte->p, pte->w, pte->cacheable, pte->pfn); 258 258 259 259 /* … … 338 338 */ 339 339 pte = page_mapping_find(AS, badvaddr); 340 if (pte && pte-> lo.v) {340 if (pte && pte->p) { 341 341 /* 342 342 * Mapping found in page tables. … … 355 355 */ 356 356 pte = page_mapping_find(AS, badvaddr); 357 ASSERT(pte && pte-> lo.v);357 ASSERT(pte && pte->p); 358 358 return pte; 359 359 } … … 371 371 * Handler cannot succeed if the mapping is marked as invalid. 372 372 */ 373 if (!pte-> lo.v) {373 if (!pte->p) { 374 374 printf("Invalid mapping.\n"); 375 375 return NULL; … … 379 379 } 380 380 381 void prepare_entry_lo(entry_lo_t *lo, bool g, bool v, bool d, int c, __address pfn)381 void prepare_entry_lo(entry_lo_t *lo, bool g, bool v, bool d, bool cacheable, __address pfn) 382 382 { 383 383 lo->value = 0; … … 385 385 lo->v = v; 386 386 lo->d = d; 387 lo->c = c ;387 lo->c = cacheable ? PAGE_CACHEABLE_EXC_WRITE : PAGE_UNCACHED; 388 388 lo->pfn = pfn; 389 389 } -
genarch/src/mm/asid_fifo.c
rd0a0f12 r0882a9a 35 35 #define FIFO_STATIC_LIMIT 1024 36 36 #define FIFO_STATIC (ASIDS_ALLOCABLE<FIFO_STATIC_LIMIT) 37 37 38 /** 38 39 * FIFO queue containing unassigned ASIDs.
Note:
See TracChangeset
for help on using the changeset viewer.