Rev 2441 | Rev 4125 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2441 | Rev 2630 | ||
|---|---|---|---|
| Line 73... | Line 73... | ||
| 73 | 73 | ||
| 74 | newmap = (uint8_t *) malloc(BITS2BYTES(bits), FRAME_ATOMIC); |
74 | newmap = (uint8_t *) malloc(BITS2BYTES(bits), FRAME_ATOMIC); |
| 75 | if (!newmap) |
75 | if (!newmap) |
| 76 | return ENOMEM; |
76 | return ENOMEM; |
| 77 | 77 | ||
| 78 | bitmap_initialize(&oldiomap, task->arch.iomap.map, task->arch.iomap.bits); |
78 | bitmap_initialize(&oldiomap, task->arch.iomap.map, |
| - | 79 | task->arch.iomap.bits); |
|
| 79 | bitmap_initialize(&task->arch.iomap, newmap, bits); |
80 | bitmap_initialize(&task->arch.iomap, newmap, bits); |
| 80 | 81 | ||
| 81 | /* |
82 | /* |
| 82 | * Mark the new range inaccessible. |
83 | * Mark the new range inaccessible. |
| 83 | */ |
84 | */ |
| 84 | bitmap_set_range(&task->arch.iomap, oldiomap.bits, bits - oldiomap.bits); |
85 | bitmap_set_range(&task->arch.iomap, oldiomap.bits, |
| - | 86 | bits - oldiomap.bits); |
|
| 85 | 87 | ||
| 86 | /* |
88 | /* |
| 87 | * In case there really existed smaller iomap, |
89 | * In case there really existed smaller iomap, |
| 88 | * copy its contents and deallocate it. |
90 | * copy its contents and deallocate it. |
| 89 | */ |
91 | */ |
| 90 | if (oldiomap.bits) { |
92 | if (oldiomap.bits) { |
| 91 | bitmap_copy(&task->arch.iomap, &oldiomap, oldiomap.bits); |
93 | bitmap_copy(&task->arch.iomap, &oldiomap, |
| - | 94 | oldiomap.bits); |
|
| 92 | free(oldiomap.map); |
95 | free(oldiomap.map); |
| 93 | } |
96 | } |
| 94 | } |
97 | } |
| 95 | 98 | ||
| 96 | /* |
99 | /* |
| Line 126... | Line 129... | ||
| 126 | if ((bits = TASK->arch.iomap.bits)) { |
129 | if ((bits = TASK->arch.iomap.bits)) { |
| 127 | bitmap_t iomap; |
130 | bitmap_t iomap; |
| 128 | task_t *task = TASK; |
131 | task_t *task = TASK; |
| 129 | 132 | ||
| 130 | ASSERT(TASK->arch.iomap.map); |
133 | ASSERT(TASK->arch.iomap.map); |
| 131 | bitmap_initialize(&iomap, CPU->arch.tss->iomap, TSS_IOMAP_SIZE * 8); |
134 | bitmap_initialize(&iomap, CPU->arch.tss->iomap, |
| - | 135 | TSS_IOMAP_SIZE * 8); |
|
| 132 | bitmap_copy(&iomap, &task->arch.iomap, task->arch.iomap.bits); |
136 | bitmap_copy(&iomap, &task->arch.iomap, task->arch.iomap.bits); |
| 133 | /* |
137 | /* |
| 134 | * It is safe to set the trailing eight bits because of the extra |
138 | * It is safe to set the trailing eight bits because of the |
| 135 | * convenience byte in TSS_IOMAP_SIZE. |
139 | * extra convenience byte in TSS_IOMAP_SIZE. |
| 136 | */ |
140 | */ |
| 137 | bitmap_set_range(&iomap, ALIGN_UP(TASK->arch.iomap.bits, 8), 8); |
141 | bitmap_set_range(&iomap, ALIGN_UP(TASK->arch.iomap.bits, 8), 8); |
| 138 | } |
142 | } |
| 139 | spinlock_unlock(&TASK->lock); |
143 | spinlock_unlock(&TASK->lock); |
| 140 | 144 | ||