352 |
352 |
353 |
353 |
354 // |
354 // |
355 #ifndef __GEN_USER_EXEC_CODE__ |
355 #ifndef __GEN_USER_EXEC_CODE__ |
356 |
356 |
|
357 const TInt KTrapStackSize=256; |
|
358 |
|
359 /* |
|
360 |
|
361 */ |
|
362 class TThread |
|
363 { |
|
364 public: |
|
365 |
|
366 public: |
|
367 RSemaphore iRequestSemaphore; |
|
368 CActiveScheduler* iActiveScheduler; //Current active scheduler for this thread. Used. |
|
369 TTrapHandler* iHandler; //This is our cleanup stack. Used. |
|
370 //No idea why we need that trap stack |
|
371 TTrap* iTrapStack[KTrapStackSize]; |
|
372 TInt iTrapCount; |
|
373 }; |
|
374 |
357 /* |
375 /* |
358 Object used to store process globals for our pseudo kernel. |
376 Object used to store process globals for our pseudo kernel. |
|
377 That's typically going to be a singleton. |
359 */ |
378 */ |
360 class TProcess |
379 class TProcess |
361 { |
380 { |
362 public: |
381 public: |
363 void CreateHeap(); |
382 void CreateHeap(); |
364 void Free(); |
383 void Free(); |
365 |
384 |
366 public: |
385 public: |
367 RHeap* iAllocator; |
386 RHeap* iAllocator; |
368 TAny* iBase; |
387 TAny* iBase; |
|
388 TThread iThread; //Single thread for now |
369 }; |
389 }; |
370 |
390 |
|
391 |
371 void TProcess::CreateHeap() |
392 void TProcess::CreateHeap() |
372 { |
393 { |
|
394 iThread.iTrapCount=0; |
|
395 //Define the size of our heap |
|
396 const TInt KHeapMaxSize=1024*1024*10; // 10 Mo for now |
373 __ASSERT_ALWAYS(iAllocator==NULL && iBase==NULL,Panic(ESymcExecPanicHeapAlreadyExists)); |
397 __ASSERT_ALWAYS(iAllocator==NULL && iBase==NULL,Panic(ESymcExecPanicHeapAlreadyExists)); |
374 iBase=malloc(1024*10); |
398 iBase=malloc(KHeapMaxSize); |
375 __ASSERT_ALWAYS(iBase!=NULL,Panic(ESymcExecPanicCreateHeapFailed)); |
399 __ASSERT_ALWAYS(iBase!=NULL,Panic(ESymcExecPanicCreateHeapFailed)); |
376 iAllocator=UserHeap::FixedHeap(iBase,1024*10); |
400 //TODO: is there anyway we could use variable size heap? |
|
401 iAllocator=UserHeap::FixedHeap(iBase,KHeapMaxSize); |
377 __ASSERT_ALWAYS(iAllocator!=NULL,Panic(ESymcExecPanicCreateHeapFailed)); |
402 __ASSERT_ALWAYS(iAllocator!=NULL,Panic(ESymcExecPanicCreateHeapFailed)); |
378 } |
403 } |
379 |
404 |
380 void TProcess::Free() |
405 void TProcess::Free() |
381 { |
406 { |
404 __EXECDECL__ RAllocator* Exec::HeapSwitch(RAllocator*) |
429 __EXECDECL__ RAllocator* Exec::HeapSwitch(RAllocator*) |
405 { |
430 { |
406 FAST_EXEC1(EFastExecHeapSwitch); |
431 FAST_EXEC1(EFastExecHeapSwitch); |
407 } |
432 } |
408 |
433 |
409 __EXECDECL__ TTrapHandler* Exec::PushTrapFrame(TTrap*) |
434 __EXECDECL__ TTrapHandler* Exec::PushTrapFrame(TTrap* aTrap) |
410 { |
435 { |
411 FAST_EXEC1(EFastExecPushTrapFrame); |
436 //FAST_EXEC1(EFastExecPushTrapFrame); |
|
437 ASSERT(gProcess.iThread.iTrapCount<=KTrapStackSize); |
|
438 gProcess.iThread.iTrapStack[gProcess.iThread.iTrapCount++]=aTrap; |
|
439 return gProcess.iThread.iHandler; |
412 } |
440 } |
413 |
441 |
414 __EXECDECL__ TTrap* Exec::PopTrapFrame() |
442 __EXECDECL__ TTrap* Exec::PopTrapFrame() |
415 { |
443 { |
416 FAST_EXEC0(EFastExecPopTrapFrame); |
444 //FAST_EXEC0(EFastExecPopTrapFrame); |
|
445 ASSERT(gProcess.iThread.iTrapCount>0); |
|
446 return gProcess.iThread.iTrapStack[gProcess.iThread.iTrapCount--]; |
417 } |
447 } |
418 |
448 |
419 __EXECDECL__ CActiveScheduler* Exec::ActiveScheduler() |
449 __EXECDECL__ CActiveScheduler* Exec::ActiveScheduler() |
420 { |
450 { |
421 FAST_EXEC0(EFastExecActiveScheduler); |
451 FAST_EXEC0(EFastExecActiveScheduler); |
431 FAST_EXEC0(EFastExecLockPeriod); |
461 FAST_EXEC0(EFastExecLockPeriod); |
432 } |
462 } |
433 |
463 |
434 __EXECDECL__ TTrapHandler* Exec::TrapHandler() |
464 __EXECDECL__ TTrapHandler* Exec::TrapHandler() |
435 { |
465 { |
436 FAST_EXEC0(EFastExecTrapHandler); |
466 //FAST_EXEC0(EFastExecTrapHandler); |
437 } |
467 return gProcess.iThread.iHandler; |
438 |
468 } |
439 __EXECDECL__ TTrapHandler* Exec::SetTrapHandler(TTrapHandler*) |
469 |
440 { |
470 __EXECDECL__ TTrapHandler* Exec::SetTrapHandler(TTrapHandler* aHandler) |
441 FAST_EXEC1(EFastExecSetTrapHandler); |
471 { |
|
472 //FAST_EXEC1(EFastExecSetTrapHandler); |
|
473 TTrapHandler* prev=gProcess.iThread.iHandler; |
|
474 gProcess.iThread.iHandler=aHandler; |
|
475 return prev; |
442 } |
476 } |
443 |
477 |
444 __EXECDECL__ TUint32 Exec::DebugMask() |
478 __EXECDECL__ TUint32 Exec::DebugMask() |
445 { |
479 { |
446 FAST_EXEC0(EFastExecDebugMask); |
480 FAST_EXEC0(EFastExecDebugMask); |
1655 SLOW_EXEC1(EExecMutexIsHeld); |
1689 SLOW_EXEC1(EExecMutexIsHeld); |
1656 } |
1690 } |
1657 |
1691 |
1658 __EXECDECL__ TTrapHandler* Exec::LeaveStart() |
1692 __EXECDECL__ TTrapHandler* Exec::LeaveStart() |
1659 { |
1693 { |
1660 SLOW_EXEC0(EExecLeaveStart); |
1694 //SLOW_EXEC0(EExecLeaveStart); |
|
1695 return gProcess.iThread.iHandler; |
1661 } |
1696 } |
1662 |
1697 |
1663 __EXECDECL__ void Exec::LeaveEnd() |
1698 __EXECDECL__ void Exec::LeaveEnd() |
1664 { |
1699 { |
1665 SLOW_EXEC0(EExecLeaveEnd); |
1700 //SLOW_EXEC0(EExecLeaveEnd); |
1666 } |
1701 } |
1667 |
1702 |
1668 __EXECDECL__ void Exec::SetDebugMaskIndex(TUint32, TUint) |
1703 __EXECDECL__ void Exec::SetDebugMaskIndex(TUint32, TUint) |
1669 { |
1704 { |
1670 SLOW_EXEC2(EExecSetDebugMaskIndex); |
1705 SLOW_EXEC2(EExecSetDebugMaskIndex); |