Changeset 2085 for Whitix/branches/netchannel/arch/i386/kernel/ints.c
- Timestamp:
- 05/20/10 16:05:25 (2 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
Whitix/branches/netchannel/arch/i386/kernel/ints.c
r2084 r2085 268 268 } 269 269 270 void 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 270 298 /*********************************************************************** 271 299 * … … 284 312 DWORD irq=curr.irq; 285 313 314 /* FIXME: Unreliable, since we can be interrupted. */ 286 315 if (currThread) 287 316 currThread->currContext=&curr; … … 298 327 299 328 case 0x30: 300 curr.eax =IrqSysCall(curr.eax,curr.edx,curr.ecx);329 curr.eax = IrqSysCall(curr.eax,curr.edx,curr.ecx); 301 330 break; 302 331 … … 307 336 if (thrNeedSchedule && PreemptCanSchedule()) 308 337 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
