Changeset da1bafb in mainline for kernel/genarch/src/mm/page_ht.c
- Timestamp:
- 2010-05-24T18:57:31Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0095368
- Parents:
- 666f492
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/mm/page_ht.c
r666f492 rda1bafb 33 33 /** 34 34 * @file 35 * @brief 35 * @brief Virtual Address Translation (VAT) for global page hash table. 36 36 */ 37 37 … … 52 52 #include <align.h> 53 53 54 static size_t hash(unative_t key[]); 55 static bool compare(unative_t key[], size_t keys, link_t *item); 56 static void remove_callback(link_t *item); 57 58 static void ht_mapping_insert(as_t *as, uintptr_t page, uintptr_t frame, 59 int flags); 60 static void ht_mapping_remove(as_t *as, uintptr_t page); 61 static pte_t *ht_mapping_find(as_t *as, uintptr_t page); 54 static size_t hash(unative_t[]); 55 static bool compare(unative_t[], size_t, link_t *); 56 static void remove_callback(link_t *); 57 58 static void ht_mapping_insert(as_t *, uintptr_t, uintptr_t, unsigned int); 59 static void ht_mapping_remove(as_t *, uintptr_t); 60 static pte_t *ht_mapping_find(as_t *, uintptr_t); 62 61 63 62 /** … … 65 64 * after address space lock and after any address space area 66 65 * locks. 66 * 67 67 */ 68 68 mutex_t page_ht_lock; 69 69 70 /** 71 * Page hash table.70 /** Page hash table. 71 * 72 72 * The page hash table may be accessed only when page_ht_lock is held. 73 * 73 74 */ 74 75 hash_table_t page_ht; … … 93 94 * 94 95 * @return Index into page hash table. 96 * 95 97 */ 96 98 size_t hash(unative_t key[]) … … 98 100 as_t *as = (as_t *) key[KEY_AS]; 99 101 uintptr_t page = (uintptr_t) key[KEY_PAGE]; 100 size_t index;101 102 102 103 /* … … 104 105 * of occurring. Least significant bits of VPN compose the 105 106 * hash index. 106 */ 107 index = ((page >> PAGE_WIDTH) & (PAGE_HT_ENTRIES - 1)); 107 * 108 */ 109 size_t index = ((page >> PAGE_WIDTH) & (PAGE_HT_ENTRIES - 1)); 108 110 109 111 /* … … 111 113 * similar addresses. Least significant bits compose the 112 114 * hash index. 115 * 113 116 */ 114 117 index |= ((unative_t) as) & (PAGE_HT_ENTRIES - 1); … … 119 122 /** Compare page hash table item with page and/or address space. 120 123 * 121 * @param key Array of one or two keys (i.e. page and/or address space).124 * @param key Array of one or two keys (i.e. page and/or address space). 122 125 * @param keys Number of keys passed. 123 126 * @param item Item to compare the keys with. 124 127 * 125 128 * @return true on match, false otherwise. 129 * 126 130 */ 127 131 bool compare(unative_t key[], size_t keys, link_t *item) 128 132 { 129 pte_t *t;130 131 133 ASSERT(item); 132 ASSERT((keys > 0) && (keys <= PAGE_HT_KEYS)); 133 134 ASSERT(keys > 0); 135 ASSERT(keys <= PAGE_HT_KEYS); 136 134 137 /* 135 138 * Convert item to PTE. 136 * /137 t = hash_table_get_instance(item, pte_t, link);138 139 if (keys == PAGE_HT_KEYS) {140 return (key[KEY_AS] == (uintptr_t) t->as) &&141 (key[KEY_PAGE] == t->page);142 } else {143 return (key[KEY_AS] == (uintptr_t) t->as);144 }139 * 140 */ 141 pte_t *pte = hash_table_get_instance(item, pte_t, link); 142 143 if (keys == PAGE_HT_KEYS) 144 return (key[KEY_AS] == (uintptr_t) pte->as) && 145 (key[KEY_PAGE] == pte->page); 146 147 return (key[KEY_AS] == (uintptr_t) pte->as); 145 148 } 146 149 … … 148 151 * 149 152 * @param item Page hash table item being removed. 153 * 150 154 */ 151 155 void remove_callback(link_t *item) 152 156 { 153 pte_t *t;154 155 157 ASSERT(item); 156 158 157 159 /* 158 160 * Convert item to PTE. 159 */ 160 t = hash_table_get_instance(item, pte_t, link); 161 162 free(t); 161 * 162 */ 163 pte_t *pte = hash_table_get_instance(item, pte_t, link); 164 165 free(pte); 163 166 } 164 167 … … 166 169 * 167 170 * Map virtual address page to physical address frame 168 * using flags. 171 * using flags. 169 172 * 170 173 * The page table must be locked and interrupts must be disabled. 171 174 * 172 * @param as Address space to which page belongs.173 * @param page Virtual address of the page to be mapped.175 * @param as Address space to which page belongs. 176 * @param page Virtual address of the page to be mapped. 174 177 * @param frame Physical address of memory frame to which the mapping is done. 175 178 * @param flags Flags to be used for mapping. 176 */ 177 void ht_mapping_insert(as_t *as, uintptr_t page, uintptr_t frame, int flags) 178 { 179 pte_t *t; 179 * 180 */ 181 void ht_mapping_insert(as_t *as, uintptr_t page, uintptr_t frame, 182 unsigned int flags) 183 { 180 184 unative_t key[2] = { 181 185 (uintptr_t) as, … … 184 188 185 189 if (!hash_table_find(&page_ht, key)) { 186 t= (pte_t *) malloc(sizeof(pte_t), FRAME_ATOMIC);187 ASSERT( t!= NULL);188 189 t->g = (flags & PAGE_GLOBAL) != 0;190 t->x = (flags & PAGE_EXEC) != 0;191 t->w = (flags & PAGE_WRITE) != 0;192 t->k = !(flags & PAGE_USER);193 t->c = (flags & PAGE_CACHEABLE) != 0;194 t->p = !(flags & PAGE_NOT_PRESENT);195 t->a = false;196 t->d = false;197 198 t->as = as;199 t->page = ALIGN_DOWN(page, PAGE_SIZE);200 t->frame = ALIGN_DOWN(frame, FRAME_SIZE);201 202 hash_table_insert(&page_ht, key, & t->link);190 pte_t *pte = (pte_t *) malloc(sizeof(pte_t), FRAME_ATOMIC); 191 ASSERT(pte != NULL); 192 193 pte->g = (flags & PAGE_GLOBAL) != 0; 194 pte->x = (flags & PAGE_EXEC) != 0; 195 pte->w = (flags & PAGE_WRITE) != 0; 196 pte->k = !(flags & PAGE_USER); 197 pte->c = (flags & PAGE_CACHEABLE) != 0; 198 pte->p = !(flags & PAGE_NOT_PRESENT); 199 pte->a = false; 200 pte->d = false; 201 202 pte->as = as; 203 pte->page = ALIGN_DOWN(page, PAGE_SIZE); 204 pte->frame = ALIGN_DOWN(frame, FRAME_SIZE); 205 206 hash_table_insert(&page_ht, key, &pte->link); 203 207 } 204 208 } … … 212 216 * The page table must be locked and interrupts must be disabled. 213 217 * 214 * @param as Address space to wich page belongs.218 * @param as Address space to wich page belongs. 215 219 * @param page Virtual address of the page to be demapped. 220 * 216 221 */ 217 222 void ht_mapping_remove(as_t *as, uintptr_t page) … … 236 241 * The page table must be locked and interrupts must be disabled. 237 242 * 238 * @param as Address space to wich page belongs.243 * @param as Address space to wich page belongs. 239 244 * @param page Virtual page. 240 245 * 241 246 * @return NULL if there is no such mapping; requested mapping otherwise. 247 * 242 248 */ 243 249 pte_t *ht_mapping_find(as_t *as, uintptr_t page) 244 250 { 245 link_t *hlp;246 pte_t *t = NULL;247 251 unative_t key[2] = { 248 252 (uintptr_t) as, … … 250 254 }; 251 255 252 hlp= hash_table_find(&page_ht, key);253 if ( hlp)254 t = hash_table_get_instance(hlp, pte_t, link);255 256 return t;256 link_t *cur = hash_table_find(&page_ht, key); 257 if (cur) 258 return hash_table_get_instance(cur, pte_t, link); 259 260 return NULL; 257 261 } 258 262
Note:
See TracChangeset
for help on using the changeset viewer.