Changes in kernel/arch/ia32/src/ddi/ddi.c [6eeb4a3:c5396c1] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ia32/src/ddi/ddi.c
r6eeb4a3 rc5396c1 45 45 #include <arch.h> 46 46 #include <align.h> 47 48 /** Enable I/O space range for task. 49 * 50 * Interrupts are disabled and task is locked. 51 * 52 * @param task Task. 53 * @param ioaddr Startign I/O space address. 54 * @param size Size of the enabled I/O range. 55 * 56 * @return 0 on success or an error code from errno.h. 57 * 58 */ 59 int ddi_iospace_enable_arch(task_t *task, uintptr_t ioaddr, size_t size) 60 { 61 size_t elements = ioaddr + size; 62 if (elements > IO_PORTS) 63 return ENOENT; 64 65 if (task->arch.iomap.elements < elements) { 66 /* 67 * The I/O permission bitmap is too small and needs to be grown. 68 */ 69 70 void *store = malloc(bitmap_size(elements), FRAME_ATOMIC); 71 if (!store) 72 return ENOMEM; 73 74 bitmap_t oldiomap; 75 bitmap_initialize(&oldiomap, task->arch.iomap.elements, 76 task->arch.iomap.bits); 77 78 bitmap_initialize(&task->arch.iomap, elements, store); 79 80 /* 81 * Mark the new range inaccessible. 82 */ 83 bitmap_set_range(&task->arch.iomap, oldiomap.elements, 84 elements - oldiomap.elements); 85 86 /* 87 * In case there really existed smaller iomap, 88 * copy its contents and deallocate it. 89 */ 90 if (oldiomap.bits) { 91 bitmap_copy(&task->arch.iomap, &oldiomap, 92 oldiomap.elements); 93 94 free(oldiomap.bits); 95 } 96 } 97 98 /* 99 * Enable the range and we are done. 100 */ 101 bitmap_clear_range(&task->arch.iomap, (size_t) ioaddr, size); 102 103 /* 104 * Increment I/O Permission bitmap generation counter. 105 */ 106 task->arch.iomapver++; 107 108 return 0; 109 } 47 110 48 111 /** Install I/O Permission bitmap.
Note:
See TracChangeset
for help on using the changeset viewer.