Changeset 73e9b49 in mainline


Ignore:
Timestamp:
2006-04-17T16:24:04Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
17b1b99
Parents:
9fa16b20
Message:

Full implementation of amd64 and ia32 SYS_ENABLE_IOSPACE syscall.
Needs testing.

Location:
arch
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • arch/amd64/include/pm.h

    r9fa16b20 r73e9b49  
    6969#define TSS_BASIC_SIZE  104
    7070#define TSS_IOMAP_SIZE  (16*1024+1)     /* 16K for bitmap + 1 terminating byte for convenience */
     71
     72#define IO_PORTS        (64*1024)
    7173
    7274#ifndef __ASM__
  • arch/amd64/src/ddi/ddi.c

    r9fa16b20 r73e9b49  
    3131#include <arch/types.h>
    3232#include <typedefs.h>
     33#include <adt/bitmap.h>
     34#include <mm/slab.h>
     35#include <arch/pm.h>
     36#include <errno.h>
    3337
    3438/** Enable I/O space range for task.
     
    4448int ddi_enable_iospace_arch(task_t *task, __address ioaddr, size_t size)
    4549{
     50        count_t bits;
     51
     52        bits = ioaddr + size;
     53        if (bits > IO_PORTS)
     54                return ENOENT;
     55
     56        if (task->arch.iomap.bits < bits) {
     57                bitmap_t oldiomap;
     58                __u8 *newmap;
     59       
     60                /*
     61                 * The I/O permission bitmap is too small and needs to be grown.
     62                 */
     63               
     64                newmap = (__u8 *) malloc(BITS2BYTES(bits), FRAME_ATOMIC);
     65                if (!newmap)
     66                        return ENOMEM;
     67               
     68                bitmap_initialize(&oldiomap, task->arch.iomap.map, task->arch.iomap.bits);
     69                bitmap_initialize(&task->arch.iomap, newmap, bits);
     70
     71                /*
     72                 * Mark the new range inaccessible.
     73                 */
     74                bitmap_set_range(&task->arch.iomap, oldiomap.bits, bits - oldiomap.bits);
     75
     76                /*
     77                 * In case there really existed smaller iomap,
     78                 * copy its contents and deallocate it.
     79                 */             
     80                if (oldiomap.bits) {
     81                        bitmap_copy(&task->arch.iomap, &oldiomap, task->arch.iomap.bits);
     82                        free(oldiomap.map);
     83                }
     84        }
     85
     86        /*
     87         * Enable the range and we are done.
     88         */
     89        bitmap_clear_range(&task->arch.iomap, (index_t) ioaddr, (count_t) size);
     90
    4691        return 0;
    4792}
  • arch/ia32/include/pm.h

    r9fa16b20 r73e9b49  
    5858#define TSS_BASIC_SIZE  104
    5959#define TSS_IOMAP_SIZE  (16*1024+1)     /* 16K for bitmap + 1 terminating byte for convenience */
     60
     61#define IO_PORTS        (64*1024)
    6062
    6163#ifndef __ASM__
  • arch/ia32/src/ddi/ddi.c

    r9fa16b20 r73e9b49  
    3131#include <arch/types.h>
    3232#include <typedefs.h>
     33#include <adt/bitmap.h>
     34#include <mm/slab.h>
     35#include <arch/pm.h>
     36#include <errno.h>
    3337
    3438/** Enable I/O space range for task.
     
    4448int ddi_enable_iospace_arch(task_t *task, __address ioaddr, size_t size)
    4549{
     50        count_t bits;
     51
     52        bits = ioaddr + size;
     53        if (bits > IO_PORTS)
     54                return ENOENT;
     55
     56        if (task->arch.iomap.bits < bits) {
     57                bitmap_t oldiomap;
     58                __u8 *newmap;
     59       
     60                /*
     61                 * The I/O permission bitmap is too small and needs to be grown.
     62                 */
     63               
     64                newmap = (__u8 *) malloc(BITS2BYTES(bits), FRAME_ATOMIC);
     65                if (!newmap)
     66                        return ENOMEM;
     67               
     68                bitmap_initialize(&oldiomap, task->arch.iomap.map, task->arch.iomap.bits);
     69                bitmap_initialize(&task->arch.iomap, newmap, bits);
     70
     71                /*
     72                 * Mark the new range inaccessible.
     73                 */
     74                bitmap_set_range(&task->arch.iomap, oldiomap.bits, bits - oldiomap.bits);
     75
     76                /*
     77                 * In case there really existed smaller iomap,
     78                 * copy its contents and deallocate it.
     79                 */             
     80                if (oldiomap.bits) {
     81                        bitmap_copy(&task->arch.iomap, &oldiomap, task->arch.iomap.bits);
     82                        free(oldiomap.map);
     83                }
     84        }
     85
     86        /*
     87         * Enable the range and we are done.
     88         */
     89        bitmap_clear_range(&task->arch.iomap, (index_t) ioaddr, (count_t) size);
     90
    4691        return 0;
    4792}
Note: See TracChangeset for help on using the changeset viewer.