Changeset 6eeb4a3 in mainline for kernel/genarch/src/ddi/ddi-bitmap.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 moved

Legend:

Unmodified
Added
Removed
  • kernel/genarch/src/ddi/ddi-bitmap.c

    r8cd680c r6eeb4a3  
    2727 */
    2828
    29 /** @addtogroup ppc32ddi
     29/** @addtogroup amd64ddi
    3030 * @{
    3131 */
     
    3434
    3535#include <ddi/ddi.h>
     36#include <arch/ddi/ddi.h>
    3637#include <proc/task.h>
    3738#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>
    3847
    3948/** Enable I/O space range for task.
     
    4554 * @param size   Size of the enabled I/O range.
    4655 *
    47  * @return 0 on success or an error code from errno.h.
     56 * @return EOK on success or an error code from errno.h.
    4857 *
    4958 */
    5059int ddi_iospace_enable_arch(task_t *task, uintptr_t ioaddr, size_t size)
    5160{
    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;
    53109}
    54110
     
    59115 * @param task   Task.
    60116 * @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.
    62118 *
    63  * @return 0 on success or an error code from errno.h.
     119 * @return EOK on success or an error code from errno.h.
    64120 *
    65121 */
    66122int ddi_iospace_disable_arch(task_t *task, uintptr_t ioaddr, size_t size)
    67123{
     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       
    68144        return 0;
    69145}
Note: See TracChangeset for help on using the changeset viewer.