Changeset 6eeb4a3 in mainline for kernel/arch/amd64/src/ddi/ddi.c


Ignore:
Timestamp:
2014-08-18T21:18:27Z (10 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
f93ba6d
Parents:
8cd680c
Message:

Deduplicate ddi_iospace_enable/disable_arch() code.

File:
1 edited

Legend:

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

    r8cd680c r6eeb4a3  
    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 Starting I/O space address.
    54  * @param size   Size of the enabled I/O range.
    55  *
    56  * @return EOK 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 EOK;
    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 }
    14647
    14748/** Install I/O Permission bitmap.
Note: See TracChangeset for help on using the changeset viewer.