- Timestamp:
- 04/03/09 19:01:48 (3 years ago)
- Files:
-
- 1 modified
-
Whitix/trunk/arch/i386/kernel/process.c (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
-
Whitix/trunk/arch/i386/kernel/process.c
r1842 r2038 36 36 struct TSS* tss=(struct TSS*)TSS_ADDR; 37 37 38 /* Interrupts are already disabled when calling this function */ 39 38 40 struct Thread* ThrArchSwitch(struct Thread* prev, struct Thread* next) 39 41 { 40 DWORD flags;41 42 42 if (lastMathThread != next) 43 43 SetCr0(GetCr0() | 8); 44 45 IrqSaveFlags(flags);46 44 47 45 /* Copy over the new TLS for the thread. See boot/multiboot.S for the … … 50 48 51 49 tss->esp0=(next->currStack & ~(ARCH_STACK_SIZE-1))+ARCH_STACK_SIZE; 52 i386ContextSwitch(prev,next); 53 54 IrqRestoreFlags(flags); 50 51 i386ContextSwitch(prev, next); 55 52 56 53 return prev; … … 75 72 } 76 73 77 /* 512k stack. */78 #define I386_STACK_LENGTH 512*102474 /* 256k stack. */ 75 #define I386_STACK_LENGTH 256*1024 79 76 80 77 void ThrArchSetupUserStack(struct Thread* ret, DWORD* stackP, void* argument) … … 85 82 if (!*stackP) 86 83 /* Allocate own user stack. Used for when it doesn't really matter. */ 87 *stackP=MMapDo(ret->parent, NULL, 0, I386_STACK_LENGTH, PAGE_RW | PAGE_PRESENT | PAGE_USER, 0, MMAP_PRIVATE, NULL) +I386_STACK_LENGTH;84 *stackP=MMapDo(ret->parent, NULL, 0, I386_STACK_LENGTH, PAGE_RW | PAGE_PRESENT | PAGE_USER, 0, MMAP_PRIVATE, NULL) + I386_STACK_LENGTH; 88 85 89 86 ret->esp3=*stackP; /* User stack */ 90 87 91 88 IrqSaveFlags(flags); 89 92 90 VirtSetCurrent(ret->parent->memManager); 93 91 … … 113 111 /* Allocate the kernel stack. */ 114 112 ret->currStack=(DWORD)MemAlloc(ARCH_STACK_SIZE); 115 ret->currStack +=ARCH_STACK_SIZE;113 ret->currStack += ARCH_STACK_SIZE; 116 114 117 115 ret->entry=entry; /* eip */ … … 133 131 *--currP=(user) ? (DWORD)ThrArchEnterUser : entry; 134 132 133 /* EFLAGS, important for kernel threads. */ 134 *--currP = 0x202; 135 135 136 /* Zero all the general purpose registers - simulate a pusha. */ 136 137 for (i=0; i<8; i++) … … 157 158 #define PROCESS_STACK_LENGTH 100 158 159 159 void ThrArchPrintStack(DWORD* esp) 160 struct StackFrame 161 { 162 struct StackFrame* nextFrame; 163 DWORD retAddr; 164 }; 165 166 void ThrArchPrintStack(DWORD* ebp) 160 167 { 161 168 int i; 169 struct StackFrame* curr = (struct StackFrame*)ebp; 162 170 163 171 KePrint(KERN_ERROR "Stack trace:\n"); 164 for (i=0; i< PROCESS_STACK_LENGTH; i++,esp++)172 for (i=0; i<10; i++) 165 173 { 166 if (*esp > (DWORD)code && *esp < (DWORD)endCode) 167 { 168 SymbolPrint(*esp); 169 }else if (*esp > 0xD8000000 && *esp < 0xE0000000) 170 ModuleSymbolPrint(*esp); 174 DWORD retAddr = curr->retAddr; 175 176 curr = curr->nextFrame; 177 178 if (!curr) 179 break; 180 181 if (retAddr > (DWORD)code && retAddr < (DWORD)endCode) 182 SymbolPrint(retAddr); 183 else if (retAddr > 0xD8000000 && retAddr < 0xE0000000) 184 ModuleSymbolPrint(retAddr); 171 185 } 172 186 } … … 174 188 void ThrArchPrintCurrStack() 175 189 { 176 DWORD* currE sp;177 178 asm volatile("mov %%e sp, %%eax" : "=a"(currEsp));179 180 ThrArchPrintStack(currE sp);190 DWORD* currEbp; 191 192 asm volatile("mov %%ebp, %%eax" : "=a"(currEbp)); 193 194 ThrArchPrintStack(currEbp); 181 195 } 182 196 183 197 SYMBOL_EXPORT(ThrArchPrintCurrStack); 198 199 static int crashing = 0; 184 200 185 201 void ThrArchPrintContext(struct Context* curr) … … 187 203 DWORD flags; 188 204 DWORD* esp; 205 206 if (crashing) 207 MachineHalt(); 189 208 190 209 IrqSaveFlags(flags); … … 193 212 esp=(DWORD*)curr->esp3; 194 213 else 214 { 215 crashing = 1; 195 216 esp=(DWORD*)curr->esp0; 217 } 196 218 197 219 KePrint("Thread context:\n"); … … 204 226 if (current) 205 227 KePrint("process id = %u process name = %s\n",current->pid,ThrGetProcName(current->pid)); 206 228 207 229 if (!(curr->cs & 0x3)) 208 230 ThrArchPrintStack(esp);
