Changeset 2382d09 in mainline for arch/ia32/src/ddi/ddi.c


Ignore:
Timestamp:
2006-04-29T15:01:41Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
407862e
Parents:
69a5600
Message:

Improve SYS_IOSPACE_ENABLE support.
The general protection fault handler now contains
code to service early I/O Permission bitmap faults.

File:
1 edited

Legend:

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

    r69a5600 r2382d09  
    2828
    2929#include <ddi/ddi.h>
     30#include <arch/ddi/ddi.h>
    3031#include <proc/task.h>
    3132#include <arch/types.h>
     
    3637#include <errno.h>
    3738#include <arch/cpu.h>
     39#include <cpu.h>
     40#include <arch.h>
    3841
    3942/** Enable I/O space range for task.
     
    9093        bitmap_clear_range(&task->arch.iomap, (index_t) ioaddr, (count_t) size);
    9194
     95        /*
     96         * Increment I/O Permission bitmap generation counter.
     97         */
     98        task->arch.iomapver++;
     99
    92100        return 0;
    93101}
     
    106114        return 0;
    107115}
     116
     117/** Install I/O Permission bitmap.
     118 *
     119 * Current task's I/O permission bitmap, if any, is installed
     120 * in the current CPU's TSS.
     121 *
     122 * Interrupts must be disabled prior this call.
     123 */
     124void io_perm_bitmap_install(void)
     125{
     126        count_t bits;
     127        ptr_16_32_t cpugdtr;
     128        descriptor_t *gdt_p;
     129        count_t ver;
     130
     131        /* First, copy the I/O Permission Bitmap. */
     132        spinlock_lock(&TASK->lock);
     133        ver = TASK->arch.iomapver;
     134        if ((bits = TASK->arch.iomap.bits)) {
     135                bitmap_t iomap;
     136       
     137                ASSERT(TASK->arch.iomap.map);
     138                bitmap_initialize(&iomap, CPU->arch.tss->iomap, TSS_IOMAP_SIZE * 8);
     139                bitmap_copy(&iomap, &TASK->arch.iomap, TASK->arch.iomap.bits);
     140                /*
     141                 * It is safe to set the trailing eight bits because of the extra
     142                 * convenience byte in TSS_IOMAP_SIZE.
     143                 */
     144                bitmap_set_range(&iomap, TASK->arch.iomap.bits, 8);
     145        }
     146        spinlock_unlock(&TASK->lock);
     147
     148        /* Second, adjust TSS segment limit. */
     149        gdtr_store(&cpugdtr);
     150        gdt_p = (descriptor_t *) cpugdtr.base;
     151        gdt_setlimit(&gdt_p[TSS_DES], TSS_BASIC_SIZE + BITS2BYTES(bits) - 1);
     152        gdtr_load(&cpugdtr);
     153
     154        /*
     155         * Before we load new TSS limit, the current TSS descriptor
     156         * type must be changed to describe inactive TSS.
     157         */
     158        gdt_p[TSS_DES].access = AR_PRESENT | AR_TSS | DPL_KERNEL;
     159        tr_load(selector(TSS_DES));
     160       
     161        /*
     162         * Update the generation count so that faults caused by
     163         * early accesses can be serviced.
     164         */
     165        CPU->arch.iomapver_copy = ver;
     166}
Note: See TracChangeset for help on using the changeset viewer.