Changeset 9fa16b20 in mainline
- Timestamp:
- 2006-04-17T15:45:38Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 73e9b49
- Parents:
- 97a7eff
- Location:
- arch
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/amd64/include/pm.h
r97a7eff r9fa16b20 68 68 69 69 #define TSS_BASIC_SIZE 104 70 #define TSS_IOMAP_SIZE (16*1024+1) /* 16K for bitmap + 1 terminating byte for convenience */ 70 71 71 72 #ifndef __ASM__ … … 145 146 __u16 reserve4; 146 147 __u16 iomap_base; 147 __u8 iomap[ 0x10000 + 1]; /* 64K + 1 terminating byte */148 __u8 iomap[TSS_IOMAP_SIZE]; 148 149 } __attribute__ ((packed)); 149 150 typedef struct tss tss_t; -
arch/amd64/include/proc/task.h
r97a7eff r9fa16b20 32 32 #include <typedefs.h> 33 33 #include <arch/types.h> 34 #include <adt/bitmap.h> 34 35 35 36 typedef struct { 36 count_t iomap_size; 37 __u8 *iomap; 37 bitmap_t iomap; 38 38 } task_arch_t; 39 39 -
arch/amd64/src/proc/scheduler.c
r97a7eff r9fa16b20 37 37 #include <print.h> 38 38 #include <arch/pm.h> 39 #include <adt/bitmap.h> 39 40 40 41 /** Perform amd64 specific tasks needed before the new task is run. … … 44 45 void before_task_runs_arch(void) 45 46 { 46 size_t iomap_size;47 count_t bits; 47 48 ptr_16_64_t cpugdtr; 48 49 descriptor_t *gdt_p; … … 54 55 /* First, copy the I/O Permission Bitmap. */ 55 56 spinlock_lock(&TASK->lock); 56 iomap_size = TASK->arch.iomap_size; 57 if (iomap_size) { 58 ASSERT(TASK->arch.iomap); 59 memcpy(CPU->arch.tss->iomap, TASK->arch.iomap, iomap_size); 60 CPU->arch.tss->iomap[iomap_size] = 0xff; /* terminating byte */ 57 if ((bits = TASK->arch.iomap.bits)) { 58 bitmap_t iomap; 59 60 ASSERT(TASK->arch.iomap.map); 61 bitmap_initialize(&iomap, CPU->arch.tss->iomap, TSS_IOMAP_SIZE * 8); 62 bitmap_copy(&iomap, &TASK->arch.iomap, TASK->arch.iomap.bits); 63 /* 64 * It is safe to set the trailing four bits because of the extra 65 * convenience byte in TSS_IOMAP_SIZE. 66 */ 67 bitmap_set_range(&iomap, TASK->arch.iomap.bits, 4); 61 68 } 62 69 spinlock_unlock(&TASK->lock); … … 65 72 gdtr_store(&cpugdtr); 66 73 gdt_p = (descriptor_t *) cpugdtr.base; 67 gdt_tss_setlimit(&gdt_p[TSS_DES], TSS_BASIC_SIZE + iomap_size- 1);74 gdt_tss_setlimit(&gdt_p[TSS_DES], TSS_BASIC_SIZE + BITS2BYTES(bits) - 1); 68 75 gdtr_load(&cpugdtr); 69 76 } -
arch/amd64/src/proc/task.c
r97a7eff r9fa16b20 36 36 void task_create_arch(task_t *t) 37 37 { 38 t->arch.iomap = NULL; 39 t->arch.iomap_size = 0; 38 bitmap_initialize(&t->arch.iomap, NULL, 0); 40 39 } -
arch/ia32/include/pm.h
r97a7eff r9fa16b20 57 57 58 58 #define TSS_BASIC_SIZE 104 59 #define TSS_IOMAP_SIZE (16*1024+1) /* 16K for bitmap + 1 terminating byte for convenience */ 59 60 60 61 #ifndef __ASM__ … … 132 133 unsigned : 16; 133 134 __u16 iomap_base; 134 __u8 iomap[ 0x10000+1]; /* 64K + 1 terminating byte */135 __u8 iomap[TSS_IOMAP_SIZE]; 135 136 } __attribute__ ((packed)); 136 137 typedef struct tss tss_t; -
arch/ia32/include/proc/task.h
r97a7eff r9fa16b20 32 32 #include <typedefs.h> 33 33 #include <arch/types.h> 34 #include <adt/bitmap.h> 34 35 35 36 typedef struct { 36 count_t iomap_size; 37 __u8 *iomap; 37 bitmap_t iomap; 38 38 } task_arch_t; 39 39 -
arch/ia32/src/proc/scheduler.c
r97a7eff r9fa16b20 36 36 #include <arch/pm.h> 37 37 #include <arch/asm.h> 38 #include <adt/bitmap.h> 38 39 39 40 /** Perform ia32 specific tasks needed before the new task is run. … … 43 44 void before_task_runs_arch(void) 44 45 { 45 size_t iomap_size;46 count_t bits; 46 47 ptr_16_32_t cpugdtr; 47 48 descriptor_t *gdt_p; … … 53 54 /* First, copy the I/O Permission Bitmap. */ 54 55 spinlock_lock(&TASK->lock); 55 iomap_size = TASK->arch.iomap_size; 56 if (iomap_size) { 57 ASSERT(TASK->arch.iomap); 58 memcpy(CPU->arch.tss->iomap, TASK->arch.iomap, iomap_size); 59 CPU->arch.tss->iomap[iomap_size] = 0xff; /* terminating byte */ 56 if ((bits = TASK->arch.iomap.bits)) { 57 bitmap_t iomap; 58 59 ASSERT(TASK->arch.iomap.map); 60 bitmap_initialize(&iomap, CPU->arch.tss->iomap, TSS_IOMAP_SIZE * 8); 61 bitmap_copy(&iomap, &TASK->arch.iomap, TASK->arch.iomap.bits); 62 /* 63 * It is safe to set the trailing four bits because of the extra 64 * convenience byte in TSS_IOMAP_SIZE. 65 */ 66 bitmap_set_range(&iomap, TASK->arch.iomap.bits, 4); 60 67 } 61 spinlock_unlock(&TASK->lock); 68 spinlock_unlock(&TASK->lock); 62 69 63 70 /* Second, adjust TSS segment limit. */ 64 71 gdtr_store(&cpugdtr); 65 72 gdt_p = (descriptor_t *) cpugdtr.base; 66 gdt_setlimit(&gdt_p[TSS_DES], TSS_BASIC_SIZE + iomap_size- 1);73 gdt_setlimit(&gdt_p[TSS_DES], TSS_BASIC_SIZE + BITS2BYTES(bits) - 1); 67 74 gdtr_load(&cpugdtr); 68 75 } -
arch/ia32/src/proc/task.c
r97a7eff r9fa16b20 29 29 #include <proc/task.h> 30 30 #include <arch/types.h> 31 #include <adt/bitmap.h> 31 32 32 33 /** Perform ia32 specific task initialization. … … 36 37 void task_create_arch(task_t *t) 37 38 { 38 t->arch.iomap = NULL; 39 t->arch.iomap_size = 0; 39 bitmap_initialize(&t->arch.iomap, NULL, 0); 40 40 }
Note:
See TracChangeset
for help on using the changeset viewer.