Ignore:
File:
1 edited

Legend:

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

    rda1bafb rd99c1d2  
    5050 * Interrupts are disabled and task is locked.
    5151 *
    52  * @param task   Task.
     52 * @param task Task.
    5353 * @param ioaddr Startign I/O space address.
    54  * @param size   Size of the enabled I/O range.
     54 * @param size Size of the enabled I/O range.
    5555 *
    5656 * @return 0 on success or an error code from errno.h.
    57  *
    5857 */
    5958int ddi_iospace_enable_arch(task_t *task, uintptr_t ioaddr, size_t size)
    6059{
    61         size_t bits = ioaddr + size;
     60        size_t bits;
     61
     62        bits = ioaddr + size;
    6263        if (bits > IO_PORTS)
    6364                return ENOENT;
     65
     66        if (task->arch.iomap.bits < bits) {
     67                bitmap_t oldiomap;
     68                uint8_t *newmap;
    6469       
    65         if (task->arch.iomap.bits < bits) {
    6670                /*
    6771                 * The I/O permission bitmap is too small and needs to be grown.
    6872                 */
    6973               
    70                 uint8_t *newmap = (uint8_t *) malloc(BITS2BYTES(bits), FRAME_ATOMIC);
     74                newmap = (uint8_t *) malloc(BITS2BYTES(bits), FRAME_ATOMIC);
    7175                if (!newmap)
    7276                        return ENOMEM;
    7377               
    74                 bitmap_t oldiomap;
    7578                bitmap_initialize(&oldiomap, task->arch.iomap.map,
    7679                    task->arch.iomap.bits);
    7780                bitmap_initialize(&task->arch.iomap, newmap, bits);
    78                
     81
    7982                /*
    8083                 * Mark the new range inaccessible.
     
    8285                bitmap_set_range(&task->arch.iomap, oldiomap.bits,
    8386                    bits - oldiomap.bits);
    84                
     87
    8588                /*
    8689                 * In case there really existed smaller iomap,
    8790                 * copy its contents and deallocate it.
    88                  */
     91                 */             
    8992                if (oldiomap.bits) {
    9093                        bitmap_copy(&task->arch.iomap, &oldiomap,
     
    9396                }
    9497        }
    95        
     98
    9699        /*
    97100         * Enable the range and we are done.
    98101         */
    99102        bitmap_clear_range(&task->arch.iomap, (size_t) ioaddr, (size_t) size);
    100        
     103
    101104        /*
    102105         * Increment I/O Permission bitmap generation counter.
    103106         */
    104107        task->arch.iomapver++;
    105        
     108
    106109        return 0;
    107110}
     
    113116 *
    114117 * Interrupts must be disabled prior this call.
    115  *
    116118 */
    117119void io_perm_bitmap_install(void)
    118120{
     121        size_t bits;
     122        ptr_16_32_t cpugdtr;
     123        descriptor_t *gdt_p;
     124        size_t ver;
     125
    119126        /* First, copy the I/O Permission Bitmap. */
    120         irq_spinlock_lock(&TASK->lock, false);
    121         size_t ver = TASK->arch.iomapver;
    122         size_t bits = TASK->arch.iomap.bits;
    123         if (bits) {
     127        spinlock_lock(&TASK->lock);
     128        ver = TASK->arch.iomapver;
     129        if ((bits = TASK->arch.iomap.bits)) {
     130                bitmap_t iomap;
     131                task_t *task = TASK;
     132       
    124133                ASSERT(TASK->arch.iomap.map);
    125                
    126                 bitmap_t iomap;
    127134                bitmap_initialize(&iomap, CPU->arch.tss->iomap,
    128135                    TSS_IOMAP_SIZE * 8);
    129                 bitmap_copy(&iomap, &TASK->arch.iomap, TASK->arch.iomap.bits);
    130                
     136                bitmap_copy(&iomap, &task->arch.iomap, task->arch.iomap.bits);
    131137                /*
    132138                 * It is safe to set the trailing eight bits because of the
     
    135141                bitmap_set_range(&iomap, ALIGN_UP(TASK->arch.iomap.bits, 8), 8);
    136142        }
    137         irq_spinlock_unlock(&TASK->lock, false);
    138        
     143        spinlock_unlock(&TASK->lock);
     144
    139145        /*
    140146         * Second, adjust TSS segment limit.
    141147         * Take the extra ending byte with all bits set into account.
    142148         */
    143         ptr_16_32_t cpugdtr;
    144149        gdtr_store(&cpugdtr);
    145        
    146         descriptor_t *gdt_p = (descriptor_t *) cpugdtr.base;
     150        gdt_p = (descriptor_t *) cpugdtr.base;
    147151        gdt_setlimit(&gdt_p[TSS_DES], TSS_BASIC_SIZE + BITS2BYTES(bits));
    148152        gdtr_load(&cpugdtr);
    149        
     153
    150154        /*
    151155         * Before we load new TSS limit, the current TSS descriptor
Note: See TracChangeset for help on using the changeset viewer.