kernel/eka/euser/epoc/symc/uc_exec.cpp
branchanywhere
changeset 95 f561f9ae805b
parent 94 f36eb4948686
child 96 428c5911a502
equal deleted inserted replaced
94:f36eb4948686 95:f561f9ae805b
   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);