Ignore:
File:
1 edited

Legend:

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

    r1d3d2cf rd99c1d2  
    4949 * Interrupts are disabled and task is locked.
    5050 *
    51  * @param task   Task.
     51 * @param task Task.
    5252 * @param ioaddr Startign I/O space address.
    53  * @param size   Size of the enabled I/O range.
     53 * @param size Size of the enabled I/O range.
    5454 *
    5555 * @return 0 on success or an error code from errno.h.
    56  *
    5756 */
    5857int ddi_iospace_enable_arch(task_t *task, uintptr_t ioaddr, size_t size)
    5958{
    60         size_t bits = ioaddr + size;
     59        size_t bits;
     60       
     61        bits = ioaddr + size;
    6162        if (bits > IO_PORTS)
    6263                return ENOENT;
    6364       
    6465        if (task->arch.iomap.bits < bits) {
     66                bitmap_t oldiomap;
     67                uint8_t *newmap;
     68               
    6569                /*
    6670                 * The I/O permission bitmap is too small and needs to be grown.
    6771                 */
    6872               
    69                 uint8_t *newmap = (uint8_t *) malloc(BITS2BYTES(bits), FRAME_ATOMIC);
     73                newmap = (uint8_t *) malloc(BITS2BYTES(bits), FRAME_ATOMIC);
    7074                if (!newmap)
    7175                        return ENOMEM;
    7276               
    73                 bitmap_t oldiomap;
    7477                bitmap_initialize(&oldiomap, task->arch.iomap.map,
    7578                    task->arch.iomap.bits);
     
    112115 *
    113116 * Interrupts must be disabled prior this call.
    114  *
    115117 */
    116118void io_perm_bitmap_install(void)
    117119{
     120        size_t bits;
     121        ptr_16_64_t cpugdtr;
     122        descriptor_t *gdt_p;
     123        tss_descriptor_t *tss_desc;
     124        size_t ver;
     125       
    118126        /* First, copy the I/O Permission Bitmap. */
    119         irq_spinlock_lock(&TASK->lock, false);
    120         size_t ver = TASK->arch.iomapver;
    121         size_t bits = TASK->arch.iomap.bits;
    122         if (bits) {
     127        spinlock_lock(&TASK->lock);
     128        ver = TASK->arch.iomapver;
     129        if ((bits = TASK->arch.iomap.bits)) {
     130                bitmap_t iomap;
     131       
    123132                ASSERT(TASK->arch.iomap.map);
    124                
    125                 bitmap_t iomap;
    126133                bitmap_initialize(&iomap, CPU->arch.tss->iomap,
    127134                    TSS_IOMAP_SIZE * 8);
    128135                bitmap_copy(&iomap, &TASK->arch.iomap, TASK->arch.iomap.bits);
    129                
    130136                /*
    131137                 * It is safe to set the trailing eight bits because of the
     
    134140                bitmap_set_range(&iomap, ALIGN_UP(TASK->arch.iomap.bits, 8), 8);
    135141        }
    136         irq_spinlock_unlock(&TASK->lock, false);
     142        spinlock_unlock(&TASK->lock);
    137143       
    138144        /*
     
    140146         * Take the extra ending byte will all bits set into account.
    141147         */
    142         ptr_16_64_t cpugdtr;
    143148        gdtr_store(&cpugdtr);
    144        
    145         descriptor_t *gdt_p = (descriptor_t *) cpugdtr.base;
     149        gdt_p = (descriptor_t *) cpugdtr.base;
    146150        gdt_tss_setlimit(&gdt_p[TSS_DES], TSS_BASIC_SIZE + BITS2BYTES(bits));
    147151        gdtr_load(&cpugdtr);
     
    151155         * type must be changed to describe inactive TSS.
    152156         */
    153         tss_descriptor_t *tss_desc = (tss_descriptor_t *) &gdt_p[TSS_DES];
     157        tss_desc = (tss_descriptor_t *) &gdt_p[TSS_DES];
    154158        tss_desc->type = AR_TSS;
    155         tr_load(GDT_SELECTOR(TSS_DES));
     159        tr_load(gdtselector(TSS_DES));
    156160       
    157161        /*
Note: See TracChangeset for help on using the changeset viewer.