Changeset 39cea6a in mainline for arch/amd64
- 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
- Files:
-
- 4 edited
-
include/pm.h (modified) (8 diffs)
-
src/cpu/cpu.c (modified) (1 diff)
-
src/pm.c (modified) (10 diffs)
-
src/proc/scheduler.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
arch/amd64/include/pm.h
r897ad60 r39cea6a 67 67 #define DPL_USER (PL_USER<<5) 68 68 69 #define IO_MAP_BASE (104)69 #define TSS_BASIC_SIZE 104 70 70 71 71 #ifndef __ASM__ … … 83 83 unsigned base_24_31: 8; 84 84 } __attribute__ ((packed)); 85 typedef struct descriptor descriptor_t; 85 86 86 87 struct tss_descriptor { … … 89 90 unsigned base_16_23: 8; 90 91 unsigned type: 4; 91 unsigned : 1;92 unsigned : 1; 92 93 unsigned dpl : 2; 93 94 unsigned present : 1; … … 100 101 unsigned : 32; 101 102 } __attribute__ ((packed)); 103 typedef struct tss_descriptor tss_descriptor_t; 102 104 103 105 struct idescriptor { … … 113 115 unsigned : 32; 114 116 } __attribute__ ((packed)); 117 typedef struct idescriptor idescriptor_t; 115 118 116 119 struct ptr_16_64 { … … 118 121 __u64 base; 119 122 } __attribute__ ((packed)); 123 typedef struct ptr_16_64 ptr_16_64_t; 120 124 121 125 struct ptr_16_32 { … … 123 127 __u32 base; 124 128 } __attribute__ ((packed)); 129 typedef struct ptr_16_32 ptr_16_32_t; 125 130 126 131 struct tss { … … 142 147 __u8 iomap[0x10000 + 1]; /* 64K + 1 terminating byte */ 143 148 } __attribute__ ((packed)); 149 typedef struct tss tss_t; 144 150 145 extern struct tss*tss_p;151 extern tss_t *tss_p; 146 152 147 extern struct descriptorgdt[];148 extern struct idescriptoridt[];153 extern descriptor_t gdt[]; 154 extern idescriptor_t idt[]; 149 155 150 extern struct ptr_16_64gdtr;151 extern struct ptr_16_32bootstrap_gdtr;152 extern struct ptr_16_32protected_ap_gdtr;156 extern ptr_16_64_t gdtr; 157 extern ptr_16_32_t bootstrap_gdtr; 158 extern ptr_16_32_t protected_ap_gdtr; 153 159 154 160 extern void pm_init(void); 155 161 156 extern void gdt_tss_setbase( struct descriptor*d, __address base);157 extern void gdt_tss_setlimit( struct descriptor*d, __u32 limit);162 extern void gdt_tss_setbase(descriptor_t *d, __address base); 163 extern void gdt_tss_setlimit(descriptor_t *d, __u32 limit); 158 164 159 165 extern void idt_init(void); 160 extern void idt_setoffset( struct idescriptor*d, __address offset);166 extern void idt_setoffset(idescriptor_t *d, __address offset); 161 167 162 extern void tss_initialize( struct tss*t);168 extern void tss_initialize(tss_t *t); 163 169 164 170 #endif /* __ASM__ */ -
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.
