Changeset 39cea6a in mainline for arch/amd64/src
- Timestamp:
- 2006-04-13T17:38:03Z (20 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- e185136
- Parents:
- 897ad60
- Location:
- arch/amd64/src
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/amd64/src/cpu/cpu.c
r897ad60 r39cea6a 119 119 { 120 120 CPU->arch.tss = tss_p; 121 CPU->fpu_owner=NULL; 121 CPU->arch.tss->iomap_base = &CPU->arch.tss->iomap[0] - ((__u8 *) CPU->arch.tss); 122 CPU->fpu_owner = NULL; 122 123 } 123 124 124 125 125 void cpu_identify(void) -
arch/amd64/src/pm.c
r897ad60 r39cea6a 47 47 */ 48 48 49 struct descriptorgdt[GDT_ITEMS] = {49 descriptor_t gdt[GDT_ITEMS] = { 50 50 /* NULL descriptor */ 51 51 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, … … 111 111 }; 112 112 113 struct idescriptoridt[IDT_ITEMS];114 115 struct ptr_16_64gdtr = {.limit = sizeof(gdt), .base= (__u64) gdt };116 struct ptr_16_64idtr = {.limit = sizeof(idt), .base= (__u64) idt };117 118 static struct tsstss;119 struct tss*tss_p = NULL;120 121 void gdt_tss_setbase( struct descriptor*d, __address base)122 { 123 struct tss_descriptor *td = (struct tss_descriptor*) d;113 idescriptor_t idt[IDT_ITEMS]; 114 115 ptr_16_64_t gdtr = {.limit = sizeof(gdt), .base= (__u64) gdt }; 116 ptr_16_64_t idtr = {.limit = sizeof(idt), .base= (__u64) idt }; 117 118 static tss_t tss; 119 tss_t *tss_p = NULL; 120 121 void gdt_tss_setbase(descriptor_t *d, __address base) 122 { 123 tss_descriptor_t *td = (tss_descriptor_t *) d; 124 124 125 125 td->base_0_15 = base & 0xffff; … … 129 129 } 130 130 131 void gdt_tss_setlimit( struct descriptor*d, __u32 limit)132 { 133 struct tss_descriptor *td = ( struct tss_descriptor*) d;131 void gdt_tss_setlimit(descriptor_t *d, __u32 limit) 132 { 133 struct tss_descriptor *td = (tss_descriptor_t *) d; 134 134 135 135 td->limit_0_15 = limit & 0xffff; … … 137 137 } 138 138 139 void idt_setoffset( struct idescriptor*d, __address offset)139 void idt_setoffset(idescriptor_t *d, __address offset) 140 140 { 141 141 /* … … 147 147 } 148 148 149 void tss_initialize( struct tss*t)150 { 151 memsetb((__address) t, sizeof( struct tss), 0);149 void tss_initialize(tss_t *t) 150 { 151 memsetb((__address) t, sizeof(tss_t), 0); 152 152 } 153 153 … … 157 157 void idt_init(void) 158 158 { 159 struct idescriptor*d;159 idescriptor_t *d; 160 160 int i; 161 161 … … 184 184 void pm_init(void) 185 185 { 186 struct descriptor*gdt_p = (struct descriptor *) gdtr.base;187 struct tss_descriptor*tss_desc;186 descriptor_t *gdt_p = (struct descriptor *) gdtr.base; 187 tss_descriptor_t *tss_desc; 188 188 189 189 /* … … 201 201 } 202 202 else { 203 tss_p = (struct tss *) malloc(sizeof( struct tss),FRAME_ATOMIC);203 tss_p = (struct tss *) malloc(sizeof(tss_t), FRAME_ATOMIC); 204 204 if (!tss_p) 205 205 panic("could not allocate TSS\n"); … … 208 208 tss_initialize(tss_p); 209 209 210 tss_desc = ( struct tss_descriptor*) (&gdt_p[TSS_DES]);210 tss_desc = (tss_descriptor_t *) (&gdt_p[TSS_DES]); 211 211 tss_desc->present = 1; 212 212 tss_desc->type = AR_TSS; … … 214 214 215 215 gdt_tss_setbase(&gdt_p[TSS_DES], (__address) tss_p); 216 gdt_tss_setlimit(&gdt_p[TSS_DES], sizeof( struct tss) - 1);216 gdt_tss_setlimit(&gdt_p[TSS_DES], sizeof(tss_t) - 1); 217 217 218 218 gdtr_load(&gdtr); -
arch/amd64/src/proc/scheduler.c
r897ad60 r39cea6a 29 29 #include <proc/scheduler.h> 30 30 #include <cpu.h> 31 #include <proc/task.h> 31 32 #include <proc/thread.h> 32 33 #include <arch.h> … … 35 36 #include <arch/debugger.h> 36 37 #include <print.h> 38 #include <arch/pm.h> 37 39 40 /** Perform amd64 specific tasks needed before the new task is run. */ 41 void before_task_runs_arch(void) 42 { 43 } 44 45 /** Perform amd64 specific tasks needed before the new thread is scheduled. */ 38 46 void before_thread_runs_arch(void) 39 47 { 48 size_t iomap_size; 49 ptr_16_64_t cpugdtr; 50 descriptor_t *gdt_p; 51 40 52 CPU->arch.tss->rsp0 = (__address) &THREAD->kstack[THREAD_STACK_SIZE-SP_DELTA]; 41 53 … … 43 55 * hidden part of gs */ 44 56 swapgs(); 45 write_msr(AMD_MSR_GS, 46 (__u64)&THREAD->kstack); 57 write_msr(AMD_MSR_GS, (__u64)&THREAD->kstack); 47 58 swapgs(); 48 59 49 60 /* TLS support - set FS to thread local storage */ 50 61 write_msr(AMD_MSR_FS, THREAD->arch.tls); 62 63 /* 64 * Switch the I/O Permission Bitmap, if necessary. 65 * 66 * First, copy the I/O Permission Bitmap. 67 * This needs to be changed so that the 68 * copying is avoided if the same task 69 * was already running and the iomap did 70 * not change. 71 */ 72 spinlock_lock(&TASK->lock); 73 iomap_size = TASK->arch.iomap_size; 74 if (iomap_size) { 75 ASSERT(TASK->arch.iomap); 76 memcpy(CPU->arch.tss->iomap, TASK->arch.iomap, iomap_size); 77 CPU->arch.tss->iomap[iomap_size] = 0xff; /* terminating byte */ 78 } 79 spinlock_unlock(&TASK->lock); 80 81 /* Second, adjust TSS segment limit. */ 82 gdtr_store(&cpugdtr); 83 gdt_p = (descriptor_t *) cpugdtr.base; 84 gdt_tss_setlimit(&gdt_p[TSS_DES], TSS_BASIC_SIZE + iomap_size - 1); 85 gdtr_load(&cpugdtr); 51 86 52 87 #ifdef CONFIG_DEBUG_AS_WATCHPOINT
Note:
See TracChangeset
for help on using the changeset viewer.
