Ignore:
File:
1 edited

Legend:

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

    ra422bc5 r953bc1ef  
    4646#include <mm/frame.h>
    4747#include <mm/as.h>
    48 #include <synch/mutex.h>
     48#include <synch/spinlock.h>
    4949#include <syscall/copy.h>
    5050#include <adt/btree.h>
     
    5454
    5555/** This lock protects the parea_btree. */
    56 static mutex_t parea_lock;
     56SPINLOCK_INITIALIZE(parea_lock);
    5757
    5858/** B+tree with enabled physical memory areas. */
     
    6363{
    6464        btree_create(&parea_btree);
    65         mutex_initialize(&parea_lock, MUTEX_PASSIVE);
    6665}
    6766
     
    7372void ddi_parea_register(parea_t *parea)
    7473{
    75         mutex_lock(&parea_lock);
     74        ipl_t ipl = interrupts_disable();
     75        spinlock_lock(&parea_lock);
    7676       
    7777        /*
     
    8080        btree_insert(&parea_btree, (btree_key_t) parea->pbase, parea, NULL);
    8181       
    82         mutex_unlock(&parea_lock);
     82        spinlock_unlock(&parea_lock);
     83        interrupts_restore(ipl);
    8384}
    8485
     
    140141                spinlock_unlock(&zones.lock);
    141142               
    142                 mutex_lock(&parea_lock);
     143                spinlock_lock(&parea_lock);
    143144                btree_node_t *nodep;
    144145                parea_t *parea = (parea_t *) btree_search(&parea_btree,
    145146                    (btree_key_t) pf, &nodep);
    146147               
    147                 if ((!parea) || (parea->frames < pages)) {
    148                         mutex_unlock(&parea_lock);
     148                if ((!parea) || (parea->frames < pages))
    149149                        goto err;
    150                 }
    151150               
    152                 mutex_unlock(&parea_lock);
     151                spinlock_unlock(&parea_lock);
    153152                goto map;
    154153        }
    155154       
     155err:
    156156        spinlock_unlock(&zones.lock);
    157 err:
    158157        interrupts_restore(ipl);
    159158        return ENOENT;
    160159       
    161160map:
    162         interrupts_restore(ipl);
    163 
     161        spinlock_lock(&TASK->lock);
     162       
    164163        if (!as_area_create(TASK->as, flags, pages * PAGE_SIZE, vp,
    165164            AS_AREA_ATTR_NONE, &phys_backend, &backend_data)) {
     
    168167                 * We report it using ENOMEM.
    169168                 */
     169                spinlock_unlock(&TASK->lock);
     170                interrupts_restore(ipl);
    170171                return ENOMEM;
    171172        }
     
    174175         * Mapping is created on-demand during page fault.
    175176         */
     177       
     178        spinlock_unlock(&TASK->lock);
     179        interrupts_restore(ipl);
    176180        return 0;
    177181}
     
    283287}
    284288
     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 */
     296unative_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
    285316/** @}
    286317 */
Note: See TracChangeset for help on using the changeset viewer.