Subversion Repositories HelenOS-historic

Rev

Rev 1191 | Rev 1212 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1191 Rev 1203
Line 28... Line 28...
28
 
28
 
29
#include <ddi/ddi.h>
29
#include <ddi/ddi.h>
30
#include <proc/task.h>
30
#include <proc/task.h>
31
#include <arch/types.h>
31
#include <arch/types.h>
32
#include <typedefs.h>
32
#include <typedefs.h>
-
 
33
#include <adt/bitmap.h>
-
 
34
#include <mm/slab.h>
-
 
35
#include <arch/pm.h>
-
 
36
#include <errno.h>
33
 
37
 
34
/** Enable I/O space range for task.
38
/** Enable I/O space range for task.
35
 *
39
 *
36
 * Interrupts are disabled and task is locked.
40
 * Interrupts are disabled and task is locked.
37
 *
41
 *
Line 41... Line 45...
41
 *
45
 *
42
 * @return 0 on success or an error code from errno.h.
46
 * @return 0 on success or an error code from errno.h.
43
 */
47
 */
44
int ddi_enable_iospace_arch(task_t *task, __address ioaddr, size_t size)
48
int ddi_enable_iospace_arch(task_t *task, __address ioaddr, size_t size)
45
{
49
{
-
 
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
 
46
    return 0;
91
    return 0;
47
}
92
}