Show
Ignore:
Timestamp:
05/20/10 16:05:25 (2 years ago)
Author:
mwhitworth
Message:

Add to TCP/IP stack.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • Whitix/branches/netchannel/arch/i386/kernel/ints.c

    r2084 r2085  
    268268} 
    269269 
     270void IrqDoEvent(struct Context* curr) 
     271{ 
     272        if (curr->cs != 0x08) 
     273        { 
     274                PreemptDisable(); 
     275 
     276                DWORD* esp; 
     277 
     278                currThread->oldEip = curr->eip; 
     279                currThread->esp3 = curr->esp3; 
     280                curr->esp3 = currThread->eventStack; 
     281                curr->eip = (DWORD)currThread->eventFunc; 
     282 
     283                /* Push onto stack */ 
     284                esp = (DWORD*)curr->esp3; 
     285 
     286                extern DWORD retFromEvent; 
     287                *--esp = (DWORD)currThread->eventData; 
     288                *--esp = retFromEvent; 
     289 
     290                curr->esp3 = (DWORD)esp; 
     291                currThread->eventFunc = NULL; 
     292                currThread->eventData = NULL; 
     293                 
     294                PreemptFastEnable(); 
     295        } 
     296} 
     297 
    270298/*********************************************************************** 
    271299 * 
     
    284312        DWORD irq=curr.irq; 
    285313 
     314        /* FIXME: Unreliable, since we can be interrupted. */ 
    286315        if (currThread) 
    287316                currThread->currContext=&curr; 
     
    298327 
    299328                case 0x30: 
    300                         curr.eax=IrqSysCall(curr.eax,curr.edx,curr.ecx); 
     329                        curr.eax = IrqSysCall(curr.eax,curr.edx,curr.ecx); 
    301330                        break; 
    302331 
     
    307336        if (thrNeedSchedule && PreemptCanSchedule()) 
    308337                ThrSchedule(); 
    309 } 
    310  
     338 
     339        if (currThread && (currThread->flags & THR_NEED_RESTORE)) 
     340        { 
     341                curr.eip = currThread->oldEip; 
     342                curr.esp3 = currThread->esp3; 
     343                currThread->flags &= ~(THR_NEED_RESTORE); 
     344        } 
     345 
     346        if (currThread && currThread->eventFunc) 
     347                IrqDoEvent(&curr); 
     348} 
     349