Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ia32/src/ddi/ddi.c

    r6eeb4a3 rc5396c1  
    4545#include <arch.h>
    4646#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 */
     59int 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}
    47110
    48111/** Install I/O Permission bitmap.
Note: See TracChangeset for help on using the changeset viewer.