Changeset 6eeb4a3 in mainline for kernel/genarch/src/ddi/ddi-bitmap.c
- Timestamp:
- 2014-08-18T21:18:27Z (10 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f93ba6d
- Parents:
- 8cd680c
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/ddi/ddi-bitmap.c
r8cd680c r6eeb4a3 27 27 */ 28 28 29 /** @addtogroup ppc32ddi29 /** @addtogroup amd64ddi 30 30 * @{ 31 31 */ … … 34 34 35 35 #include <ddi/ddi.h> 36 #include <arch/ddi/ddi.h> 36 37 #include <proc/task.h> 37 38 #include <typedefs.h> 39 #include <adt/bitmap.h> 40 #include <mm/slab.h> 41 #include <arch/pm.h> 42 #include <errno.h> 43 #include <arch/cpu.h> 44 #include <cpu.h> 45 #include <arch.h> 46 #include <align.h> 38 47 39 48 /** Enable I/O space range for task. … … 45 54 * @param size Size of the enabled I/O range. 46 55 * 47 * @return 0on success or an error code from errno.h.56 * @return EOK on success or an error code from errno.h. 48 57 * 49 58 */ 50 59 int ddi_iospace_enable_arch(task_t *task, uintptr_t ioaddr, size_t size) 51 60 { 52 return 0; 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 EOK; 53 109 } 54 110 … … 59 115 * @param task Task. 60 116 * @param ioaddr Starting I/O space address. 61 * @param size Size of the disabled I/O range.117 * @param size Size of the enabled I/O range. 62 118 * 63 * @return 0on success or an error code from errno.h.119 * @return EOK on success or an error code from errno.h. 64 120 * 65 121 */ 66 122 int ddi_iospace_disable_arch(task_t *task, uintptr_t ioaddr, size_t size) 67 123 { 124 size_t elements = ioaddr + size; 125 if (elements > IO_PORTS) 126 return ENOENT; 127 128 if (ioaddr >= task->arch.iomap.elements) 129 return EINVAL; 130 131 if (task->arch.iomap.elements < elements) 132 size -= elements - task->arch.iomap.elements; 133 134 /* 135 * Disable the range. 136 */ 137 bitmap_set_range(&task->arch.iomap, (size_t) ioaddr, size); 138 139 /* 140 * Increment I/O Permission bitmap generation counter. 141 */ 142 task->arch.iomapver++; 143 68 144 return 0; 69 145 }
Note:
See TracChangeset
for help on using the changeset viewer.