- Timestamp:
- 2006-02-06T14:18:28Z (20 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f5935ed
- Parents:
- 214f5bb
- Location:
- arch
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/ia64/include/mm/page.h
r214f5bb rc7ec94a4 46 46 #define SET_PTL0_ADDRESS_ARCH(x) /**< To be removed as situation permits. */ 47 47 48 /** Implementation of page hash table interface. */49 #define HT_WIDTH_ARCH 20 /* 1M */50 #define HT_HASH_ARCH(page, asid) vhpt_hash((page), (asid))51 #define HT_COMPARE_ARCH(page, asid, t) vhpt_compare((page), (asid), (t))52 #define HT_SLOT_EMPTY_ARCH(t) ((t)->present.tag.tag_info.ti)53 #define HT_INVALIDATE_SLOT_ARCH(t) (t)->present.tag.tag_info.ti = true54 #define HT_GET_NEXT_ARCH(t) (t)->present.next55 #define HT_SET_NEXT_ARCH(t, s) (t)->present.next = (s)56 #define HT_SET_RECORD_ARCH(t, page, asid, frame, flags) vhpt_set_record(t, page, asid, frame, flags)57 58 48 #define PPN_SHIFT 12 59 49 … … 64 54 65 55 #define VHPT_WIDTH 20 /* 1M */ 66 #define VHPT_SIZE (1 <<VHPT_WIDTH)67 #define VHPT_BASE page_ht/* Must be aligned to VHPT_SIZE */56 #define VHPT_SIZE (1 << VHPT_WIDTH) 57 #define VHPT_BASE 0 /* Must be aligned to VHPT_SIZE */ 68 58 69 59 #define PTA_BASE_SHIFT 15 … … 116 106 117 107 /* Word 3 */ 118 pte_t *next; /**< Collision chain next pointer. */108 __u64 ig3 : 64; 119 109 } __attribute__ ((packed)); 120 110 … … 134 124 135 125 /* Word 3 */ 136 pte_t *next; /**< Collision chain next pointer. */ 137 126 __u64 ig3 : 64; 138 127 } __attribute__ ((packed)); 139 128 … … 142 131 struct vhpt_entry_not_present not_present; 143 132 __u64 word[4]; 144 } vhpt_entry ;133 } vhpt_entry_t; 145 134 146 135 struct region_register_map { … … 258 247 259 248 extern void page_arch_init(void); 260 extern pte_t *vhpt_hash(__address page, asid_t asid); 261 extern bool vhpt_compare(__address page, asid_t asid, pte_t *t); 262 extern void vhpt_set_record(pte_t *t, __address page, asid_t asid, __address frame, int flags); 249 250 extern vhpt_entry_t *vhpt_hash(__address page, asid_t asid); 251 extern bool vhpt_compare(__address page, asid_t asid, vhpt_entry_t *v); 252 extern void vhpt_set_record(vhpt_entry_t *v, __address page, asid_t asid, __address frame, int flags); 263 253 264 254 #endif -
arch/ia64/include/types.h
r214f5bb rc7ec94a4 48 48 typedef __u64 __native; 49 49 50 typedef union vhpt_entrypte_t;50 typedef struct pte pte_t; 51 51 52 52 #endif -
arch/ia64/src/mm/page.c
r214f5bb rc7ec94a4 43 43 #include <memstr.h> 44 44 45 static void set_ vhpt_environment(void);45 static void set_environment(void); 46 46 47 47 /** Initialize ia64 virtual address translation subsystem. */ … … 50 50 page_operations = &page_ht_operations; 51 51 pk_disable(); 52 set_ vhpt_environment();52 set_environment(); 53 53 } 54 54 55 55 /** Initialize VHPT and region registers. */ 56 void set_ vhpt_environment(void)56 void set_environment(void) 57 57 { 58 58 region_register rr; … … 88 88 89 89 /* 90 * Allocate VHPT and invalidate all its entries.91 */92 page_ht = (pte_t *) frame_alloc(VHPT_WIDTH - FRAME_WIDTH, FRAME_KA);93 memsetb((__address) page_ht, VHPT_SIZE, 0);94 ht_invalidate_all();95 96 /*97 90 * Set up PTA register. 98 91 */ … … 101 94 pta.map.vf = 1; /* large entry format */ 102 95 pta.map.size = VHPT_WIDTH; 103 pta.map.base = ((__address) page_ht)>> PTA_BASE_SHIFT;96 pta.map.base = VHPT_BASE >> PTA_BASE_SHIFT; 104 97 pta_write(pta.word); 105 98 srlz_i(); … … 114 107 * @param asid Address space identifier. 115 108 * 116 * @return Head of VHPT collision chain for page and asid.117 */ 118 pte_t *vhpt_hash(__address page, asid_t asid)109 * @return VHPT entry address. 110 */ 111 vhpt_entry_t *vhpt_hash(__address page, asid_t asid) 119 112 { 120 113 region_register rr_save, rr; 121 114 index_t vrn; 122 115 rid_t rid; 123 pte_t *t;116 vhpt_entry_t *v; 124 117 125 118 vrn = page >> VRN_SHIFT; … … 131 124 * The RID is already in place, compute thash and return. 132 125 */ 133 t = (pte_t *) thash(page);134 return t;126 v = (vhpt_entry_t *) thash(page); 127 return v; 135 128 } 136 129 … … 143 136 rr_write(vrn, rr.word); 144 137 srlz_i(); 145 t = (pte_t *) thash(page);138 v = (vhpt_entry_t *) thash(page); 146 139 rr_write(vrn, rr_save.word); 147 140 srlz_i(); 148 141 srlz_d(); 149 142 150 return t;143 return v; 151 144 } 152 145 … … 160 153 * @return True if page and asid match the page and asid of t, false otherwise. 161 154 */ 162 bool vhpt_compare(__address page, asid_t asid, pte_t *t)155 bool vhpt_compare(__address page, asid_t asid, vhpt_entry_t *v) 163 156 { 164 157 region_register rr_save, rr; … … 167 160 bool match; 168 161 169 ASSERT( t);162 ASSERT(v); 170 163 171 164 vrn = page >> VRN_SHIFT; … … 177 170 * The RID is already in place, compare ttag with t and return. 178 171 */ 179 return ttag(page) == t->present.tag.tag_word;172 return ttag(page) == v->present.tag.tag_word; 180 173 } 181 174 … … 188 181 rr_write(vrn, rr.word); 189 182 srlz_i(); 190 match = (ttag(page) == t->present.tag.tag_word);183 match = (ttag(page) == v->present.tag.tag_word); 191 184 rr_write(vrn, rr_save.word); 192 185 srlz_i(); … … 204 197 * @param flags Different flags for the mapping. 205 198 */ 206 void vhpt_set_record( pte_t *t, __address page, asid_t asid, __address frame, int flags)199 void vhpt_set_record(vhpt_entry_t *v, __address page, asid_t asid, __address frame, int flags) 207 200 { 208 201 region_register rr_save, rr; … … 211 204 __u64 tag; 212 205 213 ASSERT( t);206 ASSERT(v); 214 207 215 208 vrn = page >> VRN_SHIFT; … … 232 225 * Clear the entry. 233 226 */ 234 t->word[0] = 0; 235 t->word[1] = 0; 236 t->word[2] = 0; 237 t->word[3] = 0; 238 239 t->present.p = true; 240 t->present.ma = (flags & PAGE_CACHEABLE) ? MA_WRITEBACK : MA_UNCACHEABLE; 241 t->present.a = false; /* not accessed */ 242 t->present.d = false; /* not dirty */ 243 t->present.pl = (flags & PAGE_USER) ? PL_USER : PL_KERNEL; 244 t->present.ar = (flags & PAGE_WRITE) ? AR_WRITE : AR_READ; 245 t->present.ar |= (flags & PAGE_EXEC) ? AR_EXECUTE : 0; 246 t->present.ppn = frame >> PPN_SHIFT; 247 t->present.ed = false; /* exception not deffered */ 248 t->present.ps = PAGE_WIDTH; 249 t->present.key = 0; 250 t->present.tag.tag_word = tag; 251 t->present.next = NULL; 252 } 227 v->word[0] = 0; 228 v->word[1] = 0; 229 v->word[2] = 0; 230 v->word[3] = 0; 231 232 v->present.p = true; 233 v->present.ma = (flags & PAGE_CACHEABLE) ? MA_WRITEBACK : MA_UNCACHEABLE; 234 v->present.a = false; /* not accessed */ 235 v->present.d = false; /* not dirty */ 236 v->present.pl = (flags & PAGE_USER) ? PL_USER : PL_KERNEL; 237 v->present.ar = (flags & PAGE_WRITE) ? AR_WRITE : AR_READ; 238 v->present.ar |= (flags & PAGE_EXEC) ? AR_EXECUTE : 0; 239 v->present.ppn = frame >> PPN_SHIFT; 240 v->present.ed = false; /* exception not deffered */ 241 v->present.ps = PAGE_WIDTH; 242 v->present.key = 0; 243 v->present.tag.tag_word = tag; 244 } -
arch/sparc64/include/mm/page.h
r214f5bb rc7ec94a4 42 42 #define SET_PTL0_ADDRESS_ARCH(x) /**< To be removed as situation permits. */ 43 43 44 /** Implementation of page hash table interface. */45 #define HT_WIDTH_ARCH 20 /* 1M */46 #define HT_HASH_ARCH(page, asid) 047 #define HT_COMPARE_ARCH(page, asid, t) 048 #define HT_SLOT_EMPTY_ARCH(t) 149 #define HT_INVALIDATE_SLOT_ARCH(t)50 #define HT_GET_NEXT_ARCH(t) 051 #define HT_SET_NEXT_ARCH(t, s)52 #define HT_SET_RECORD_ARCH(t, page, asid, frame, flags)53 54 44 union page_address { 55 45 __address address; -
arch/sparc64/include/types.h
r214f5bb rc7ec94a4 45 45 typedef __u64 __native; 46 46 47 typedef __u64pte_t;47 typedef struct pte pte_t; 48 48 49 49 typedef __u8 asi_t; -
arch/sparc64/src/mm/frame.c
r214f5bb rc7ec94a4 33 33 void frame_arch_init(void) 34 34 { 35 /* 36 * Workaround to prevent slab allocator from allocating fram 0, 37 * which is not, at that time, mapped. 38 */ 39 frame_region_not_free(0, FRAME_SIZE); 40 35 41 zone_create_in_region(0, config.memory_size & ~(FRAME_SIZE - 1)); 36 42 }
Note:
See TracChangeset
for help on using the changeset viewer.