os/kernelhwsrv/kernel/eka/include/nkern/win32/nk_plat.h
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
child 1 260cb5ec6c19
permissions -rw-r--r--
First public contribution.
sl@0
     1
// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of the License "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
// e32\include\nkern\win32\nk_plat.h
sl@0
    15
// 
sl@0
    16
// WARNING: This file contains some APIs which are internal and are subject
sl@0
    17
//          to change without notice. Such APIs should therefore not be used
sl@0
    18
//          outside the Kernel and Hardware Services package.
sl@0
    19
//
sl@0
    20
sl@0
    21
/**
sl@0
    22
 @file
sl@0
    23
 @internalComponent
sl@0
    24
*/
sl@0
    25
sl@0
    26
#ifndef __NK_WIN32_H__
sl@0
    27
#define __NK_WIN32_H__
sl@0
    28
sl@0
    29
#define _CRTIMP			// we want to use the win32 static runtime library
sl@0
    30
sl@0
    31
#define WIN32_LEAN_AND_MEAN
sl@0
    32
#define _WIN32_WINNT 0x0400
sl@0
    33
#include <windows.h>
sl@0
    34
sl@0
    35
typedef void (*TExcHandler)(TAny*,TAny*);
sl@0
    36
sl@0
    37
struct TWin32ExcInfo
sl@0
    38
	{
sl@0
    39
	enum {EExcInKernel = 0x1};
sl@0
    40
public:
sl@0
    41
	TExcHandler iHandler;
sl@0
    42
	TAny* iParam[2];
sl@0
    43
	TUint iFlags;
sl@0
    44
	// ExcType, iExcId, iFaultAddress, iEax, iEcx, iEdx, iEbx, iEsp, iEbp, iEsi, iEdi,
sl@0
    45
	// iSs, iDs, iEs, iFs, iGs, iEflags, iEip, iCs
sl@0
    46
	TUint32	iExcType;	// filled in by EPOC
sl@0
    47
	TUint32 iExcCode;
sl@0
    48
	TUint32 iExcDataAddress;
sl@0
    49
	TUint32 iEax;
sl@0
    50
	TUint32 iEcx;
sl@0
    51
	TUint32 iEdx;
sl@0
    52
	TUint32 iEbx;
sl@0
    53
	TUint32 iEsp;
sl@0
    54
	TUint32 iEsi;
sl@0
    55
	TUint32 iEdi;
sl@0
    56
	TUint32 iSs;
sl@0
    57
	TUint32 iDs;
sl@0
    58
	TUint32 iEs;
sl@0
    59
	TUint32 iFs;
sl@0
    60
	TUint32 iGs;
sl@0
    61
	TUint32 iEflags;
sl@0
    62
	TUint32 iCs;
sl@0
    63
	TUint32 iEbp;
sl@0
    64
	TUint32 iEip;
sl@0
    65
	};
sl@0
    66
sl@0
    67
enum TEmulThreadType
sl@0
    68
	{
sl@0
    69
	EThreadEvent,	// an 'interrupt' thread, interacts with Win32 events
sl@0
    70
	EThreadNKern	// a nKern thread, identified by a NThread control block
sl@0
    71
	};
sl@0
    72
sl@0
    73
class NThread : public NThreadBase
sl@0
    74
	{
sl@0
    75
public:
sl@0
    76
	typedef void (*TDivert)();
sl@0
    77
	enum TWakeup {ERelease,EResume,EResumeLocked,EIdle,EEscaped,EResumeDiverted};
sl@0
    78
	enum TSelectCpu {ECpuAll=-1,ECpuSingle=-2};
sl@0
    79
public:
sl@0
    80
	TInt Create(SNThreadCreateInfo& aInfo, TBool aInitial);
sl@0
    81
	void Stillborn();
sl@0
    82
	void DoForceExit();
sl@0
    83
//
sl@0
    84
	IMPORT_C static void Idle();
sl@0
    85
	IMPORT_C static void SetProperties(TBool aTrace, TInt aCpu);
sl@0
    86
	TBool WakeUp();
sl@0
    87
	TBool IsSafeToPreempt();
sl@0
    88
	void Divert(TDivert aDivert);
sl@0
    89
	void ApplyDiversion();
sl@0
    90
sl@0
    91
private:
sl@0
    92
	static DWORD WINAPI StartThread(LPVOID aParam);
sl@0
    93
//
sl@0
    94
	static void ExitSync();
sl@0
    95
	static void ExitAsync();
sl@0
    96
//
sl@0
    97
	static void Exception();
sl@0
    98
	static LONG WINAPI ExceptionFilter(EXCEPTION_POINTERS* aExc);
sl@0
    99
sl@0
   100
public:
sl@0
   101
	static void Diverted();
sl@0
   102
	// Has to be accessible to code user-side via emulator.lib
sl@0
   103
	static DWORD ExceptionHandler(EXCEPTION_RECORD* aException, CONTEXT* aContext);
sl@0
   104
sl@0
   105
public:
sl@0
   106
	HANDLE iWinThread;
sl@0
   107
	DWORD iWinThreadId;
sl@0
   108
	HANDLE iScheduleLock;	// event used for scheduling interlock
sl@0
   109
	TBool iDiverted;		// flag to indicate that the thread is being diverted
sl@0
   110
	TDivert iDivert;		// function to invoke after reschedule, may be null
sl@0
   111
	TAny* iDivertReturn;    // return address from diversion
sl@0
   112
	TInt iInKernel;			// flag to indicate if the thread is running 'in' the kernel
sl@0
   113
	TWakeup iWakeup;		// indicates how to wake up the thread
sl@0
   114
	TLinAddr iUserStackBase;
sl@0
   115
	};
