Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/mm/as.c

    r402eda5 r8f80c77  
    239239       
    240240        spinlock_unlock(&asidlock);
    241         interrupts_restore(ipl);
    242 
    243241       
    244242        /*
     
    267265        page_table_destroy(NULL);
    268266#endif
     267       
     268        interrupts_restore(ipl);
    269269       
    270270        slab_free(as_slab, as);
     
    327327                return NULL;
    328328       
     329        ipl_t ipl = interrupts_disable();
    329330        mutex_lock(&as->lock);
    330331       
    331332        if (!check_area_conflicts(as, base, size, NULL)) {
    332333                mutex_unlock(&as->lock);
     334                interrupts_restore(ipl);
    333335                return NULL;
    334336        }
     
    355357       
    356358        mutex_unlock(&as->lock);
     359        interrupts_restore(ipl);
    357360       
    358361        return area;
     
    373376int as_area_resize(as_t *as, uintptr_t address, size_t size, unsigned int flags)
    374377{
     378        ipl_t ipl = interrupts_disable();
    375379        mutex_lock(&as->lock);
    376380       
     
    382386        if (!area) {
    383387                mutex_unlock(&as->lock);
     388                interrupts_restore(ipl);
    384389                return ENOENT;
    385390        }
     
    393398                mutex_unlock(&area->lock);
    394399                mutex_unlock(&as->lock);
     400                interrupts_restore(ipl);
    395401                return ENOTSUP;
    396402        }
     
    404410                mutex_unlock(&area->lock);
    405411                mutex_unlock(&as->lock);
     412                interrupts_restore(ipl);
    406413                return ENOTSUP;
    407414        }
     
    415422                mutex_unlock(&area->lock);
    416423                mutex_unlock(&as->lock);
     424                interrupts_restore(ipl);
    417425                return EPERM;
    418426        }
     
    433441                 *
    434442                 */
    435                 ipl_t ipl = tlb_shootdown_start(TLB_INVL_PAGES, as->asid,
    436                     area->base + pages * PAGE_SIZE, area->pages - pages);
     443                tlb_shootdown_start(TLB_INVL_PAGES, as->asid, area->base +
     444                    pages * PAGE_SIZE, area->pages - pages);
    437445               
    438446                /*
     
    528536                as_invalidate_translation_cache(as, area->base +
    529537                    pages * PAGE_SIZE, area->pages - pages);
    530                 tlb_shootdown_finalize(ipl);
     538                tlb_shootdown_finalize();
    531539               
    532540                page_table_unlock(as, false);
     
    541549                        mutex_unlock(&area->lock);
    542550                        mutex_unlock(&as->lock);
     551                        interrupts_restore(ipl);
    543552                        return EADDRNOTAVAIL;
    544553                }
     
    549558        mutex_unlock(&area->lock);
    550559        mutex_unlock(&as->lock);
     560        interrupts_restore(ipl);
    551561       
    552562        return 0;
     
    563573int as_area_destroy(as_t *as, uintptr_t address)
    564574{
     575        ipl_t ipl = interrupts_disable();
    565576        mutex_lock(&as->lock);
    566577       
     
    568579        if (!area) {
    569580                mutex_unlock(&as->lock);
     581                interrupts_restore(ipl);
    570582                return ENOENT;
    571583        }
     
    578590         * Start TLB shootdown sequence.
    579591         */
    580         ipl_t ipl = tlb_shootdown_start(TLB_INVL_PAGES, as->asid, area->base,
    581             area->pages);
     592        tlb_shootdown_start(TLB_INVL_PAGES, as->asid, area->base, area->pages);
    582593       
    583594        /*
     
    626637         */
    627638        as_invalidate_translation_cache(as, area->base, area->pages);
    628         tlb_shootdown_finalize(ipl);
     639        tlb_shootdown_finalize();
    629640       
    630641        page_table_unlock(as, false);
     
    648659       
    649660        mutex_unlock(&as->lock);
     661        interrupts_restore(ipl);
    650662        return 0;
    651663}
     
    678690    as_t *dst_as, uintptr_t dst_base, unsigned int dst_flags_mask)
    679691{
     692        ipl_t ipl = interrupts_disable();
    680693        mutex_lock(&src_as->lock);
    681694        as_area_t *src_area = find_area_and_lock(src_as, src_base);
     
    686699                 */
    687700                mutex_unlock(&src_as->lock);
     701                interrupts_restore(ipl);
    688702                return ENOENT;
    689703        }
     
    697711                mutex_unlock(&src_area->lock);
    698712                mutex_unlock(&src_as->lock);
     713                interrupts_restore(ipl);
    699714                return ENOTSUP;
    700715        }
     
    713728                mutex_unlock(&src_area->lock);
    714729                mutex_unlock(&src_as->lock);
     730                interrupts_restore(ipl);
    715731                return EPERM;
    716732        }
     
    761777                sh_info_remove_reference(sh_info);
    762778               
     779                interrupts_restore(ipl);
    763780                return ENOMEM;
    764781        }
     
    777794        mutex_unlock(&dst_as->lock);
    778795       
     796        interrupts_restore(ipl);
     797       
    779798        return 0;
    780799}
     
    797816        };
    798817
     818        ASSERT(interrupts_disabled());
    799819        ASSERT(mutex_locked(&area->lock));
    800820       
     
    824844        unsigned int page_flags = area_flags_to_page_flags(flags);
    825845       
     846        ipl_t ipl = interrupts_disable();
    826847        mutex_lock(&as->lock);
    827848       
     
    829850        if (!area) {
    830851                mutex_unlock(&as->lock);
     852                interrupts_restore(ipl);
    831853                return ENOENT;
    832854        }
     
    837859                mutex_unlock(&area->lock);
    838860                mutex_unlock(&as->lock);
     861                interrupts_restore(ipl);
    839862                return ENOTSUP;
    840863        }
     
    866889         *
    867890         */
    868         ipl_t ipl = tlb_shootdown_start(TLB_INVL_PAGES, as->asid, area->base,
    869             area->pages);
     891        tlb_shootdown_start(TLB_INVL_PAGES, as->asid, area->base, area->pages);
    870892       
    871893        /*
     
    914936         */
    915937        as_invalidate_translation_cache(as, area->base, area->pages);
    916         tlb_shootdown_finalize(ipl);
     938        tlb_shootdown_finalize();
    917939       
    918940        page_table_unlock(as, false);
     
    956978        mutex_unlock(&area->lock);
    957979        mutex_unlock(&as->lock);
     980        interrupts_restore(ipl);
    958981       
    959982        return 0;
     
    11961219unsigned int as_area_get_flags(as_area_t *area)
    11971220{
     1221        ASSERT(interrupts_disabled());
    11981222        ASSERT(mutex_locked(&area->lock));
    11991223
     
    12971321as_area_t *find_area_and_lock(as_t *as, uintptr_t va)
    12981322{
     1323        ASSERT(interrupts_disabled());
    12991324        ASSERT(mutex_locked(&as->lock));
    13001325
     
    13611386    as_area_t *avoid_area)
    13621387{
     1388        ASSERT(interrupts_disabled());
    13631389        ASSERT(mutex_locked(&as->lock));
    13641390
     
    14601486        size_t size;
    14611487       
     1488        ipl_t ipl = interrupts_disable();
    14621489        page_table_lock(AS, true);
    14631490        as_area_t *src_area = find_area_and_lock(AS, base);
     
    14701497       
    14711498        page_table_unlock(AS, true);
     1499        interrupts_restore(ipl);
    14721500        return size;
    14731501}
     
    20422070void as_get_area_info(as_t *as, as_area_info_t **obuf, size_t *osize)
    20432071{
     2072        ipl_t ipl = interrupts_disable();
    20442073        mutex_lock(&as->lock);
    20452074       
     
    20852114       
    20862115        mutex_unlock(&as->lock);
     2116        interrupts_restore(ipl);
    20872117       
    20882118        *obuf = info;
     
    20972127void as_print(as_t *as)
    20982128{
     2129        ipl_t ipl = interrupts_disable();
    20992130        mutex_lock(&as->lock);
    21002131       
     
    21192150       
    21202151        mutex_unlock(&as->lock);
     2152        interrupts_restore(ipl);
    21212153}
    21222154
Note: See TracChangeset for help on using the changeset viewer.