Changeset 2038 for Whitix

Show
Ignore:
Timestamp:
04/03/09 19:01:48 (3 years ago)
Author:
mwhitworth
Message:

No need to disable interrupts in ThrArchSwitch (already disabled in ThrSchedule), only try to trace stack once.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • Whitix/trunk/arch/i386/kernel/process.c

    r1842 r2038  
    3636struct TSS* tss=(struct TSS*)TSS_ADDR; 
    3737 
     38/* Interrupts are already disabled when calling this function */ 
     39 
    3840struct Thread* ThrArchSwitch(struct Thread* prev, struct Thread* next) 
    3941{ 
    40         DWORD flags; 
    41  
    4242        if (lastMathThread != next) 
    4343                SetCr0(GetCr0() | 8); 
    44  
    45         IrqSaveFlags(flags); 
    4644 
    4745        /* Copy over the new TLS for the thread. See boot/multiboot.S for the 
     
    5048         
    5149        tss->esp0=(next->currStack & ~(ARCH_STACK_SIZE-1))+ARCH_STACK_SIZE; 
    52         i386ContextSwitch(prev,next); 
    53  
    54         IrqRestoreFlags(flags); 
     50         
     51        i386ContextSwitch(prev, next); 
    5552 
    5653        return prev; 
     
    7572} 
    7673 
    77 /* 512k stack. */ 
    78 #define I386_STACK_LENGTH 512*1024 
     74/* 256k stack. */ 
     75#define I386_STACK_LENGTH 256*1024 
    7976 
    8077void ThrArchSetupUserStack(struct Thread* ret, DWORD* stackP, void* argument) 
     
    8582        if (!*stackP) 
    8683                /* 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; 
    8885 
    8986        ret->esp3=*stackP; /* User stack */ 
    9087 
    9188        IrqSaveFlags(flags); 
     89 
    9290        VirtSetCurrent(ret->parent->memManager); 
    9391 
     
    113111        /* Allocate the kernel stack. */ 
    114112        ret->currStack=(DWORD)MemAlloc(ARCH_STACK_SIZE); 
    115         ret->currStack+=ARCH_STACK_SIZE; 
     113        ret->currStack += ARCH_STACK_SIZE; 
    116114         
    117115        ret->entry=entry; /* eip */ 
     
    133131        *--currP=(user) ? (DWORD)ThrArchEnterUser : entry; 
    134132 
     133        /* EFLAGS, important for kernel threads. */ 
     134        *--currP = 0x202; 
     135 
    135136        /* Zero all the general purpose registers - simulate a pusha. */ 
    136137        for (i=0; i<8; i++) 
     
    157158#define PROCESS_STACK_LENGTH    100 
    158159 
    159 void ThrArchPrintStack(DWORD* esp) 
     160struct StackFrame 
     161{ 
     162        struct StackFrame* nextFrame; 
     163        DWORD retAddr; 
     164}; 
     165 
     166void ThrArchPrintStack(DWORD* ebp) 
    160167{ 
    161168        int i; 
     169        struct StackFrame* curr = (struct StackFrame*)ebp; 
    162170         
    163171        KePrint(KERN_ERROR "Stack trace:\n"); 
    164         for (i=0; i< PROCESS_STACK_LENGTH; i++,esp++) 
     172        for (i=0; i<10; i++) 
    165173        { 
    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); 
    171185        } 
    172186} 
     
    174188void ThrArchPrintCurrStack() 
    175189{ 
    176         DWORD* currEsp; 
    177          
    178         asm volatile("mov %%esp, %%eax" : "=a"(currEsp)); 
    179          
    180         ThrArchPrintStack(currEsp); 
     190        DWORD* currEbp; 
     191         
     192        asm volatile("mov %%ebp, %%eax" : "=a"(currEbp)); 
     193         
     194        ThrArchPrintStack(currEbp); 
    181195} 
    182196 
    183197SYMBOL_EXPORT(ThrArchPrintCurrStack); 
     198 
     199static int crashing = 0; 
    184200 
    185201void ThrArchPrintContext(struct Context* curr) 
     
    187203        DWORD flags; 
    188204        DWORD* esp; 
     205 
     206        if (crashing) 
     207                MachineHalt(); 
    189208 
    190209        IrqSaveFlags(flags); 
     
    193212                esp=(DWORD*)curr->esp3; 
    194213        else 
     214        { 
     215                crashing = 1; 
    195216                esp=(DWORD*)curr->esp0; 
     217        } 
    196218 
    197219        KePrint("Thread context:\n"); 
     
    204226        if (current) 
    205227                KePrint("process id = %u process name = %s\n",current->pid,ThrGetProcName(current->pid)); 
    206  
     228         
    207229        if (!(curr->cs & 0x3)) 
    208230                ThrArchPrintStack(esp);