os/kernelhwsrv/kernel/eka/include/nkern/win32/nk_plat.h
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
parent 0 bde4ae8d615e
permissions -rw-r--r--
Update contrib.
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@1
    29
//SL: Avoid warnings
sl@1
    30
#ifdef _CRTIMP
sl@1
    31
#undef _CRTIMP
sl@1
    32
#endif
sl@1
    33
sl@0
    34
#define _CRTIMP			// we want to use the win32 static runtime library
sl@0
    35
sl@0
    36
#define WIN32_LEAN_AND_MEAN
sl@1
    37
sl@1
    38
//SL: Avoid warnings
sl@1
    39
#ifdef _WIN32_WINNT
sl@1
    40
#undef _WIN32_WINNT
sl@1
    41
#endif
sl@1
    42
sl@0
    43
#define _WIN32_WINNT 0x0400
sl@0
    44
#include <windows.h>
sl@0
    45
sl@0
    46
typedef void (*TExcHandler)(TAny*,TAny*);
sl@0
    47
sl@0
    48
struct TWin32ExcInfo
sl@0
    49
	{
sl@0
    50
	enum {EExcInKernel = 0x1};
sl@0
    51
public:
sl@0
    52
	TExcHandler iHandler;
sl@0
    53
	TAny* iParam[2];
sl@0
    54
	TUint iFlags;
sl@0
    55
	// ExcType, iExcId, iFaultAddress, iEax, iEcx, iEdx, iEbx, iEsp, iEbp, iEsi, iEdi,
sl@0
    56
	// iSs, iDs, iEs, iFs, iGs, iEflags, iEip, iCs
sl@0
    57
	TUint32	iExcType;	// filled in by EPOC
sl@0
    58
	TUint32 iExcCode;
sl@0
    59
	TUint32 iExcDataAddress;
sl@0
    60
	TUint32 iEax;
sl@0
    61
	TUint32 iEcx;
sl@0
    62
	TUint32 iEdx;
sl@0
    63
	TUint32 iEbx;
sl@0
    64
	TUint32 iEsp;
sl@0
    65
	TUint32 iEsi;
sl@0
    66
	TUint32 iEdi;
sl@0
    67
	TUint32 iSs;
sl@0
    68
	TUint32 iDs;
sl@0
    69
	TUint32 iEs;
sl@0
    70
	TUint32 iFs;
sl@0
    71
	TUint32 iGs;
sl@0
    72
	TUint32 iEflags;
sl@0
    73
	TUint32 iCs;
sl@0
    74
	TUint32 iEbp;
sl@0
    75
	TUint32 iEip;
sl@0
    76
	};
sl@0
    77
sl@0
    78
enum TEmulThreadType
sl@0
    79
	{
sl@0
    80
	EThreadEvent,	// an 'interrupt' thread, interacts with Win32 events
sl@0
    81
	EThreadNKern	// a nKern thread, identified by a NThread control block
sl@0
    82
	};
sl@0
    83
sl@0
    84
class NThread : public NThreadBase
sl@0
    85
	{
sl@0
    86
public:
sl@0
    87
	typedef void (*TDivert)();
sl@0
    88
	enum TWakeup {ERelease,EResume,EResumeLocked,EIdle,EEscaped,EResumeDiverted};
sl@0
    89
	enum TSelectCpu {ECpuAll=-1,ECpuSingle=-2};
sl@0
    90
public:
sl@0
    91
	TInt Create(SNThreadCreateInfo& aInfo, TBool aInitial);
sl@0
    92
	void Stillborn();
sl@0
    93
	void DoForceExit();
sl@0
    94
//
sl@0
    95
	IMPORT_C static void Idle();
sl@0
    96
	IMPORT_C static void SetProperties(TBool aTrace, TInt aCpu);
sl@0
    97
	TBool WakeUp();
sl@0
    98
	TBool IsSafeToPreempt();
sl@0
    99
	void Divert(TDivert aDivert);
sl@0
   100
	void ApplyDiversion();
sl@0
   101
sl@0
   102
private:
sl@0
   103
	static DWORD WINAPI StartThread(LPVOID aParam);
sl@0
   104
//
sl@0
   105
	static void ExitSync();
sl@0
   106
	static void ExitAsync();
sl@0
   107
//
sl@0
   108
	static void Exception();
sl@0
   109
	static LONG WINAPI ExceptionFilter(EXCEPTION_POINTERS* aExc);
sl@0
   110
sl@0
   111
public:
sl@0
   112
	static void Diverted();
sl@0
   113
	// Has to be accessible to code user-side via emulator.lib
sl@0
   114
	static DWORD ExceptionHandler(EXCEPTION_RECORD* aException, CONTEXT* aContext);
sl@0
   115
sl@0
   116
public:
sl@0
   117
	HANDLE iWinThread;
sl@0
   118
	DWORD iWinThreadId;
sl@0
   119
	HANDLE iScheduleLock;	// event used for scheduling interlock
sl@0
   120
	TBool iDiverted;		// flag to indicate that the thread is being diverted
sl@0
   121
	TDivert iDivert;		// function to invoke after reschedule, may be null
sl@0
   122
	TAny* iDivertReturn;    // return address from diversion
sl@0
   123
	TInt iInKernel;			// flag to indicate if the thread is running 'in' the kernel
sl@0
   124
	TWakeup iWakeup;		// indicates how to wake up the thread
sl@0
   125
	TLinAddr iUserStackBase;
sl@0
   126
	};
