Changes in / [725d038:7ca22e5] in mainline


Ignore:
Location:
kernel
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/abs32le/include/mm/page.h

    r725d038 r7ca22e5  
    105105        set_pt_flags((pte_t *) (ptl3), (size_t) (i), (x))
    106106
    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 
    115107/* Macros for querying the last level entries. */
    116108#define PTE_VALID_ARCH(p) \
     
    181173}
    182174
    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 
    192175extern void page_arch_init(void);
    193176extern void page_fault(unsigned int, istate_t *);
  • kernel/arch/amd64/include/mm/page.h

    r725d038 r7ca22e5  
    119119        set_pt_flags((pte_t *) (ptl3), (size_t) (i), (x))
    120120
    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 
    131121/* Macros for querying the last-level PTE entries. */
    132122#define PTE_VALID_ARCH(p) \
     
    225215}
    226216
    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 
    234217extern void page_arch_init(void);
    235218extern void page_fault(unsigned int, istate_t *);
  • kernel/arch/amd64/src/mm/page.c

    r725d038 r7ca22e5  
    5757        uintptr_t cur;
    5858        unsigned int identity_flags =
    59             PAGE_GLOBAL | PAGE_CACHEABLE | PAGE_EXEC | PAGE_WRITE | PAGE_READ;
     59            PAGE_CACHEABLE | PAGE_EXEC | PAGE_GLOBAL | PAGE_WRITE;
    6060               
    6161        page_mapping_operations = &pt_mapping_operations;
  • kernel/arch/arm32/include/mm/page.h

    r725d038 r7ca22e5  
    4040#include <mm/mm.h>
    4141#include <arch/exception.h>
    42 #include <arch/barrier.h>
    4342#include <trace.h>
    4443
     
    110109#define SET_FRAME_FLAGS_ARCH(ptl3, i, x) \
    111110        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))
    120111
    121112/* Macros for querying the last-level PTE entries. */
     
    276267}
    277268
    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 }
    286269
    287270/** Sets flags of level 1 page table entry.
     
    300283        pte_level1_t *p = &pt[i].l1;
    301284       
    302         if (flags & PAGE_NOT_PRESENT)
     285        if (flags & PAGE_NOT_PRESENT) {
    303286                p->descriptor_type = PTE_DESCRIPTOR_NOT_PRESENT;
    304         else
     287                p->access_permission_3 = 1;
     288        } else {
    305289                p->descriptor_type = PTE_DESCRIPTOR_SMALL_PAGE;
     290                p->access_permission_3 = p->access_permission_0;
     291        }
    306292       
    307293        p->cacheable = p->bufferable = (flags & PAGE_CACHEABLE) != 0;
     
    326312}
    327313
    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
    335315extern void page_arch_init(void);
    336316
     317
    337318#endif /* __ASM__ */
    338319
  • kernel/arch/ia32/include/mm/page.h

    r725d038 r7ca22e5  
    115115        set_pt_flags((pte_t *) (ptl3), (size_t) (i), (x))
    116116
    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 
    125117/* Macros for querying the last level entries. */
    126118#define PTE_VALID_ARCH(p) \
     
    202194}
    203195
    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 
    211196extern void page_arch_init(void);
    212197extern void page_fault(unsigned int, istate_t *);
  • kernel/arch/ia32/src/mm/page.c

    r725d038 r7ca22e5  
    7171        for (cur = 0; cur < min(config.identity_size, config.physmem_end);
    7272            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;
    7477                page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, flags);
    7578        }
  • kernel/arch/ia32/src/smp/apic.c

    r725d038 r7ca22e5  
    259259}
    260260
    261 #define DELIVS_PENDING_SILENT_RETRIES   4       
    262 
    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_DEBUG
    272                         printf("IPI is pending.\n");
    273 #endif
    274                         delay(20);
    275                 }
    276                 icr.lo = l_apic[ICRlo];
    277         } while (icr.delivs == DELIVS_PENDING);
    278        
    279 }
    280 
    281261/** Send all CPUs excluding CPU IPI vector.
    282262 *
     
    299279       
    300280        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        }
    303288       
    304289        return apic_poll_errors();
     
    342327                return 0;
    343328       
    344         l_apic_wait_for_delivery();
    345 
    346329        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       
    347336        icr.delmod = DELMOD_INIT;
    348337        icr.destmod = DESTMOD_PHYS;
  • kernel/arch/mips32/include/mm/page.h

    r725d038 r7ca22e5  
    128128        set_pt_flags((pte_t *) (ptl3), (size_t) (i), (x))
    129129
    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 
    138130/* Last-level info macros. */
    139131#define PTE_VALID_ARCH(pte)                     (*((uint32_t *) (pte)) != 0)
     
    190182}
    191183
    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 
    200184extern void page_arch_init(void);
    201185
  • kernel/arch/ppc32/include/mm/page.h

    r725d038 r7ca22e5  
    129129        set_pt_flags((pte_t *) (ptl3), (size_t) (i), (x))
    130130
    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 
    141131/* Macros for querying the last-level PTEs. */
    142132#define PTE_VALID_ARCH(pte)       (*((uint32_t *) (pte)) != 0)
     
    185175}
    186176
    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 
    194177extern void page_arch_init(void);
    195178
  • kernel/arch/sparc64/src/smp/sun4u/ipi.c

    r725d038 r7ca22e5  
    124124                        (void) interrupts_disable();
    125125                }
    126         } while (!done);
     126        } while (done);
    127127       
    128128        preemption_enable();
  • kernel/genarch/include/mm/page_pt.h

    r725d038 r7ca22e5  
    115115
    116116/*
    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 /*
    126117 * Macros for querying the last-level PTEs.
    127118 *
  • kernel/genarch/src/mm/page_ht.c

    r725d038 r7ca22e5  
    4545#include <typedefs.h>
    4646#include <arch/asm.h>
    47 #include <arch/barrier.h>
    4847#include <synch/spinlock.h>
    4948#include <arch.h>
     
    208207                pte->page = ALIGN_DOWN(page, PAGE_SIZE);
    209208                pte->frame = ALIGN_DOWN(frame, FRAME_SIZE);
    210 
    211                 write_barrier();
    212209               
    213210                hash_table_insert(&page_ht, key, &pte->link);
  • kernel/genarch/src/mm/page_pt.c

    r725d038 r7ca22e5  
    4343#include <arch/mm/page.h>
    4444#include <arch/mm/as.h>
    45 #include <arch/barrier.h>
    4645#include <typedefs.h>
    4746#include <arch/asm.h>
     
    8786                SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page), KA2PA(newpt));
    8887                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 |
    9089                    PAGE_WRITE);
    91                 write_barrier();
    92                 SET_PTL1_PRESENT(ptl0, PTL0_INDEX(page));
    9390        }
    9491       
     
    10198                SET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page), KA2PA(newpt));
    10299                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 |
    104101                    PAGE_WRITE);
    105                 write_barrier();
    106                 SET_PTL2_PRESENT(ptl1, PTL1_INDEX(page));       
    107102        }
    108103       
     
    115110                SET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page), KA2PA(newpt));
    116111                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 |
    118113                    PAGE_WRITE);
    119                 write_barrier();
    120                 SET_PTL3_PRESENT(ptl2, PTL2_INDEX(page));
    121114        }
    122115       
     
    124117       
    125118        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);
    129120}
    130121
     
    288279        if (GET_PTL1_FLAGS(ptl0, PTL0_INDEX(page)) & PAGE_NOT_PRESENT)
    289280                return NULL;
    290 
    291         read_barrier();
    292281       
    293282        pte_t *ptl1 = (pte_t *) PA2KA(GET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page)));
    294283        if (GET_PTL2_FLAGS(ptl1, PTL1_INDEX(page)) & PAGE_NOT_PRESENT)
    295284                return NULL;
    296 
    297 #if (PTL1_ENTRIES != 0)
    298         read_barrier();
    299 #endif
    300285       
    301286        pte_t *ptl2 = (pte_t *) PA2KA(GET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page)));
    302287        if (GET_PTL3_FLAGS(ptl2, PTL2_INDEX(page)) & PAGE_NOT_PRESENT)
    303288                return NULL;
    304 
    305 #if (PTL2_ENTRIES != 0)
    306         read_barrier();
    307 #endif
    308289       
    309290        pte_t *ptl3 = (pte_t *) PA2KA(GET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page)));
     
    365346                SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(addr), KA2PA(l1));
    366347                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);
    369350        }
    370351}
  • kernel/generic/src/mm/as.c

    r725d038 r7ca22e5  
    665665               
    666666                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);
    667673               
    668674                /*
     
    720726                                }
    721727                               
    722                                 /*
    723                                  * Start TLB shootdown sequence.
    724                                  *
    725                                  * The sequence is rather short and can be
    726                                  * repeated multiple times. The reason is that
    727                                  * we don't want to have used_space_remove()
    728                                  * inside the sequence as it may use a blocking
    729                                  * memory allocation for its B+tree. Blocking
    730                                  * while holding the tlblock spinlock is
    731                                  * 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                
    738728                                for (; i < size; i++) {
    739729                                        pte_t *pte = page_mapping_find(as,
     
    753743                                        page_mapping_remove(as, ptr + P2SZ(i));
    754744                                }
    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 caches
    766                                  * (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);
    772745                        }
    773746                }
     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               
    774763                page_table_unlock(as, false);
    775764        } else {
  • kernel/generic/src/mm/tlb.c

    r725d038 r7ca22e5  
    162162       
    163163        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--) {
    165165                tlb_invalidate_type_t type = CPU->tlb_messages[i].type;
    166166                asid_t asid = CPU->tlb_messages[i].asid;
     
    188188        }
    189189       
    190         CPU->tlb_messages_count = 0;
    191190        irq_spinlock_unlock(&CPU->lock, false);
    192191        CPU->tlb_active = true;
Note: See TracChangeset for help on using the changeset viewer.