Changeset f93ba6d in mainline for kernel/arch/ia32/src/ddi/ddi.c


Ignore:
Timestamp:
2014-08-31T19:01:29Z (10 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
c62a8275
Parents:
af0a2c7 (diff), 6eeb4a3 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge from lp:~jakub/helenos/piodisable.

File:
1 edited

Legend:

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

    raf0a2c7 rf93ba6d  
    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  */
    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 }
    11047
    11148/** Install I/O Permission bitmap.
Note: See TracChangeset for help on using the changeset viewer.