sl@0
   127
sl@0
   128
IMPORT_C HANDLE CreateWin32Thread(TEmulThreadType aType, LPTHREAD_START_ROUTINE aThreadFunc, LPVOID aPtr, TBool aRun);
sl@0
   129
IMPORT_C void StartOfInterrupt();
sl@0
   130
IMPORT_C void EndOfInterrupt();
sl@0
   131
sl@0
   132
void SchedulerInit(NThread& aInit);
sl@0
   133
void SchedulerRegister(NThread& aSelf);
sl@0
   134
NThread* SchedulerThread();
sl@0
   135
NThread& CheckedCurrentThread();
sl@0
   136
void SchedulerLock();
sl@0
   137
void SchedulerUnlock();
sl@0
   138
void SchedulerEscape();
sl@0
   139
void SchedulerReenter();
sl@0
   140
void Win32FindNonPreemptibleFunctions();
sl@0
   141
sl@0
   142
inline void EnterKernel(TBool aCheck=TRUE)
sl@0
   143
	{
sl@0
   144
	if (++CheckedCurrentThread().iInKernel==1 && aCheck)
sl@0
   145
		{
sl@0
   146
		NThread& t = CheckedCurrentThread();
sl@0
   147
		__NK_ASSERT_ALWAYS(t.iCsCount==0);
sl@0
   148
		__NK_ASSERT_ALWAYS(t.iHeldFastMutex==0);
sl@0
   149
		__NK_ASSERT_ALWAYS(TheScheduler.iKernCSLocked==0);
sl@0
   150
		}
sl@0
   151
	}
sl@0
   152
sl@0
   153
void LeaveKernel();
sl@0
   154
sl@0
   155
IMPORT_C TInt __fastcall Dispatch(TInt aFunction, TInt* aArgs);
sl@0
   156
sl@0
   157
typedef TInt (__cdecl *TExecHandler)(TInt,TInt,TInt,TInt);
sl@0
   158
typedef void (__cdecl *TPreprocessHandler)(TInt*,TUint32);
sl@0
   159
sl@0
   160
// Emulator nKern scheduling data
sl@0
   161
class Win32Interrupt
sl@0
   162
	{
sl@0
   163
public:
sl@0
   164
	void Init();
sl@0
   165
	TInt Mask();
sl@0
   166
	void Restore(TInt aLevel);
sl@0
   167
	void Begin();
sl@0
   168
	void End();
sl@0
   169
	inline TBool InInterrupt() const
sl@0
   170
		{return iInterrupted!=0;}	
sl@0
   171
	void ForceReschedule();
sl@0
   172
	inline TBool InterruptsStatus(TBool aRequest) const
sl@0
   173
	{return aRequest?(iLevel==0):(iLevel!=0);}
sl@0
   174
private:
sl@0
   175
	static void Reschedule(TAny*);
sl@0
   176
private:
sl@0
   177
	TInt iLock;
sl@0
   178
	HANDLE iQ;
sl@0
   179
	DWORD iOwner;
sl@0
   180
	TInt iLevel;
sl@0
   181
	TBool iRescheduleOnExit;
sl@0
   182
	NThread* iInterrupted;
sl@0
   183
	NThread iScheduler;
sl@0
   184
	};
sl@0
   185
sl@0
   186
extern TBool Win32AtomicSOAW;	// flag to indicate availability of SignalObjectAndWait() API
sl@0
   187
extern TBool Win32TraceThreadId;
sl@0
   188
extern TInt Win32SingleCpu;
sl@0
   189
extern Win32Interrupt Interrupt;
sl@0
   190
sl@0
   191
// Emulator nKern exception data
sl@0
   192
extern TAny* Win32ExcAddress;
sl@0
   193
extern TAny* Win32ExcDataAddress;
sl@0
   194
extern TUint Win32ExcCode;
sl@0
   195
sl@0
   196
void FastCounterInit();
sl@0
   197
sl@0
   198
#endif