kernel/eka/include/nkern/win32/nk_plat.h
changeset 0 a41df078684a
child 273 6a75fa55495f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kernel/eka/include/nkern/win32/nk_plat.h	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,187 @@
+// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\include\nkern\win32\nk_plat.h
+// 
+// WARNING: This file contains some APIs which are internal and are subject
+//          to change without notice. Such APIs should therefore not be used
+//          outside the Kernel and Hardware Services package.
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#ifndef __NK_WIN32_H__
+#define __NK_WIN32_H__
+
+#define _CRTIMP			// we want to use the win32 static runtime library
+
+#define WIN32_LEAN_AND_MEAN
+#define _WIN32_WINNT 0x0400
+#include <windows.h>
+
+typedef void (*TExcHandler)(TAny*,TAny*);
+
+struct TWin32ExcInfo
+	{
+	enum {EExcInKernel = 0x1};
+public:
+	TExcHandler iHandler;
+	TAny* iParam[2];
+	TUint iFlags;
+	// ExcType, iExcId, iFaultAddress, iEax, iEcx, iEdx, iEbx, iEsp, iEbp, iEsi, iEdi,
+	// iSs, iDs, iEs, iFs, iGs, iEflags, iEip, iCs
+	TUint32	iExcType;	// filled in by EPOC
+	TUint32 iExcCode;
+	TUint32 iExcDataAddress;
+	TUint32 iEax;
+	TUint32 iEcx;
+	TUint32 iEdx;
+	TUint32 iEbx;
+	TUint32 iEsp;
+	TUint32 iEsi;
+	TUint32 iEdi;
+	TUint32 iSs;
+	TUint32 iDs;
+	TUint32 iEs;
+	TUint32 iFs;
+	TUint32 iGs;
+	TUint32 iEflags;
+	TUint32 iCs;
+	TUint32 iEbp;
+	TUint32 iEip;
+	};
+
+enum TEmulThreadType
+	{
+	EThreadEvent,	// an 'interrupt' thread, interacts with Win32 events
+	EThreadNKern	// a nKern thread, identified by a NThread control block
+	};
+
+class NThread : public NThreadBase
+	{
+public:
+	typedef void (*TDivert)();
+	enum TWakeup {ERelease,EResume,EResumeLocked,EIdle,EEscaped,EResumeDiverted};
+	enum TSelectCpu {ECpuAll=-1,ECpuSingle=-2};
+public:
+	TInt Create(SNThreadCreateInfo& aInfo, TBool aInitial);
+	void Stillborn();
+	void DoForceExit();
+//
+	IMPORT_C static void Idle();
+	IMPORT_C static void SetProperties(TBool aTrace, TInt aCpu);
+	TBool WakeUp();
+	TBool IsSafeToPreempt();
+	void Divert(TDivert aDivert);
+	void ApplyDiversion();
+
+private:
+	static DWORD WINAPI StartThread(LPVOID aParam);
+//
+	static void ExitSync();
+	static void ExitAsync();
+//
+	static void Exception();
+	static LONG WINAPI ExceptionFilter(EXCEPTION_POINTERS* aExc);
+
+public:
+	static void Diverted();
+	// Has to be accessible to code user-side via emulator.lib
+	static DWORD ExceptionHandler(EXCEPTION_RECORD* aException, CONTEXT* aContext);
+
+public:
+	HANDLE iWinThread;
+	DWORD iWinThreadId;
+	HANDLE iScheduleLock;	// event used for scheduling interlock
+	TBool iDiverted;		// flag to indicate that the thread is being diverted
+	TDivert iDivert;		// function to invoke after reschedule, may be null
+	TAny* iDivertReturn;    // return address from diversion
+	TInt iInKernel;			// flag to indicate if the thread is running 'in' the kernel
+	TWakeup iWakeup;		// indicates how to wake up the thread
+	TLinAddr iUserStackBase;
+	};
+
+IMPORT_C HANDLE CreateWin32Thread(TEmulThreadType aType, LPTHREAD_START_ROUTINE aThreadFunc, LPVOID aPtr, TBool aRun);
+IMPORT_C void StartOfInterrupt();
+IMPORT_C void EndOfInterrupt();
+
+void SchedulerInit(NThread& aInit);
+void SchedulerRegister(NThread& aSelf);
+NThread* SchedulerThread();
+NThread& CheckedCurrentThread();
+void SchedulerLock();
+void SchedulerUnlock();
+void SchedulerEscape();
+void SchedulerReenter();
+void Win32FindNonPreemptibleFunctions();
+
+inline void EnterKernel(TBool aCheck=TRUE)
+	{
+	if (++CheckedCurrentThread().iInKernel==1 && aCheck)
+		{
+		NThread& t = CheckedCurrentThread();
+		__NK_ASSERT_ALWAYS(t.iCsCount==0);
+		__NK_ASSERT_ALWAYS(t.iHeldFastMutex==0);
+		__NK_ASSERT_ALWAYS(TheScheduler.iKernCSLocked==0);
+		}
+	}
+
+void LeaveKernel();
+
+IMPORT_C TInt __fastcall Dispatch(TInt aFunction, TInt* aArgs);
+
+typedef TInt (__cdecl *TExecHandler)(TInt,TInt,TInt,TInt);
+typedef void (__cdecl *TPreprocessHandler)(TInt*,TUint32);
+
+// Emulator nKern scheduling data
+class Win32Interrupt
+	{
+public:
+	void Init();
+	TInt Mask();
+	void Restore(TInt aLevel);
+	void Begin();
+	void End();
+	inline TBool InInterrupt() const
+		{return iInterrupted!=0;}	
+	void ForceReschedule();
+	inline TBool InterruptsStatus(TBool aRequest) const
+	{return aRequest?(iLevel==0):(iLevel!=0);}
+private:
+	static void Reschedule(TAny*);
+private:
+	TInt iLock;
+	HANDLE iQ;
+	DWORD iOwner;
+	TInt iLevel;
+	TBool iRescheduleOnExit;
+	NThread* iInterrupted;
+	NThread iScheduler;
+	};
+
+extern TBool Win32AtomicSOAW;	// flag to indicate availability of SignalObjectAndWait() API
+extern TBool Win32TraceThreadId;
+extern TInt Win32SingleCpu;
+extern Win32Interrupt Interrupt;
+
+// Emulator nKern exception data
+extern TAny* Win32ExcAddress;
+extern TAny* Win32ExcDataAddress;
+extern TUint Win32ExcCode;
+
+void FastCounterInit();
+
+#endif