sl@0
   116
sl@0
   117
IMPORT_C HANDLE CreateWin32Thread(TEmulThreadType aType, LPTHREAD_START_ROUTINE aThreadFunc, LPVOID aPtr, TBool aRun);
sl@0
   118
IMPORT_C void StartOfInterrupt();
sl@0
   119
IMPORT_C void EndOfInterrupt();
sl@0
   120
sl@0
   121
void SchedulerInit(NThread& aInit);
sl@0
   122
void SchedulerRegister(NThread& aSelf);
sl@0
   123
NThread* SchedulerThread();
sl@0
   124
NThread& CheckedCurrentThread();
sl@0
   125
void SchedulerLock();
sl@0
   126
void SchedulerUnlock();
sl@0
   127
void SchedulerEscape();
sl@0
   128
void SchedulerReenter();
sl@0
   129
void Win32FindNonPreemptibleFunctions();
sl@0
   130
sl@0
   131
inline void EnterKernel(TBool aCheck=TRUE)
sl@0
   132
	{
sl@0
   133
	if (++CheckedCurrentThread().iInKernel==1 && aCheck)
sl@0
   134
		{
sl@0
   135
		NThread& t = CheckedCurrentThread();
sl@0
   136
		__NK_ASSERT_ALWAYS(t.iCsCount==0);
sl@0
   137
		__NK_ASSERT_ALWAYS(t.iHeldFastMutex==0);
sl@0
   138
		__NK_ASSERT_ALWAYS(TheScheduler.iKernCSLocked==0);
sl@0
   139
		}
sl@0
   140
	}
sl@0
   141
sl@0
   142
void LeaveKernel();
sl@0
   143
sl@0
   144
IMPORT_C TInt __fastcall Dispatch(TInt aFunction, TInt* aArgs);
sl@0
   145
sl@0
   146
typedef TInt (__cdecl *TExecHandler)(TInt,TInt,TInt,TInt);
sl@0
   147
typedef void (__cdecl *TPreprocessHandler)(TInt*,TUint32);
sl@0
   148
sl@0
   149
// Emulator nKern scheduling data
sl@0
   150
class Win32Interrupt
sl@0
   151
	{
sl@0
   152
public:
sl@0
   153
	void Init();
sl@0
   154
	TInt Mask();
sl@0
   155
	void Restore(TInt aLevel);
sl@0
   156
	void Begin();
sl@0
   157
	void End();
sl@0
   158
	inline TBool InInterrupt() const
sl@0
   159
		{return iInterrupted!=0;}	
sl@0
   160
	void ForceReschedule();
sl@0
   161
	inline TBool InterruptsStatus(TBool aRequest) const
sl@0
   162
	{return aRequest?(iLevel==0):(iLevel!=0);}
sl@0
   163
private:
sl@0
   164
	static void Reschedule(TAny*);
sl@0
   165
private:
sl@0
   166
	TInt iLock;
sl@0
   167
	HANDLE iQ;
sl@0
   168
	DWORD iOwner;
sl@0
   169
	TInt iLevel;
sl@0
   170
	TBool iRescheduleOnExit;
sl@0
   171
	NThread* iInterrupted;
sl@0
   172
	NThread iScheduler;
sl@0
   173
	};
sl@0
   174
sl@0
   175
extern TBool Win32AtomicSOAW;	// flag to indicate availability of SignalObjectAndWait() API
sl@0
   176
extern TBool Win32TraceThreadId;
sl@0
   177
extern TInt Win32SingleCpu;
sl@0
   178
extern Win32Interrupt Interrupt;
sl@0
   179
sl@0
   180
// Emulator nKern exception data
sl@0
   181
extern TAny* Win32ExcAddress;
sl@0
   182
extern TAny* Win32ExcDataAddress;
sl@0
   183
extern TUint Win32ExcCode;
sl@0
   184
sl@0
   185
void FastCounterInit();
sl@0
   186
sl@0
   187
#endif