Rev 2089 | Rev 4490 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2089 | Rev 2141 | ||
|---|---|---|---|
| Line 53... | Line 53... | ||
| 53 | 53 | ||
| 54 | static index_t hash(unative_t key[]); |
54 | static index_t hash(unative_t key[]); |
| 55 | static bool compare(unative_t key[], count_t keys, link_t *item); |
55 | static bool compare(unative_t key[], count_t keys, link_t *item); |
| 56 | static void remove_callback(link_t *item); |
56 | static void remove_callback(link_t *item); |
| 57 | 57 | ||
| 58 | static void ht_mapping_insert(as_t *as, uintptr_t page, uintptr_t frame, int flags); |
58 | static void ht_mapping_insert(as_t *as, uintptr_t page, uintptr_t frame, |
| - | 59 | int flags); |
|
| 59 | static void ht_mapping_remove(as_t *as, uintptr_t page); |
60 | static void ht_mapping_remove(as_t *as, uintptr_t page); |
| 60 | static pte_t *ht_mapping_find(as_t *as, uintptr_t page); |
61 | static pte_t *ht_mapping_find(as_t *as, uintptr_t page); |
| 61 | 62 | ||
| 62 | /** |
63 | /** |
| 63 | * This lock protects the page hash table. It must be acquired |
64 | * This lock protects the page hash table. It must be acquired |
| Line 101... | Line 102... | ||
| 101 | /* |
102 | /* |
| 102 | * Virtual page addresses have roughly the same probability |
103 | * Virtual page addresses have roughly the same probability |
| 103 | * of occurring. Least significant bits of VPN compose the |
104 | * of occurring. Least significant bits of VPN compose the |
| 104 | * hash index. |
105 | * hash index. |
| 105 | */ |
106 | */ |
| 106 | index = ((page >> PAGE_WIDTH) & (PAGE_HT_ENTRIES-1)); |
107 | index = ((page >> PAGE_WIDTH) & (PAGE_HT_ENTRIES - 1)); |
| 107 | 108 | ||
| 108 | /* |
109 | /* |
| 109 | * Address space structures are likely to be allocated from |
110 | * Address space structures are likely to be allocated from |
| 110 | * similar addresses. Least significant bits compose the |
111 | * similar addresses. Least significant bits compose the |
| 111 | * hash index. |
112 | * hash index. |
| 112 | */ |
113 | */ |
| 113 | index |= ((unative_t) as) & (PAGE_HT_ENTRIES-1); |
114 | index |= ((unative_t) as) & (PAGE_HT_ENTRIES - 1); |
| 114 | 115 | ||
| 115 | return index; |
116 | return index; |
| 116 | } |
117 | } |
| 117 | 118 | ||
| 118 | /** Compare page hash table item with page and/or address space. |
119 | /** Compare page hash table item with page and/or address space. |
| Line 134... | Line 135... | ||
| 134 | * Convert item to PTE. |
135 | * Convert item to PTE. |
| 135 | */ |
136 | */ |
| 136 | t = hash_table_get_instance(item, pte_t, link); |
137 | t = hash_table_get_instance(item, pte_t, link); |
| 137 | 138 | ||
| 138 | if (keys == PAGE_HT_KEYS) { |
139 | if (keys == PAGE_HT_KEYS) { |
| 139 | return (key[KEY_AS] == (uintptr_t) t->as) && (key[KEY_PAGE] == t->page); |
140 | return (key[KEY_AS] == (uintptr_t) t->as) && |
| - | 141 | (key[KEY_PAGE] == t->page); |
|
| 140 | } else { |
142 | } else { |
| 141 | return (key[KEY_AS] == (uintptr_t) t->as); |
143 | return (key[KEY_AS] == (uintptr_t) t->as); |
| 142 | } |
144 | } |
| 143 | } |
145 | } |
| 144 | 146 | ||
| Line 173... | Line 175... | ||
| 173 | * @param flags Flags to be used for mapping. |
175 | * @param flags Flags to be used for mapping. |
| 174 | */ |
176 | */ |
| 175 | void ht_mapping_insert(as_t *as, uintptr_t page, uintptr_t frame, int flags) |
177 | void ht_mapping_insert(as_t *as, uintptr_t page, uintptr_t frame, int flags) |
| 176 | { |
178 | { |
| 177 | pte_t *t; |
179 | pte_t *t; |
| - | 180 | unative_t key[2] = { |
|
| - | 181 | (uintptr_t) as, |
|
| 178 | unative_t key[2] = { (uintptr_t) as, page = ALIGN_DOWN(page, PAGE_SIZE) }; |
182 | page = ALIGN_DOWN(page, PAGE_SIZE) |
| - | 183 | }; |
|
| 179 | 184 | ||
| 180 | if (!hash_table_find(&page_ht, key)) { |
185 | if (!hash_table_find(&page_ht, key)) { |
| 181 | t = (pte_t *) malloc(sizeof(pte_t), FRAME_ATOMIC); |
186 | t = (pte_t *) malloc(sizeof(pte_t), FRAME_ATOMIC); |
| 182 | ASSERT(t != NULL); |
187 | ASSERT(t != NULL); |
| 183 | 188 | ||
| Line 207... | Line 212... | ||
| 207 | * @param as Address space to wich page belongs. |
212 | * @param as Address space to wich page belongs. |
| 208 | * @param page Virtual address of the page to be demapped. |
213 | * @param page Virtual address of the page to be demapped. |
| 209 | */ |
214 | */ |
| 210 | void ht_mapping_remove(as_t *as, uintptr_t page) |
215 | void ht_mapping_remove(as_t *as, uintptr_t page) |
| 211 | { |
216 | { |
| - | 217 | unative_t key[2] = { |
|
| - | 218 | (uintptr_t) as, |
|
| 212 | unative_t key[2] = { (uintptr_t) as, page = ALIGN_DOWN(page, PAGE_SIZE) }; |
219 | page = ALIGN_DOWN(page, PAGE_SIZE) |
| - | 220 | }; |
|
| 213 | 221 | ||
| 214 | /* |
222 | /* |
| 215 | * Note that removed PTE's will be freed |
223 | * Note that removed PTE's will be freed |
| 216 | * by remove_callback(). |
224 | * by remove_callback(). |
| 217 | */ |
225 | */ |
| Line 232... | Line 240... | ||
| 232 | */ |
240 | */ |
| 233 | pte_t *ht_mapping_find(as_t *as, uintptr_t page) |
241 | pte_t *ht_mapping_find(as_t *as, uintptr_t page) |
| 234 | { |
242 | { |
| 235 | link_t *hlp; |
243 | link_t *hlp; |
| 236 | pte_t *t = NULL; |
244 | pte_t *t = NULL; |
| - | 245 | unative_t key[2] = { |
|
| - | 246 | (uintptr_t) as, |
|
| 237 | unative_t key[2] = { (uintptr_t) as, page = ALIGN_DOWN(page, PAGE_SIZE) }; |
247 | page = ALIGN_DOWN(page, PAGE_SIZE) |
| - | 248 | }; |
|
| 238 | 249 | ||
| 239 | hlp = hash_table_find(&page_ht, key); |
250 | hlp = hash_table_find(&page_ht, key); |
| 240 | if (hlp) |
251 | if (hlp) |
| 241 | t = hash_table_get_instance(hlp, pte_t, link); |
252 | t = hash_table_get_instance(hlp, pte_t, link); |
| 242 | 253 | ||