Changes in / [725d038:7ca22e5] in mainline
- Location:
- kernel
- Files:
-
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/abs32le/include/mm/page.h
r725d038 r7ca22e5 105 105 set_pt_flags((pte_t *) (ptl3), (size_t) (i), (x)) 106 106 107 /* Set PTE present bit accessors for each level. */108 #define SET_PTL1_PRESENT_ARCH(ptl0, i) \109 set_pt_present((pte_t *) (ptl0), (size_t) (i))110 #define SET_PTL2_PRESENT_ARCH(ptl1, i)111 #define SET_PTL3_PRESENT_ARCH(ptl2, i)112 #define SET_FRAME_PRESENT_ARCH(ptl3, i) \113 set_pt_present((pte_t *) (ptl3), (size_t) (i))114 115 107 /* Macros for querying the last level entries. */ 116 108 #define PTE_VALID_ARCH(p) \ … … 181 173 } 182 174 183 NO_TRACE static inline void set_pt_present(pte_t *pt, size_t i)184 WRITES(ARRAY_RANGE(pt, PTL0_ENTRIES_ARCH))185 REQUIRES_ARRAY_MUTABLE(pt, PTL0_ENTRIES_ARCH)186 {187 pte_t *p = &pt[i];188 189 p->present = 1;190 }191 192 175 extern void page_arch_init(void); 193 176 extern void page_fault(unsigned int, istate_t *); -
kernel/arch/amd64/include/mm/page.h
r725d038 r7ca22e5 119 119 set_pt_flags((pte_t *) (ptl3), (size_t) (i), (x)) 120 120 121 /* Set PTE present bit accessors for each level. */122 #define SET_PTL1_PRESENT_ARCH(ptl0, i) \123 set_pt_present((pte_t *) (ptl0), (size_t) (i))124 #define SET_PTL2_PRESENT_ARCH(ptl1, i) \125 set_pt_present((pte_t *) (ptl1), (size_t) (i))126 #define SET_PTL3_PRESENT_ARCH(ptl2, i) \127 set_pt_present((pte_t *) (ptl2), (size_t) (i))128 #define SET_FRAME_PRESENT_ARCH(ptl3, i) \129 set_pt_present((pte_t *) (ptl3), (size_t) (i))130 131 121 /* Macros for querying the last-level PTE entries. */ 132 122 #define PTE_VALID_ARCH(p) \ … … 225 215 } 226 216 227 NO_TRACE static inline void set_pt_present(pte_t *pt, size_t i)228 {229 pte_t *p = &pt[i];230 231 p->present = 1;232 }233 234 217 extern void page_arch_init(void); 235 218 extern void page_fault(unsigned int, istate_t *); -
kernel/arch/amd64/src/mm/page.c
r725d038 r7ca22e5 57 57 uintptr_t cur; 58 58 unsigned int identity_flags = 59 PAGE_ GLOBAL | PAGE_CACHEABLE | PAGE_EXEC | PAGE_WRITE | PAGE_READ;59 PAGE_CACHEABLE | PAGE_EXEC | PAGE_GLOBAL | PAGE_WRITE; 60 60 61 61 page_mapping_operations = &pt_mapping_operations; -
kernel/arch/arm32/include/mm/page.h
r725d038 r7ca22e5 40 40 #include <mm/mm.h> 41 41 #include <arch/exception.h> 42 #include <arch/barrier.h>43 42 #include <trace.h> 44 43 … … 110 109 #define SET_FRAME_FLAGS_ARCH(ptl3, i, x) \ 111 110 set_pt_level1_flags((pte_t *) (ptl3), (size_t) (i), (x)) 112 113 /* Set PTE present bit accessors for each level. */114 #define SET_PTL1_PRESENT_ARCH(ptl0, i) \115 set_pt_level0_present((pte_t *) (ptl0), (size_t) (i))116 #define SET_PTL2_PRESENT_ARCH(ptl1, i)117 #define SET_PTL3_PRESENT_ARCH(ptl2, i)118 #define SET_FRAME_PRESENT_ARCH(ptl3, i) \119 set_pt_level1_present((pte_t *) (ptl3), (size_t) (i))120 111 121 112 /* Macros for querying the last-level PTE entries. */ … … 276 267 } 277 268 278 NO_TRACE static inline void set_pt_level0_present(pte_t *pt, size_t i)279 {280 pte_level0_t *p = &pt[i].l0;281 282 p->should_be_zero = 0;283 write_barrier();284 p->descriptor_type = PTE_DESCRIPTOR_COARSE_TABLE;285 }286 269 287 270 /** Sets flags of level 1 page table entry. … … 300 283 pte_level1_t *p = &pt[i].l1; 301 284 302 if (flags & PAGE_NOT_PRESENT) 285 if (flags & PAGE_NOT_PRESENT) { 303 286 p->descriptor_type = PTE_DESCRIPTOR_NOT_PRESENT; 304 else 287 p->access_permission_3 = 1; 288 } else { 305 289 p->descriptor_type = PTE_DESCRIPTOR_SMALL_PAGE; 290 p->access_permission_3 = p->access_permission_0; 291 } 306 292 307 293 p->cacheable = p->bufferable = (flags & PAGE_CACHEABLE) != 0; … … 326 312 } 327 313 328 NO_TRACE static inline void set_pt_level1_present(pte_t *pt, size_t i) 329 { 330 pte_level1_t *p = &pt[i].l1; 331 332 p->descriptor_type = PTE_DESCRIPTOR_SMALL_PAGE; 333 } 334 314 335 315 extern void page_arch_init(void); 336 316 317 337 318 #endif /* __ASM__ */ 338 319 -
kernel/arch/ia32/include/mm/page.h
r725d038 r7ca22e5 115 115 set_pt_flags((pte_t *) (ptl3), (size_t) (i), (x)) 116 116 117 /* Set PTE present bit accessors for each level. */118 #define SET_PTL1_PRESENT_ARCH(ptl0, i) \119 set_pt_present((pte_t *) (ptl0), (size_t) (i))120 #define SET_PTL2_PRESENT_ARCH(ptl1, i)121 #define SET_PTL3_PRESENT_ARCH(ptl2, i)122 #define SET_FRAME_PRESENT_ARCH(ptl3, i) \123 set_pt_present((pte_t *) (ptl3), (size_t) (i))124 125 117 /* Macros for querying the last level entries. */ 126 118 #define PTE_VALID_ARCH(p) \ … … 202 194 } 203 195 204 NO_TRACE static inline void set_pt_present(pte_t *pt, size_t i)205 {206 pte_t *p = &pt[i];207 208 p->present = 1;209 }210 211 196 extern void page_arch_init(void); 212 197 extern void page_fault(unsigned int, istate_t *); -
kernel/arch/ia32/src/mm/page.c
r725d038 r7ca22e5 71 71 for (cur = 0; cur < min(config.identity_size, config.physmem_end); 72 72 cur += FRAME_SIZE) { 73 flags = PAGE_GLOBAL | PAGE_CACHEABLE | PAGE_WRITE | PAGE_READ; 73 flags = PAGE_CACHEABLE | PAGE_WRITE; 74 if ((PA2KA(cur) >= config.base) && 75 (PA2KA(cur) < config.base + config.kernel_size)) 76 flags |= PAGE_GLOBAL; 74 77 page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, flags); 75 78 } -
kernel/arch/ia32/src/smp/apic.c
r725d038 r7ca22e5 259 259 } 260 260 261 #define DELIVS_PENDING_SILENT_RETRIES 4262 263 static void l_apic_wait_for_delivery(void)264 {265 icr_t icr;266 unsigned retries = 0;267 268 do {269 if (retries++ > DELIVS_PENDING_SILENT_RETRIES) {270 retries = 0;271 #ifdef CONFIG_DEBUG272 printf("IPI is pending.\n");273 #endif274 delay(20);275 }276 icr.lo = l_apic[ICRlo];277 } while (icr.delivs == DELIVS_PENDING);278 279 }280 281 261 /** Send all CPUs excluding CPU IPI vector. 282 262 * … … 299 279 300 280 l_apic[ICRlo] = icr.lo; 301 302 l_apic_wait_for_delivery(); 281 282 icr.lo = l_apic[ICRlo]; 283 if (icr.delivs == DELIVS_PENDING) { 284 #ifdef CONFIG_DEBUG 285 printf("IPI is pending.\n"); 286 #endif 287 } 303 288 304 289 return apic_poll_errors(); … … 342 327 return 0; 343 328 344 l_apic_wait_for_delivery();345 346 329 icr.lo = l_apic[ICRlo]; 330 if (icr.delivs == DELIVS_PENDING) { 331 #ifdef CONFIG_DEBUG 332 printf("IPI is pending.\n"); 333 #endif 334 } 335 347 336 icr.delmod = DELMOD_INIT; 348 337 icr.destmod = DESTMOD_PHYS; -
kernel/arch/mips32/include/mm/page.h
r725d038 r7ca22e5 128 128 set_pt_flags((pte_t *) (ptl3), (size_t) (i), (x)) 129 129 130 /* Set PTE present bit accessors for each level. */131 #define SET_PTL1_PRESENT_ARCH(ptl0, i) \132 set_pt_present((pte_t *) (ptl0), (size_t) (i))133 #define SET_PTL2_PRESENT_ARCH(ptl1, i)134 #define SET_PTL3_PRESENT_ARCH(ptl2, i)135 #define SET_FRAME_PRESENT_ARCH(ptl3, i) \136 set_pt_present((pte_t *) (ptl3), (size_t) (i))137 138 130 /* Last-level info macros. */ 139 131 #define PTE_VALID_ARCH(pte) (*((uint32_t *) (pte)) != 0) … … 190 182 } 191 183 192 NO_TRACE static inline void set_pt_present(pte_t *pt, size_t i)193 {194 pte_t *p = &pt[i];195 196 p->p = 1;197 }198 199 200 184 extern void page_arch_init(void); 201 185 -
kernel/arch/ppc32/include/mm/page.h
r725d038 r7ca22e5 129 129 set_pt_flags((pte_t *) (ptl3), (size_t) (i), (x)) 130 130 131 /* Set PTE present accessors for each level. */132 #define SET_PTL1_PRESENT_ARCH(ptl0, i) \133 set_pt_present((pte_t *) (ptl0), (size_t) (i))134 135 #define SET_PTL2_PRESENT_ARCH(ptl1, i)136 #define SET_PTL3_PRESENT_ARCH(ptl2, i)137 138 #define SET_FRAME_PRESENT_ARCH(ptl3, i) \139 set_pt_present((pte_t *) (ptl3), (size_t) (i))140 141 131 /* Macros for querying the last-level PTEs. */ 142 132 #define PTE_VALID_ARCH(pte) (*((uint32_t *) (pte)) != 0) … … 185 175 } 186 176 187 NO_TRACE static inline void set_pt_present(pte_t *pt, size_t i)188 {189 pte_t *entry = &pt[i];190 191 entry->present = 1;192 }193 194 177 extern void page_arch_init(void); 195 178 -
kernel/arch/sparc64/src/smp/sun4u/ipi.c
r725d038 r7ca22e5 124 124 (void) interrupts_disable(); 125 125 } 126 } while ( !done);126 } while (done); 127 127 128 128 preemption_enable(); -
kernel/genarch/include/mm/page_pt.h
r725d038 r7ca22e5 115 115 116 116 /* 117 * These macros are provided to set the present bit within the page tables.118 *119 */120 #define SET_PTL1_PRESENT(ptl0, i) SET_PTL1_PRESENT_ARCH(ptl0, i)121 #define SET_PTL2_PRESENT(ptl1, i) SET_PTL2_PRESENT_ARCH(ptl1, i)122 #define SET_PTL3_PRESENT(ptl2, i) SET_PTL3_PRESENT_ARCH(ptl2, i)123 #define SET_FRAME_PRESENT(ptl3, i) SET_FRAME_PRESENT_ARCH(ptl3, i)124 125 /*126 117 * Macros for querying the last-level PTEs. 127 118 * -
kernel/genarch/src/mm/page_ht.c
r725d038 r7ca22e5 45 45 #include <typedefs.h> 46 46 #include <arch/asm.h> 47 #include <arch/barrier.h>48 47 #include <synch/spinlock.h> 49 48 #include <arch.h> … … 208 207 pte->page = ALIGN_DOWN(page, PAGE_SIZE); 209 208 pte->frame = ALIGN_DOWN(frame, FRAME_SIZE); 210 211 write_barrier();212 209 213 210 hash_table_insert(&page_ht, key, &pte->link); -
kernel/genarch/src/mm/page_pt.c
r725d038 r7ca22e5 43 43 #include <arch/mm/page.h> 44 44 #include <arch/mm/as.h> 45 #include <arch/barrier.h>46 45 #include <typedefs.h> 47 46 #include <arch/asm.h> … … 87 86 SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page), KA2PA(newpt)); 88 87 SET_PTL1_FLAGS(ptl0, PTL0_INDEX(page), 89 PAGE_ NOT_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE |88 PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | 90 89 PAGE_WRITE); 91 write_barrier();92 SET_PTL1_PRESENT(ptl0, PTL0_INDEX(page));93 90 } 94 91 … … 101 98 SET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page), KA2PA(newpt)); 102 99 SET_PTL2_FLAGS(ptl1, PTL1_INDEX(page), 103 PAGE_ NOT_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE |100 PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | 104 101 PAGE_WRITE); 105 write_barrier();106 SET_PTL2_PRESENT(ptl1, PTL1_INDEX(page));107 102 } 108 103 … … 115 110 SET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page), KA2PA(newpt)); 116 111 SET_PTL3_FLAGS(ptl2, PTL2_INDEX(page), 117 PAGE_ NOT_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE |112 PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | 118 113 PAGE_WRITE); 119 write_barrier();120 SET_PTL3_PRESENT(ptl2, PTL2_INDEX(page));121 114 } 122 115 … … 124 117 125 118 SET_FRAME_ADDRESS(ptl3, PTL3_INDEX(page), frame); 126 SET_FRAME_FLAGS(ptl3, PTL3_INDEX(page), flags | PAGE_NOT_PRESENT); 127 write_barrier(); 128 SET_FRAME_PRESENT(ptl3, PTL3_INDEX(page)); 119 SET_FRAME_FLAGS(ptl3, PTL3_INDEX(page), flags); 129 120 } 130 121 … … 288 279 if (GET_PTL1_FLAGS(ptl0, PTL0_INDEX(page)) & PAGE_NOT_PRESENT) 289 280 return NULL; 290 291 read_barrier();292 281 293 282 pte_t *ptl1 = (pte_t *) PA2KA(GET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page))); 294 283 if (GET_PTL2_FLAGS(ptl1, PTL1_INDEX(page)) & PAGE_NOT_PRESENT) 295 284 return NULL; 296 297 #if (PTL1_ENTRIES != 0)298 read_barrier();299 #endif300 285 301 286 pte_t *ptl2 = (pte_t *) PA2KA(GET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page))); 302 287 if (GET_PTL3_FLAGS(ptl2, PTL2_INDEX(page)) & PAGE_NOT_PRESENT) 303 288 return NULL; 304 305 #if (PTL2_ENTRIES != 0)306 read_barrier();307 #endif308 289 309 290 pte_t *ptl3 = (pte_t *) PA2KA(GET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page))); … … 365 346 SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(addr), KA2PA(l1)); 366 347 SET_PTL1_FLAGS(ptl0, PTL0_INDEX(addr), 367 PAGE_PRESENT | PAGE_USER | PAGE_ CACHEABLE |368 PAGE_ EXEC | PAGE_WRITE | PAGE_READ);348 PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | 349 PAGE_WRITE); 369 350 } 370 351 } -
kernel/generic/src/mm/as.c
r725d038 r7ca22e5 665 665 666 666 page_table_lock(as, false); 667 668 /* 669 * Start TLB shootdown sequence. 670 */ 671 ipl_t ipl = tlb_shootdown_start(TLB_INVL_PAGES, as->asid, 672 area->base + P2SZ(pages), area->pages - pages); 667 673 668 674 /* … … 720 726 } 721 727 722 /*723 * Start TLB shootdown sequence.724 *725 * The sequence is rather short and can be726 * repeated multiple times. The reason is that727 * we don't want to have used_space_remove()728 * inside the sequence as it may use a blocking729 * memory allocation for its B+tree. Blocking730 * while holding the tlblock spinlock is731 * forbidden and would hit a kernel assertion.732 */733 734 ipl_t ipl = tlb_shootdown_start(TLB_INVL_PAGES,735 as->asid, area->base + P2SZ(pages),736 area->pages - pages);737 738 728 for (; i < size; i++) { 739 729 pte_t *pte = page_mapping_find(as, … … 753 743 page_mapping_remove(as, ptr + P2SZ(i)); 754 744 } 755 756 /*757 * Finish TLB shootdown sequence.758 */759 760 tlb_invalidate_pages(as->asid,761 area->base + P2SZ(pages),762 area->pages - pages);763 764 /*765 * Invalidate software translation caches766 * (e.g. TSB on sparc64, PHT on ppc32).767 */768 as_invalidate_translation_cache(as,769 area->base + P2SZ(pages),770 area->pages - pages);771 tlb_shootdown_finalize(ipl);772 745 } 773 746 } 747 748 /* 749 * Finish TLB shootdown sequence. 750 */ 751 752 tlb_invalidate_pages(as->asid, area->base + P2SZ(pages), 753 area->pages - pages); 754 755 /* 756 * Invalidate software translation caches 757 * (e.g. TSB on sparc64, PHT on ppc32). 758 */ 759 as_invalidate_translation_cache(as, area->base + P2SZ(pages), 760 area->pages - pages); 761 tlb_shootdown_finalize(ipl); 762 774 763 page_table_unlock(as, false); 775 764 } else { -
kernel/generic/src/mm/tlb.c
r725d038 r7ca22e5 162 162 163 163 size_t i; 164 for (i = 0; i < CPU->tlb_messages_count; i++) {164 for (i = 0; i < CPU->tlb_messages_count; CPU->tlb_messages_count--) { 165 165 tlb_invalidate_type_t type = CPU->tlb_messages[i].type; 166 166 asid_t asid = CPU->tlb_messages[i].asid; … … 188 188 } 189 189 190 CPU->tlb_messages_count = 0;191 190 irq_spinlock_unlock(&CPU->lock, false); 192 191 CPU->tlb_active = true;
Note:
See TracChangeset
for help on using the changeset viewer.