Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/ddi/ddi.c

    r953bc1ef ra422bc5  
    4646#include <mm/frame.h>
    4747#include <mm/as.h>
    48 #include <synch/spinlock.h>
     48#include <synch/mutex.h>
    4949#include <syscall/copy.h>
    5050#include <adt/btree.h>
     
    5454
    5555/** This lock protects the parea_btree. */
    56 SPINLOCK_INITIALIZE(parea_lock);
     56static mutex_t parea_lock;
    5757
    5858/** B+tree with enabled physical memory areas. */
     
    6363{
    6464        btree_create(&parea_btree);
     65        mutex_initialize(&parea_lock, MUTEX_PASSIVE);
    6566}
    6667
     
    7273void ddi_parea_register(parea_t *parea)
    7374{
    74         ipl_t ipl = interrupts_disable();
    75         spinlock_lock(&parea_lock);
     75        mutex_lock(&parea_lock);
    7676       
    7777        /*
     
    8080        btree_insert(&parea_btree, (btree_key_t) parea->pbase, parea, NULL);
    8181       
    82         spinlock_unlock(&parea_lock);
    83         interrupts_restore(ipl);
     82        mutex_unlock(&parea_lock);
    8483}
    8584
     
    141140                spinlock_unlock(&zones.lock);
    142141               
    143                 spinlock_lock(&parea_lock);
     142                mutex_lock(&parea_lock);
    144143                btree_node_t *nodep;
    145144                parea_t *parea = (parea_t *) btree_search(&parea_btree,
    146145                    (btree_key_t) pf, &nodep);
    147146               
    148                 if ((!parea) || (parea->frames < pages))
     147                if ((!parea) || (parea->frames < pages)) {
     148                        mutex_unlock(&parea_lock);
    149149                        goto err;
     150                }
    150151               
    151                 spinlock_unlock(&parea_lock);
     152                mutex_unlock(&parea_lock);
    152153                goto map;
    153154        }
    154155       
     156        spinlock_unlock(&zones.lock);
    155157err:
    156         spinlock_unlock(&zones.lock);
    157158        interrupts_restore(ipl);
    158159        return ENOENT;
    159160       
    160161map:
    161         spinlock_lock(&TASK->lock);
    162        
     162        interrupts_restore(ipl);
     163
    163164        if (!as_area_create(TASK->as, flags, pages * PAGE_SIZE, vp,
    164165            AS_AREA_ATTR_NONE, &phys_backend, &backend_data)) {
     
    167168                 * We report it using ENOMEM.
    168169                 */
    169                 spinlock_unlock(&TASK->lock);
    170                 interrupts_restore(ipl);
    171170                return ENOMEM;
    172171        }
     
    175174         * Mapping is created on-demand during page fault.
    176175         */
    177        
    178         spinlock_unlock(&TASK->lock);
    179         interrupts_restore(ipl);
    180176        return 0;
    181177}
     
    287283}
    288284
    289 /** Disable or enable specified interrupts.
    290  *
    291  * @param irq the interrupt to be enabled/disabled.
    292  * @param enable if true enable the interrupt, disable otherwise.
    293  *
    294  * @retutn Zero on success, error code otherwise.
    295  */
    296 unative_t sys_interrupt_enable(int irq, int enable)
    297 {       
    298         cap_t task_cap = cap_get(TASK);
    299         if (!(task_cap & CAP_PREEMPT_CONTROL) || !(task_cap & CAP_IRQ_REG))
    300                 return EPERM;
    301                
    302         if (irq < 0 || irq > 16) {
    303                 return EINVAL;
    304         }
    305        
    306         uint16_t irq_mask = (uint16_t)(1 << irq);
    307         if (enable) {
    308                 trap_virtual_enable_irqs(irq_mask);
    309         } else {
    310                 trap_virtual_disable_irqs(irq_mask);
    311         }
    312        
    313         return 0;       
    314 }
    315 
    316285/** @}
    317286 */
Note: See TracChangeset for help on using the changeset viewer.