Changeset 6eeb4a3 in mainline for kernel/arch/ia32/src/ddi/ddi.c
- Timestamp:
- 2014-08-18T21:18:27Z (11 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f93ba6d
- Parents:
- 8cd680c
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ia32/src/ddi/ddi.c
r8cd680c r6eeb4a3 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 Starting 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 }110 111 /** Disable I/O space range for task.112 *113 * Interrupts are disabled and task is locked.114 *115 * @param task Task.116 * @param ioaddr Starting I/O space address.117 * @param size Size of the enabled I/O range.118 *119 * @return EOK on success or an error code from errno.h.120 *121 */122 int ddi_iospace_disable_arch(task_t *task, uintptr_t ioaddr, size_t size)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 144 return 0;145 }146 147 47 148 48 /** Install I/O Permission bitmap.
Note:
See TracChangeset
for help on using the changeset viewer.