0
|
1 |
// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
|
|
2 |
// All rights reserved.
|
|
3 |
// This component and the accompanying materials are made available
|
|
4 |
// under the terms of the License "Eclipse Public License v1.0"
|
|
5 |
// which accompanies this distribution, and is available
|
|
6 |
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
|
|
7 |
//
|
|
8 |
// Initial Contributors:
|
|
9 |
// Nokia Corporation - initial contribution.
|
|
10 |
//
|
|
11 |
// Contributors:
|
|
12 |
//
|
|
13 |
// Description:
|
|
14 |
// e32\include\memmodel\epoc\platform.h
|
|
15 |
// Public header file for device drivers
|
|
16 |
//
|
|
17 |
// WARNING: This file contains some APIs which are internal and are subject
|
|
18 |
// to change without notice. Such APIs should therefore not be used
|
|
19 |
// outside the Kernel and Hardware Services package.
|
|
20 |
//
|
|
21 |
|
|
22 |
#ifndef __M32STD_H__
|
|
23 |
#define __M32STD_H__
|
|
24 |
#include <kernel/kernel.h>
|
|
25 |
#include <kernel/kernboot.h>
|
|
26 |
#ifdef __EPOC32__
|
|
27 |
#include <e32rom.h>
|
|
28 |
#else
|
|
29 |
class TRomHeader;
|
|
30 |
class TRomImageHeader;
|
|
31 |
class TRomEntry;
|
|
32 |
#endif
|
|
33 |
//
|
|
34 |
|
|
35 |
/********************************************
|
|
36 |
* Hardware chunk abstraction
|
|
37 |
********************************************/
|
|
38 |
|
|
39 |
/**
|
|
40 |
The list of memory types (aka cache attributes) in Kernel on ARMv6K, ARMv7 and later platforms.
|
|
41 |
Types 0-3 can be used on all platforms. Types 4-7 can be used only on the platforms with memory type remapping.
|
|
42 |
@see TMappingAttributes2
|
|
43 |
@publishedPartner
|
|
44 |
@released
|
|
45 |
*/
|
|
46 |
enum TMemoryType
|
|
47 |
{
|
|
48 |
EMemAttStronglyOrdered = 0, /**< Strongly Ordered memory.*/
|
|
49 |
EMemAttDevice = 1, /**< Device memory.*/
|
|
50 |
EMemAttNormalUncached = 2, /**< Uncached Normal memory. Writes may combine.*/
|
|
51 |
EMemAttNormalCached = 3, /**< Fully cached (Write-Back, Read/Write Allocate, Normal memory).*/
|
|
52 |
EMemAttKernelInternal4 = 4, /**< @internalComponent. Not to be used by device drivers.*/
|
|
53 |
EMemAttPlatformSpecific5= 5, /**< Defined by Baseport - H/W independent.*/
|
|
54 |
EMemAttPlatformSpecific6= 6, /**< Defined by Baseport - H/W specific - see ARM core's document for the details.*/
|
|
55 |
EMemAttPlatformSpecific7= 7 /**< Defined by Baseport - H/W independent.*/
|
|
56 |
};
|
|
57 |
|
|
58 |
const TUint KMemoryTypeShift = 3; /**< @internalComponent. The number of bits in a TMemoryType value.*/
|
|
59 |
const TUint KMemoryTypeMask = (1<<KMemoryTypeShift)-1; /**< @internalComponent. Mask value for extracting a TMemoryType value from a bitfield.*/
|
|
60 |
|
|
61 |
/**
|
|
62 |
Memory mapping permissions and attributes.
|
|
63 |
|
|
64 |
@see TChunkCreateInfo
|
|
65 |
@see Kern::ChunkCreate
|
|
66 |
@see DSharedIoBuffer::New
|
|
67 |
@see DPlatChunkHw::New
|
|
68 |
@see Kern::ChunkPhysicalAddress
|
|
69 |
@see Cache::SyncMemoryBeforeDmaWrite
|
|
70 |
@see Cache::SyncMemoryBeforeDmaRead
|
|
71 |
@see Cache::SyncMemoryBeforeDmaWrite
|
|
72 |
|
|
73 |
@publishedPartner
|
|
74 |
@released
|
|
75 |
*/
|
|
76 |
enum TMappingAttributes
|
|
77 |
{
|
|
78 |
// access permissions for read
|
|
79 |
EMapAttrReadNoone=0x0, /**< Sets the memory as not readable in any mode */
|
|
80 |
EMapAttrReadSup=0x1, /**< Sets the memory as readable only from Kernel (Supervisor) mode */
|
|
81 |
EMapAttrReadUser=0x4, /**< Sets the memory as readable for user, hence it can be read in both user and supervisor mode*/
|
|
82 |
EMapAttrReadMask=0xF, /**< Used for masking read attributes*/
|
|
83 |
|
|
84 |
// access permissions for write
|
|
85 |
EMapAttrWriteNoone=0x00, /**< Sets the memory as not writable in any mode */
|
|
86 |
EMapAttrWriteSup=0x10, /**< Sets the memory as writable only from Kernel (Supervisor) mode */
|
|
87 |
EMapAttrWriteUser=0x40, /**< Sets the memory as writable for user, hence it can be written in both user and supervisor mode*/
|
|
88 |
EMapAttrWriteMask=0xF0, /**< Used for masking write attributes*/
|
|
89 |
|
|
90 |
// access permissions for execute
|
|
91 |
EMapAttrExecNoone=0x000, /**< Sets the memory as not executable in any mode */
|
|
92 |
EMapAttrExecSup=0x100, /**< Sets the memory as executable only from Kernel (Supervisor) mode */
|
|
93 |
EMapAttrExecUser=0x400, /**< Sets the memory as executable for user, hence it can be executed in both user and supervisor mode*/
|
|
94 |
EMapAttrExecMask=0xF00, /**< Used for masking execute attributes*/
|
|
95 |
|
|
96 |
// access permissions - popular combinations
|
|
97 |
EMapAttrSupRo=0x01, /**< Supervisor has read only and user has no access permissions*/
|
|
98 |
EMapAttrSupRw=0x11, /**< Supervisor has read/write and user has no access permissions*/
|
|
99 |
EMapAttrSupRwx=0x111, /**< Supervisor has read/write/execute and user has no access permissions*/
|
|
100 |
EMapAttrUserRo=0x14, /**< Supervisor has read/write and user has read only permissions*/
|
|
101 |
EMapAttrUserRw=0x44, /**< Supervisor and user both have read/write permissions*/
|
|
102 |
EMapAttrUserRwx=0x444, /**< Supervisor and user both have read/write/execute permissions*/
|
|
103 |
EMapAttrAccessMask=0xFFF, /**< Used for masking access permissions attribute for popular combination */
|
|
104 |
|
|
105 |
// Level 1 cache/buffer attributes
|
|
106 |
EMapAttrFullyBlocking=0x0000, /**< Level 1 cache/buffer attributes sets the memory as uncached, unbuffered (may not be L2 cached)*/
|
|
107 |
EMapAttrBufferedNC=0x1000, /**< Level 1 cache/buffer attributes sets the memory as uncached, buffered, writes do not coalesce (may not be L2 cached)*/
|
|
108 |
EMapAttrBufferedC=0x2000, /**< Level 1 cache/buffer attributes sets the memory as uncached, buffered, writes may coalesce (may not be L2 cached)*/
|
|
109 |
EMapAttrL1Uncached=0x3000, /**< Level 1 cache/buffer attributes sets the memory as uncached, buffered, writes may coalesce (may be L2 cached)*/
|
|
110 |
EMapAttrCachedWTRA=0x4000, /**< Level 1 cache/buffer attributes sets the memory as write-through cached, read allocate*/
|
|
111 |
EMapAttrCachedWTWA=0x5000, /**< Level 1 cache/buffer attributes sets the memory as write-through cached, read/write allocate*/
|
|
112 |
EMapAttrCachedWBRA=0x6000, /**< Level 1 cache/buffer attributes sets the memory as write-back cached, read allocate*/
|
|
113 |
EMapAttrCachedWBWA=0x7000, /**< Level 1 cache/buffer attributes sets memory as write-back cached, read/write allocate*/
|
|
114 |
EMapAttrAltCacheWTRA=0x8000, /**< Level 1 cache/buffer attributes sets memory as write-through cached, read allocate, use alternate cache*/
|
|
115 |
EMapAttrAltCacheWTWA=0x9000, /**< Level 1 cache/buffer attributes sets memory as write-through cached, read/write allocate, use alternate cache*/
|
|
116 |
EMapAttrAltCacheWBRA=0xA000, /**< Level 1 cache/buffer attributes sets memory as write-back cached, read allocate, use alternate cache*/
|
|
117 |
EMapAttrAltCacheWBWA=0xB000, /**< Level 1 cache/buffer attributes write-back cached, read/write allocate, use alternate cache*/
|
|
118 |
EMapAttrL1CachedMax=0xF000, /**< Used to make memory maximally cached in L1 cache*/
|
|
119 |
EMapAttrL1CacheMask=0xF000, /**< Used for masking L1 cache attributes*/
|
|
120 |
|
|
121 |
// Level 2 cache attributes
|
|
122 |
EMapAttrL2Uncached=0x00000, /**< Level 2 cache attributes used to set memory as uncached at level 2 */
|
|
123 |
EMapAttrL2CachedWTRA=0x40000, /**< Level 2 cache attributes sets memory as write-through cached, read allocate*/
|
|
124 |
EMapAttrL2CachedWTWA=0x50000, /**< Level 2 cache attributes sets memory as write-through cached, read/write allocate*/
|
|
125 |
EMapAttrL2CachedWBRA=0x60000, /**< Level 2 cache attributes sets memory as write-back cached, read allocate*/
|
|
126 |
EMapAttrL2CachedWBWA=0x70000, /**< Level 2 cache attributes sets memory as write-back cached, read/write allocate*/
|
|
127 |
EMapAttrL2CachedMax=0xF0000, /**< Used to make memory maximally cached in L2 cache*/
|
|
128 |
EMapAttrL2CacheMask=0xF0000, /**< Used for masking L2 cache attributes*/
|
|
129 |
|
|
130 |
// Others
|
|
131 |
EMapAttrCachedMax=0xFF000, /**< Used to set memory as maximally cached for system (fully cached in L1&L2 cache)*/
|
|
132 |
EMapAttrShared=0x100000, /**< Used to set the memory as shared with other processors*/
|
|
133 |
EMapAttrUseECC=0x200000, /**< Used for error correcting code*/
|
|
134 |
};
|
|
135 |
|
|
136 |
/**
|
|
137 |
Container class for memory region's attributes.
|
|
138 |
It is intended for ARM platforms with memory type and access permission remapping
|
|
139 |
(arm11mpcore, arm1176, cortex_a8 and later), but could be used on any previous platform as well.
|
|
140 |
|
|
141 |
The object of this type can replace TMappingAttributes bit mask whereever it is in use. For example:
|
|
142 |
@code
|
|
143 |
TChunkCreateInfo chunkInfo;
|
|
144 |
...
|
|
145 |
new (&chunkInfo.iMapAttr) TMappingAttributes2(EMemAttStronglyOrdered,EFalse,ETrue);
|
|
146 |
r = Kern::ChunkCreate(chunkInfo, ...);
|
|
147 |
@endcode
|
|
148 |
|
|
149 |
@see TMemoryType
|
|
150 |
@see TMappingAttributes
|
|
151 |
@see TChunkCreateInfo
|
|
152 |
@see Kern::ChunkCreate
|
|
153 |
@see DSharedIoBuffer::New
|
|
154 |
@see DPlatChunkHw::New
|
|
155 |
@see Kern::ChunkPhysicalAddress
|
|
156 |
@see Cache::SyncMemoryBeforeDmaWrite
|
|
157 |
@see Cache::SyncMemoryBeforeDmaRead
|
|
158 |
@see Cache::SyncMemoryBeforeDmaWrite
|
|
159 |
|
|
160 |
@publishedPartner
|
|
161 |
@released
|
|
162 |
*/
|
|
163 |
class TMappingAttributes2
|
|
164 |
{
|
|
165 |
public:
|
|
166 |
/**
|
|
167 |
Constructor.
|
|
168 |
Memory is always readable by Kernel. Other attributes are defined by input parameters, as follows:
|
|
169 |
@param aType Type (aka cache attributes) of the memory.
|
|
170 |
@param aUserAccess True if memory is also accessed from user code, false if it is only accessible from kernel.
|
|
171 |
@param aWritable True if memory is writable, false if this is read only memory.
|
|
172 |
@param aExecutable True if memory contains code or data, false if it only contains data.
|
|
173 |
Default argument value is false.
|
|
174 |
@param aShared Shared attribute of the mapping:
|
|
175 |
<0 Default value for the platform, e.g. Shareable for SMP, Unshareable for uni-processor.
|
|
176 |
==0 Unshareable memory
|
|
177 |
>0 Shareable memory
|
|
178 |
To ensure future compatibility, use the value <0 except when absolutely neccessary.
|
|
179 |
Default argument value is -1.
|
|
180 |
@param aParity Parity error attribute of the mapping:
|
|
181 |
<0 Default value for the platform (which is off on all platforms so far).
|
|
182 |
==0 Parity error doesn't generate external abort.
|
|
183 |
>0 Parity error generates external abort.
|
|
184 |
To ensure future compatibility, use the value <0 except when absolutely neccessary.
|
|
185 |
Default argument value is -1.
|
|
186 |
|
|
187 |
@see TMemoryType
|
|
188 |
*/
|
|
189 |
IMPORT_C TMappingAttributes2(TMemoryType aType ,
|
|
190 |
TBool aUserAccess ,
|
|
191 |
TBool aWritable ,
|
|
192 |
TBool aExecutable = EFalse,
|
|
193 |
TInt aShared = -1,
|
|
194 |
TInt aParity = -1);
|
|
195 |
|
|
196 |
TMappingAttributes2(TUint aMapAttr);/**< @internalComponent*/
|
|
197 |
TMemoryType Type(); /**< @internalComponent @return Type of the memory (aka cache attributes).*/
|
|
198 |
TBool UserAccess(); /**< @internalComponent @return True if memory can be accessed from user code.*/
|
|
199 |
TBool Writable(); /**< @internalComponent @return True if memory can be written into, false if this is reaad only memory.*/
|
|
200 |
TBool Executable(); /**< @internalComponent @return True if memory can contain code and data, false if it can only contain data.*/
|
|
201 |
TBool Shared(); /**< @internalComponent @return True if memory is shared, false if not.*/
|
|
202 |
TBool Parity(); /**< @internalComponent @return True if parity error generates external abort, false if not.*/
|
|
203 |
TBool ObjectType2();/**< @internalComponent @return True if the object is TMappingAttributes2, false if it is TMappingAttributes bitmask.*/
|
|
204 |
private:
|
|
205 |
static void Panic(TInt aPanic); /**< @internalComponent*/
|
|
206 |
private:
|
|
207 |
TUint32 iAttributes; /**< @internalComponent*/
|
|
208 |
};
|
|
209 |
|
|
210 |
/**
|
|
211 |
@internalComponent
|
|
212 |
*/
|
|
213 |
inline TBool ComparePermissions(TInt aActual, TInt aRequired)
|
|
214 |
{
|
|
215 |
return ((aActual&EMapAttrReadMask)>=(aRequired&EMapAttrReadMask)) &&
|
|
216 |
((aActual&EMapAttrWriteMask)>=(aRequired&EMapAttrWriteMask)) &&
|
|
217 |
((aActual&EMapAttrExecMask)>=(aRequired&EMapAttrExecMask));
|
|
218 |
}
|
|
219 |
|
|
220 |
|
|
221 |
/** Hardware Chunk class
|
|
222 |
Class representing a global mapping of I/O or global memory buffers
|
|
223 |
|
|
224 |
@publishedPartner
|
|
225 |
@released
|
|
226 |
*/
|
|
227 |
class DPlatChunkHw : public DObject
|
|
228 |
{
|
|
229 |
public:
|
|
230 |
IMPORT_C static TInt New(DPlatChunkHw*& aChunk, TPhysAddr anAddr, TInt aSize, TUint aAttribs);
|
|
231 |
inline TLinAddr LinearAddress() {return iLinAddr;}
|
|
232 |
inline TPhysAddr PhysicalAddress() {return iPhysAddr;}
|
|
233 |
public:
|
|
234 |
/** @internalComponent */
|
|
235 |
static TInt DoNew(DPlatChunkHw*& aChunk, TPhysAddr anAddr, TInt aSize, TUint aAttribs);
|
|
236 |
public:
|
|
237 |
TPhysAddr iPhysAddr; /**< @internalComponent */
|
|
238 |
TLinAddr iLinAddr; /**< @internalComponent */
|
|
239 |
TInt iSize; /**< @internalComponent */
|
|
240 |
TUint iAttribs; /**< @internalComponent */ // mapping attributes
|
|
241 |
};
|
|
242 |
|
|
243 |
/********************************************
|
|
244 |
* Exports from layer 2 or below of the kernel
|
|
245 |
* which are not available to layer 1
|
|
246 |
********************************************/
|
|
247 |
|
|
248 |
/**
|
|
249 |
Specifies the operation performed by the TRamZoneCallback function.
|
|
250 |
@see TRamZoneCallback
|
|
251 |
@publishedPartner
|
|
252 |
@released
|
|
253 |
*/
|
|
254 |
enum TRamZoneOp
|
|
255 |
{
|
|
256 |
/** Informs the variant that a specified RAM zone is not currently
|
|
257 |
being used and therefore it may be possible to save power by not refreshing
|
|
258 |
this zone or, if the rest of the its RAM IC's zones are also empty, powering
|
|
259 |
down the RAM IC.
|
|
260 |
|
|
261 |
The TRamZoneCallback parameter aParam1 is the ID of the zone.
|
|
262 |
The TRamZoneCallback parameter aParam2 is a pointer to const array of TUints
|
|
263 |
that are the bit masks of the zones' power status.
|
|
264 |
*/
|
|
265 |
ERamZoneOp_PowerDown=0,
|
|
266 |
|
|
267 |
/** Informs the variant that a specified RAM zone is now required for use
|
|
268 |
and therefore it must be ready.
|
|
269 |
The variant should ensure the zone is refreshed, if required, and that the
|
|
270 |
RAM IC is powered and fully initialised.
|
|
271 |
|
|
272 |
The TRamZoneCallback parameter aParam1 is the ID of the zone.
|
|
273 |
The TRamZoneCallback parameter aParam2 is a pointer to const array of TUints
|
|
274 |
that are the bit masks of the zones' power status.
|
|
275 |
*/
|
|
276 |
ERamZoneOp_PowerUp=1,
|
|
277 |
|
|
278 |
/** Operation that informs the variant of the RAM zones that have been used
|
|
279 |
during the initial stages of the boot process. Any RAM zones that are not
|
|
280 |
in use may be powered down or not refreshed to save power.
|
|
281 |
This will be the first operation requested of the variant and it is only
|
|
282 |
issued once.
|
|
283 |
|
|
284 |
The TRamZoneCallback parameter aParam1 is unused by this operation.
|
|
285 |
The TRamZoneCallback parameter aParam2 is a pointer to const array of TUints
|
|
286 |
that are the bit masks of the zones' power status.
|
|
287 |
*/
|
|
288 |
ERamZoneOp_Init=2,
|
|
289 |
};
|
|
290 |
|
|
291 |
|
|
292 |
/**
|
|
293 |
Call back function that is invoked by the kernel when its RAM allocator determines
|
|
294 |
that an operation can be performed on a particular RAM zone.
|
|
295 |
|
|
296 |
@publishedPartner
|
|
297 |
@released
|
|
298 |
|
|
299 |
@param aOp Type of operation to perform; a value of TRamZoneOp
|
|
300 |
@param aParam1 A value whose use is defined by the TRamZoneOp to be performed
|
|
301 |
@param aParam2 A value whose use is defined by the TRamZoneOp to be performed
|
|
302 |
The data pointed to by aParam2 is const and therefore should not be modified
|
|
303 |
|
|
304 |
@return KErrNone if successful, otherwise one of the system wide error codes
|
|
305 |
|
|
306 |
@see TRamZoneOp
|
|
307 |
*/
|
|
308 |
typedef TInt (*TRamZoneCallback) (TRamZoneOp aOp, TAny* aParam1, const TAny* aParam2);
|
|
309 |
|
|
310 |
/**
|
|
311 |
Holds the number of each page type within a RAM zone.
|
|
312 |
|
|
313 |
@see Epoc::GetRamZonePageCount()
|
|
314 |
|
|
315 |
@publishedPartner
|
|
316 |
@released
|
|
317 |
*/
|
|
318 |
struct SRamZonePageCount
|
|
319 |
{
|
|
320 |
TUint iFreePages; /**< The number of free pages in the RAM zone*/
|
|
321 |
TUint iUnknownPages; /**< The number of unknown pages in the RAM zone*/
|
|
322 |
TUint iFixedPages; /**< The number of fixed pages in the RAM zone*/
|
|
323 |
TUint iMovablePages; /**< The number of movable pages in the RAM zone*/
|
|
324 |
TUint iDiscardablePages;/**< The number of discardable pages in the RAM zone*/
|
|
325 |
TUint iReserved[4]; /**<@internalComponent reserved for internal use only*/
|
|
326 |
};
|
|
327 |
|
|
328 |
/**
|
|
329 |
@publishedPartner
|
|
330 |
@released
|
|
331 |
*/
|
|
332 |
class Epoc
|
|
333 |
{
|
|
334 |
public:
|
|
335 |
/**
|
|
336 |
The types of RAM defragmentation operations.
|
|
337 |
@internalComponent
|
|
338 |
*/
|
|
339 |
enum TRamDefragOp
|
|
340 |
{
|
|
341 |
ERamDefrag_DefragRam,
|
|
342 |
ERamDefrag_EmptyRamZone,
|
|
343 |
ERamDefrag_ClaimRamZone,
|
|
344 |
};
|
|
345 |
|
|
346 |
/**
|
|
347 |
The type of page to move with Epoc::MovePhysicalPage().
|
|
348 |
@internalComponent
|
|
349 |
*/
|
|
350 |
enum TRamDefragPageToMove
|
|
351 |
{
|
|
352 |
/**
|
|
353 |
Move the physical page aOld.
|
|
354 |
*/
|
|
355 |
ERamDefragPage_Physical,
|
|
356 |
/**
|
|
357 |
Move the page table page that maps the linear address in the
|
|
358 |
current thread at aOld.
|
|
359 |
*/
|
|
360 |
ERamDefragPage_PageTable,
|
|
361 |
/**
|
|
362 |
Move the page table info page of the page table that maps the linear
|
|
363 |
address in the current thread at aOld.
|
|
364 |
*/
|
|
365 |
ERamDefragPage_PageTableInfo,
|
|
366 |
};
|
|
367 |
|
|
368 |
|
|
369 |
IMPORT_C static void SetMonitorEntryPoint(TDfcFn aFunction); /**< @internalComponent */
|
|
370 |
IMPORT_C static void SetMonitorExceptionHandler(TLinAddr aHandler); /**< @internalComponent */
|
|
371 |
IMPORT_C static TAny* ExceptionInfo(); /**< @internalComponent */
|
|
372 |
IMPORT_C static const TRomHeader& RomHeader();
|
|
373 |
IMPORT_C static TInt AllocShadowPage(TLinAddr aRomAddr);
|
|
374 |
IMPORT_C static TInt CopyToShadowMemory(TLinAddr aDest, TLinAddr aSrc, TUint32 aLength);
|
|
375 |
IMPORT_C static TInt FreeShadowPage(TLinAddr aRomAddr);
|
|
376 |
IMPORT_C static TInt FreezeShadowPage(TLinAddr aRomAddr);
|
|
377 |
IMPORT_C static TInt AllocPhysicalRam(TInt aSize, TPhysAddr& aPhysAddr, TInt aAlign=0);
|
|
378 |
IMPORT_C static TInt ZoneAllocPhysicalRam(TUint aZoneId, TInt aSize, TPhysAddr& aPhysAddr, TInt aAlign=0);
|
|
379 |
IMPORT_C static TInt ZoneAllocPhysicalRam(TUint* aZoneIdList, TUint aZoneIdCount, TInt aSize, TPhysAddr& aPhysAddr, TInt aAlign=0);
|
|
380 |
IMPORT_C static TInt AllocPhysicalRam(TInt aNumPages, TPhysAddr* aPageList);
|
|
381 |
IMPORT_C static TInt ZoneAllocPhysicalRam(TUint aZoneId, TInt aNumPages, TPhysAddr* aPageList);
|
|
382 |
IMPORT_C static TInt ZoneAllocPhysicalRam(TUint* aZoneIdList, TUint aZoneIdCount, TInt aNumPages, TPhysAddr* aPageList);
|
|
383 |
IMPORT_C static TInt FreePhysicalRam(TPhysAddr aPhysAddr, TInt aSize);
|
|
384 |
IMPORT_C static TInt FreePhysicalRam(TInt aNumPages, TPhysAddr* aPageList);
|
|
385 |
IMPORT_C static TInt ClaimPhysicalRam(TPhysAddr aPhysAddr, TInt aSize);
|
|
386 |
IMPORT_C static TPhysAddr LinearToPhysical(TLinAddr aLinAddr);
|
|
387 |
IMPORT_C static void RomProcessInfo(TProcessCreateInfo& aInfo, const TRomImageHeader& aRomImageHeader); /**< @internalComponent */
|
|
388 |
#ifdef BTRACE_KERNEL_MEMORY
|
|
389 |
static TInt DriverAllocdPhysRam; // the number of bytes allocated by Epoc::AllocPhysicalRam and Epoc::FreePhysicalRam
|
|
390 |
static TInt KernelMiscPages; // the number of bytes of 'miscelaneous' kernel memory allocated
|
|
391 |
#endif
|
|
392 |
IMPORT_C static TInt MovePhysicalPage(TPhysAddr aOld, TPhysAddr& aNew, TRamDefragPageToMove aPageToMove=ERamDefragPage_Physical); /**< @internalComponent */
|
|
393 |
IMPORT_C static TInt SetRamZoneConfig(const SRamZone* aZones, TRamZoneCallback aCallback);
|
|
394 |
IMPORT_C static TInt GetRamZonePageCount(TUint aId, SRamZonePageCount& aPageData);
|
|
395 |
IMPORT_C static TInt ModifyRamZoneFlags(TUint aId, TUint aClearMask, TUint aSetMask);
|
|
396 |
};
|
|
397 |
|
|
398 |
/**
|
|
399 |
@publishedPartner
|
|
400 |
@released
|
|
401 |
*/
|
|
402 |
class DebugSupport
|
|
403 |
{
|
|
404 |
public:
|
|
405 |
|
|
406 |
/** Bitmask values representing different breakpoint types. */
|
|
407 |
enum TType
|
|
408 |
{
|
|
409 |
EBreakpointGlobal = 1<<0, /**< Breakpoint appears in all processes */
|
|
410 |
EBreakpointLocal = 1<<1, /**< Breakpoint appears in the specified process only. */
|
|
411 |
};
|
|
412 |
|
|
413 |
IMPORT_C static TInt InitialiseCodeModifier(TUint& aCapabilities, TInt aMinBreakpoints);
|
|
414 |
IMPORT_C static void CloseCodeModifier();
|
|
415 |
IMPORT_C static TInt ModifyCode(DThread* aThread, TLinAddr aAddress, TInt aSize, TUint aValue, TUint aType);
|
|
416 |
IMPORT_C static TInt RestoreCode(DThread* aThread, TLinAddr aAddress);
|
|
417 |
|
|
418 |
/**
|
|
419 |
@internalTechnology
|
|
420 |
@prototype
|
|
421 |
*/
|
|
422 |
IMPORT_C static void TerminateProcess(DProcess* aProcess, const TInt aReason);
|
|
423 |
|
|
424 |
};
|
|
425 |
|
|
426 |
#ifdef __DEBUGGER_SUPPORT__
|
|
427 |
/**
|
|
428 |
@internalComponent
|
|
429 |
*/
|
|
430 |
class CodeModifier : public DBase
|
|
431 |
{
|
|
432 |
public:
|
|
433 |
|
|
434 |
/** Values for panic values in category 'CodeModifier'. */
|
|
435 |
enum TPanic
|
|
436 |
{
|
|
437 |
EPanicNotInitialised = 0,
|
|
438 |
EPanicInvalidSizeOrAlignment = 1,
|
|
439 |
};
|
|
440 |
|
|
441 |
/** Defines the type/size of the breakpoint - see TBreakpoint::iSize*/
|
|
442 |
enum TBrkType
|
|
443 |
{
|
|
444 |
EEmpty =0, //The slot is unused
|
|
445 |
EByte =1, //Jazelle breakpoint
|
|
446 |
EHalfword =2, //Thumb breakpoint
|
|
447 |
EWord =4 //ARM breakpoint
|
|
448 |
};
|
|
449 |
|
|
450 |
TInt static CreateAndInitialise(TInt aMinBreakpoints);
|
|
451 |
~CodeModifier();
|
|
452 |
void Close();
|
|
453 |
TInt Modify(DThread* aThread, TLinAddr aAddress, TInt aSize, TUint aValue);
|
|
454 |
TInt Restore(DThread* aThread, TLinAddr aAddress);
|
|
455 |
static void CodeSegRemoved(DCodeSeg* aCodeSeg, DProcess* aProcess);
|
|
456 |
static DMutex& Mutex() {return *Kern::CodeSegLock();}
|
|
457 |
static void Fault(TPanic aPanic);
|
|
458 |
|
|
459 |
private:
|
|
460 |
|
|
461 |
/**Desribes a breakpoint slot in the pool*/
|
|
462 |
struct TBreakpoint
|
|
463 |
{
|
|
464 |
TUint iProcessId; //Id of the process associated to this breakpoint.
|
|
465 |
TUint iAddress; //The virtual address of the breakpoint
|
|
466 |
TUint32 iOldValue; //Will hold the original content of iAddress
|
|
467 |
TInt16 iSize; //Could be one of TBrkType. 0 means empty/unused, otherwise it indicates the size of the breakpoint in bytes.
|
|
468 |
TInt16 iPageIndex; //If iSize!=0 identifies corresponding shadowed page, or -1 if it is non-XIP page.
|
|
469 |
};
|
|
470 |
|
|
471 |
/** Desribes a page slot in the pool. Used for pages that are shadowed or need to be locked (for demand paging). */
|
|
472 |
struct TPageInfo
|
|
473 |
{
|
|
474 |
TLinAddr iAddress; //Base address of the page.
|
|
475 |
TInt32 iCounter; //The number of breakpoints associated with this page. 0 indicates empty slot.
|
|
476 |
TBool iWasShadowed; //True if the page had been already shadowed before the first breakpoint was applied,
|
|
477 |
//false otherwise. If true, it won't be un-shadowed after all breakpoints are removed.
|
|
478 |
#ifdef __DEMAND_PAGING__
|
|
479 |
/// If set, points to the deamnd paging lock object used to lock this page. Only applies to
|
|
480 |
/// RAM-loaded code.
|
|
481 |
DDemandPagingLock* iPagingLock;
|
|
482 |
#endif
|
|
483 |
};
|
|
484 |
private:
|
|
485 |
TBreakpoint* FindBreakpoint(DThread* aThread, TLinAddr aAddress, TInt aSize, TBool& aOverlap);
|
|
486 |
TBreakpoint* FindEmptyBrk();
|
|
487 |
TInt FindEmptyPageInfo();
|
|
488 |
TInt FindPageInfo(TLinAddr aAddress);
|
|
489 |
TInt IsRom(TLinAddr aAddress);
|
|
490 |
TInt WriteCode(TLinAddr aAddress, TInt aSize, TUint aValue, void* aOldValue);
|
|
491 |
DProcess* Process(TUint aProcessId);
|
|
492 |
TInt SafeWriteCode(DProcess* aProcess, TLinAddr aAddress, TInt aSize, TUint aValue, void* aOldValue);
|
|
493 |
void RestorePage(TInt aPageIndex);
|
|
494 |
void DoCodeSegRemoved(DCodeSeg* aCodeSeg, DProcess* aProcess);
|
|
495 |
|
|
496 |
private:
|
|
497 |
TInt iPoolSize;
|
|
498 |
TBreakpoint* iBreakpoints; //Breakpoint pool with iPoolSize slots
|
|
499 |
TPageInfo* iPages; //The pool of the shadowed/locked pages with iPoolSize slots
|
|
500 |
TUint iPageSize;
|
|
501 |
TUint iPageMask;
|
|
502 |
};
|
|
503 |
|
|
504 |
GLREF_D CodeModifier* TheCodeModifier;
|
|
505 |
#endif //__DEBUGGER_SUPPORT__
|
|
506 |
|
|
507 |
|
|
508 |
/**
|
|
509 |
@internalComponent
|
|
510 |
*/
|
|
511 |
inline const TRomEntry &RomEntry(TLinAddr anAddr)
|
|
512 |
{return(*((const TRomEntry *)anAddr));}
|
|
513 |
|
|
514 |
/**
|
|
515 |
@internalComponent
|
|
516 |
*/
|
|
517 |
inline const TRomImageHeader& RomImageHeader(TLinAddr anAddr)
|
|
518 |
{return(*((const TRomImageHeader*)anAddr));}
|
|
519 |
|
|
520 |
/**
|
|
521 |
TRamDefragRequest is intended to be used by device drivers to request that RAM defragmentation
|
|
522 |
operations are performed.
|
|
523 |
|
|
524 |
All RAM defragmentation operations can be invoked synchronously or asynchronously.
|
|
525 |
The asynchronous RAM defragmentation operations can use either a TDfc or a NFastSemaphore
|
|
526 |
to signal to the caller that the operation has completed.
|
|
527 |
|
|
528 |
@see TDfc
|
|
529 |
@see NFastSemaphore
|
|
530 |
@publishedPartner
|
|
531 |
@released
|
|
532 |
*/
|
|
533 |
class TRamDefragRequest : protected TAsyncRequest
|
|
534 |
{
|
|
535 |
public:
|
|
536 |
IMPORT_C TRamDefragRequest();
|
|
537 |
IMPORT_C TInt DefragRam(TInt aPriority, TInt aMaxPages=0);
|
|
538 |
IMPORT_C TInt DefragRam(NFastSemaphore* aSem, TInt aPriority, TInt aMaxPages=0);
|
|
539 |
IMPORT_C TInt DefragRam(TDfc* aDfc, TInt aPriority, TInt aMaxPages=0);
|
|
540 |
IMPORT_C TInt EmptyRamZone(TUint aId, TInt aPriority);
|
|
541 |
IMPORT_C TInt EmptyRamZone(TUint aId, NFastSemaphore* aSem, TInt aPriority);
|
|
542 |
IMPORT_C TInt EmptyRamZone(TUint aId, TDfc* aDfc, TInt aPriority);
|
|
543 |
IMPORT_C TInt ClaimRamZone(TUint aId, TPhysAddr& aPhysAddr, TInt aPriority);
|
|
544 |
IMPORT_C TInt ClaimRamZone(TUint aId, TPhysAddr& aPhysAddr, NFastSemaphore* aSem, TInt aPriority);
|
|
545 |
IMPORT_C TInt ClaimRamZone(TUint aId, TPhysAddr& aPhysAddr, TDfc* aDfc, TInt aPriority);
|
|
546 |
IMPORT_C TInt Result();
|
|
547 |
IMPORT_C void Cancel();
|
|
548 |
|
|
549 |
/**
|
|
550 |
Values that can be specified to control which thread priority
|
|
551 |
the RAM defragmentation operations are run with.
|
|
552 |
*/
|
|
553 |
enum TPrioritySpecial
|
|
554 |
{
|
|
555 |
/**
|
|
556 |
The RAM defragmentation operation will use the same thread priority as
|
|
557 |
that of the caller.
|
|
558 |
*/
|
|
559 |
KInheritPriority = -1,
|
|
560 |
};
|
|
561 |
|
|
562 |
private:
|
|
563 |
void SetupPriority(TInt aPriority);
|
|
564 |
|
|
565 |
private:
|
|
566 |
Epoc::TRamDefragOp iOp;
|
|
567 |
TUint iId;
|
|
568 |
TUint iMaxPages;
|
|
569 |
TInt iThreadPriority;
|
|
570 |
TPhysAddr* iPhysAddr;
|
|
571 |
TInt iSpare[6];
|
|
572 |
|
|
573 |
public:
|
|
574 |
friend class Defrag;
|
|
575 |
};
|
|
576 |
|
|
577 |
|
|
578 |
#endif
|
|
579 |
|