Changes in kernel/genarch/src/mm/page_ht.c [80a3bd9:fdaad75d] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/mm/page_ht.c
r80a3bd9 rfdaad75d 33 33 /** 34 34 * @file 35 * @brief 35 * @brief Virtual Address Translation (VAT) for global page hash table. 36 36 */ 37 37 … … 43 43 #include <mm/as.h> 44 44 #include <arch/mm/asid.h> 45 #include < arch/types.h>45 #include <typedefs.h> 46 46 #include <arch/asm.h> 47 47 #include <synch/spinlock.h> … … 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. 169 * 170 * The page table must be locked and interrupts must be disabled. 171 * 172 * @param as Address space to which page belongs. 173 * @param page Virtual address of the page to be mapped. 171 * using flags. 172 * 173 * @param as Address space to which page belongs. 174 * @param page Virtual address of the page to be mapped. 174 175 * @param frame Physical address of memory frame to which the mapping is done. 175 176 * @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; 177 * 178 */ 179 void ht_mapping_insert(as_t *as, uintptr_t page, uintptr_t frame, 180 unsigned int flags) 181 { 180 182 unative_t key[2] = { 181 183 (uintptr_t) as, 182 184 page = ALIGN_DOWN(page, PAGE_SIZE) 183 185 }; 186 187 ASSERT(page_table_locked(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 } … … 210 214 * this call visible. 211 215 * 212 * The page table must be locked and interrupts must be disabled. 213 * 214 * @param as Address space to wich page belongs. 216 * @param as Address space to wich page belongs. 215 217 * @param page Virtual address of the page to be demapped. 218 * 216 219 */ 217 220 void ht_mapping_remove(as_t *as, uintptr_t page) … … 221 224 page = ALIGN_DOWN(page, PAGE_SIZE) 222 225 }; 226 227 ASSERT(page_table_locked(as)); 223 228 224 229 /* … … 234 239 * Find mapping for virtual page. 235 240 * 236 * The page table must be locked and interrupts must be disabled. 237 * 238 * @param as Address space to wich page belongs. 241 * @param as Address space to wich page belongs. 239 242 * @param page Virtual page. 240 243 * 241 244 * @return NULL if there is no such mapping; requested mapping otherwise. 245 * 242 246 */ 243 247 pte_t *ht_mapping_find(as_t *as, uintptr_t page) 244 248 { 245 link_t *hlp;246 pte_t *t = NULL;247 249 unative_t key[2] = { 248 250 (uintptr_t) as, 249 251 page = ALIGN_DOWN(page, PAGE_SIZE) 250 252 }; 251 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; 253 254 ASSERT(page_table_locked(as)); 255 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.