Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 6eeb4a3 in mainline


Ignore:
Timestamp:
2014-08-18T21:18:27Z (6 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
master
Children:
f93ba6d
Parents:
8cd680c
Message:

Deduplicate ddi_iospace_enable/disable_arch() code.

Files:
5 deleted
11 edited
2 moved

Legend:

Unmodified
Added
Removed
  • HelenOS.config

    r8cd680c r6eeb4a3  
    367367! [PLATFORM=amd64] CONFIG_FENCES_P4 (y)
    368368
     369% IOMAP bitmap support
     370! [PLATFORM=ia32|PLATFORM=amd64] CONFIG_IOMAP_BITMAP (y)
     371
     372% IOMAP dummy support
     373! [PLATFORM=abs32le|PLATFORM=arm32|PLATFORM=mips32|PLATFORM=mips64|PLATFORM=ppc32|PLATFORM=sparc32|PLATFORM=sparc64] CONFIG_IOMAP_DUMMY (y)
     374
    369375% ACPI support
    370376! [PLATFORM=ia32|PLATFORM=amd64] CONFIG_ACPI (y)
  • kernel/arch/abs32le/Makefile.inc

    r8cd680c r6eeb4a3  
    5050        arch/$(KARCH)/src/userspace.c \
    5151        arch/$(KARCH)/src/cpu/cpu.c \
    52         arch/$(KARCH)/src/ddi/ddi.c \
    5352        arch/$(KARCH)/src/smp/smp.c \
    5453        arch/$(KARCH)/src/smp/ipi.c \
  • 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.
  • kernel/arch/arm32/Makefile.inc

    r8cd680c r6eeb4a3  
    5454        arch/$(KARCH)/src/dummy.S \
    5555        arch/$(KARCH)/src/cpu/cpu.c \
    56         arch/$(KARCH)/src/ddi/ddi.c \
    5756        arch/$(KARCH)/src/interrupt.c \
    5857        arch/$(KARCH)/src/exception.c \
  • kernel/arch/ia32/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 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 
    14747
    14848/** Install I/O Permission bitmap.
  • kernel/arch/mips32/Makefile.inc

    r8cd680c r6eeb4a3  
    7070        arch/$(KARCH)/src/mm/as.c \
    7171        arch/$(KARCH)/src/fpu_context.c \
    72         arch/$(KARCH)/src/ddi/ddi.c \
    7372        arch/$(KARCH)/src/smp/smp.c \
    7473        arch/$(KARCH)/src/machine_func.c
  • kernel/arch/mips64/Makefile.inc

    r8cd680c r6eeb4a3  
    6060        arch/$(KARCH)/src/mm/as.c \
    6161        arch/$(KARCH)/src/fpu_context.c \
    62         arch/$(KARCH)/src/ddi/ddi.c \
    6362        arch/$(KARCH)/src/smp/dorder.c \
    6463        arch/$(KARCH)/src/smp/smp.c
  • kernel/arch/ppc32/Makefile.inc

    r8cd680c r6eeb4a3  
    5151        arch/$(KARCH)/src/cpu/cpu.c \
    5252        arch/$(KARCH)/src/proc/scheduler.c \
    53         arch/$(KARCH)/src/ddi/ddi.c \
    5453        arch/$(KARCH)/src/mm/km.c \
    5554        arch/$(KARCH)/src/mm/as.c \
  • kernel/arch/sparc32/Makefile.inc

    r8cd680c r6eeb4a3  
    4545        arch/$(KARCH)/src/exception.c \
    4646        arch/$(KARCH)/src/cpu/cpu.c \
    47         arch/$(KARCH)/src/ddi/ddi.c \
    4847        arch/$(KARCH)/src/smp/smp.c \
    4948        arch/$(KARCH)/src/smp/ipi.c \
  • kernel/arch/sparc64/Makefile.inc

    r8cd680c r6eeb4a3  
    8181        arch/$(KARCH)/src/trap/exception.c \
    8282        arch/$(KARCH)/src/trap/interrupt.c \
    83         arch/$(KARCH)/src/ddi/ddi.c \
    8483        arch/$(KARCH)/src/drivers/tick.c \
    8584        arch/$(KARCH)/src/drivers/kbd.c \
  • kernel/genarch/Makefile.inc

    r8cd680c r6eeb4a3  
    181181                genarch/src/drivers/ega/ega.c
    182182endif
     183
     184ifeq ($(CONFIG_IOMAP_BITMAP), y)
     185        GENARCH_SOURCES += \
     186                genarch/src/ddi/ddi-bitmap.c
     187endif
     188
     189ifeq ($(CONFIG_IOMAP_DUMMY), y)
     190        GENARCH_SOURCES += \
     191                genarch/src/ddi/ddi-dummy.c
     192endif
     193
  • 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}
  • kernel/genarch/src/ddi/ddi-dummy.c

    r8cd680c r6eeb4a3  
    2727 */
    2828
    29 /** @addtogroup sparc64ddi
     29/** @addtogroup genarch
    3030 * @{
    3131 */
    3232/** @file
     33 *  @brief DDI.
    3334 */
    3435
Note: See TracChangeset for help on using the changeset viewer.