Changes in kernel/generic/src/ddi/ddi.c [a422bc5:953bc1ef] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/ddi/ddi.c
ra422bc5 r953bc1ef 46 46 #include <mm/frame.h> 47 47 #include <mm/as.h> 48 #include <synch/ mutex.h>48 #include <synch/spinlock.h> 49 49 #include <syscall/copy.h> 50 50 #include <adt/btree.h> … … 54 54 55 55 /** This lock protects the parea_btree. */ 56 static mutex_t parea_lock;56 SPINLOCK_INITIALIZE(parea_lock); 57 57 58 58 /** B+tree with enabled physical memory areas. */ … … 63 63 { 64 64 btree_create(&parea_btree); 65 mutex_initialize(&parea_lock, MUTEX_PASSIVE);66 65 } 67 66 … … 73 72 void ddi_parea_register(parea_t *parea) 74 73 { 75 mutex_lock(&parea_lock); 74 ipl_t ipl = interrupts_disable(); 75 spinlock_lock(&parea_lock); 76 76 77 77 /* … … 80 80 btree_insert(&parea_btree, (btree_key_t) parea->pbase, parea, NULL); 81 81 82 mutex_unlock(&parea_lock); 82 spinlock_unlock(&parea_lock); 83 interrupts_restore(ipl); 83 84 } 84 85 … … 140 141 spinlock_unlock(&zones.lock); 141 142 142 mutex_lock(&parea_lock);143 spinlock_lock(&parea_lock); 143 144 btree_node_t *nodep; 144 145 parea_t *parea = (parea_t *) btree_search(&parea_btree, 145 146 (btree_key_t) pf, &nodep); 146 147 147 if ((!parea) || (parea->frames < pages)) { 148 mutex_unlock(&parea_lock); 148 if ((!parea) || (parea->frames < pages)) 149 149 goto err; 150 }151 150 152 mutex_unlock(&parea_lock);151 spinlock_unlock(&parea_lock); 153 152 goto map; 154 153 } 155 154 155 err: 156 156 spinlock_unlock(&zones.lock); 157 err:158 157 interrupts_restore(ipl); 159 158 return ENOENT; 160 159 161 160 map: 162 interrupts_restore(ipl);163 161 spinlock_lock(&TASK->lock); 162 164 163 if (!as_area_create(TASK->as, flags, pages * PAGE_SIZE, vp, 165 164 AS_AREA_ATTR_NONE, &phys_backend, &backend_data)) { … … 168 167 * We report it using ENOMEM. 169 168 */ 169 spinlock_unlock(&TASK->lock); 170 interrupts_restore(ipl); 170 171 return ENOMEM; 171 172 } … … 174 175 * Mapping is created on-demand during page fault. 175 176 */ 177 178 spinlock_unlock(&TASK->lock); 179 interrupts_restore(ipl); 176 180 return 0; 177 181 } … … 283 287 } 284 288 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 285 316 /** @} 286 317 */
Note:
See TracChangeset
for help on using the changeset viewer.