Changeset 2382d09 in mainline for arch/amd64/src/proc/scheduler.c
- Timestamp:
- 2006-04-29T15:01:41Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 407862e
- Parents:
- 69a5600
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/amd64/src/proc/scheduler.c
r69a5600 r2382d09 37 37 #include <print.h> 38 38 #include <arch/pm.h> 39 #include <a dt/bitmap.h>39 #include <arch/ddi/ddi.h> 40 40 41 41 /** Perform amd64 specific tasks needed before the new task is run. … … 45 45 void before_task_runs_arch(void) 46 46 { 47 count_t bits; 48 ptr_16_64_t cpugdtr; 49 descriptor_t *gdt_p; 50 tss_descriptor_t *tss_desc; 51 52 /* 53 * Switch the I/O Permission Bitmap, if necessary. 54 */ 55 56 /* First, copy the I/O Permission Bitmap. */ 57 spinlock_lock(&TASK->lock); 58 if ((bits = TASK->arch.iomap.bits)) { 59 bitmap_t iomap; 60 61 ASSERT(TASK->arch.iomap.map); 62 bitmap_initialize(&iomap, CPU->arch.tss->iomap, TSS_IOMAP_SIZE * 8); 63 bitmap_copy(&iomap, &TASK->arch.iomap, TASK->arch.iomap.bits); 64 /* 65 * It is safe to set the trailing eight bits because of the extra 66 * convenience byte in TSS_IOMAP_SIZE. 67 */ 68 bitmap_set_range(&iomap, TASK->arch.iomap.bits, 8); 69 } 70 spinlock_unlock(&TASK->lock); 71 72 /* Second, adjust TSS segment limit. */ 73 gdtr_store(&cpugdtr); 74 gdt_p = (descriptor_t *) cpugdtr.base; 75 gdt_tss_setlimit(&gdt_p[TSS_DES], TSS_BASIC_SIZE + BITS2BYTES(bits) - 1); 76 gdtr_load(&cpugdtr); 77 78 /* 79 * Before we load new TSS limit, the current TSS descriptor 80 * type must be changed to describe inactive TSS. 81 */ 82 tss_desc = (tss_descriptor_t *) &gdt_p[TSS_DES]; 83 tss_desc->type = AR_TSS; 84 tr_load(gdtselector(TSS_DES)); 47 io_perm_bitmap_install(); 85 48 } 86 49
Note:
See TracChangeset
for help on using the changeset viewer.