25 const TInt KMinorVersionNumber=1; |
25 const TInt KMinorVersionNumber=1; |
26 const TInt KBuildVersionNumber=1; |
26 const TInt KBuildVersionNumber=1; |
27 |
27 |
28 _LIT(KLddName,"Shadow"); |
28 _LIT(KLddName,"Shadow"); |
29 |
29 |
|
30 #ifdef __CPU_X86 |
|
31 const TUint KPageDirectorySize = 1024; |
|
32 const TUint KMaxNumberOfPageDirectories = 1024; |
|
33 const TUint KPsudoX86TTBCR = 512; |
|
34 #else |
|
35 const TUint KPageDirectorySize = 4096; // Full size (ttbr0+ttbr1) |
|
36 const TUint KMaxNumberOfPageDirectories = 256; |
|
37 #endif |
|
38 |
30 class DShadow; |
39 class DShadow; |
31 |
40 |
32 class DShadowFactory : public DLogicalDevice |
41 class DShadowFactory : public DLogicalDevice |
33 // |
42 // |
34 // Shadow ROM LDD factory |
43 // Shadow ROM LDD factory |
50 DShadow(); |
59 DShadow(); |
51 ~DShadow(); |
60 ~DShadow(); |
52 protected: |
61 protected: |
53 virtual TInt DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer); |
62 virtual TInt DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer); |
54 virtual TInt Request(TInt aFunction, TAny* a1, TAny* a2); |
63 virtual TInt Request(TInt aFunction, TAny* a1, TAny* a2); |
|
64 |
|
65 // Memory model specific values will be initialised when the channel is created. |
|
66 TUint iPageDirectoryBase; |
|
67 TUint iPageTableBase; |
|
68 TMemModel iMemoryModel; |
55 }; |
69 }; |
56 |
70 |
57 DECLARE_STANDARD_LDD() |
71 DECLARE_STANDARD_LDD() |
58 { |
72 { |
59 return new DShadowFactory; |
73 return new DShadowFactory; |
109 // |
123 // |
110 { |
124 { |
111 |
125 |
112 if (!Kern::QueryVersionSupported(TVersion(KMajorVersionNumber,KMinorVersionNumber,KBuildVersionNumber),aVer)) |
126 if (!Kern::QueryVersionSupported(TVersion(KMajorVersionNumber,KMinorVersionNumber,KBuildVersionNumber),aVer)) |
113 return KErrNotSupported; |
127 return KErrNotSupported; |
|
128 // Set memory model specific values. |
|
129 TUint32 memoryModelAttrib = (TUint32)Kern::HalFunction(EHalGroupKernel,EKernelHalMemModelInfo,0,0); |
|
130 switch (memoryModelAttrib & EMemModelTypeMask) |
|
131 { |
|
132 case EMemModelTypeMoving: |
|
133 iPageDirectoryBase = 0x61000000; |
|
134 iPageTableBase = 0x62000000; |
|
135 iMemoryModel = EMemModelMoving; |
|
136 break; |
|
137 case EMemModelTypeMultiple: |
|
138 iPageDirectoryBase = 0xC1000000; |
|
139 iPageTableBase = 0xC2000000; |
|
140 iMemoryModel = EMemModelMultiple; |
|
141 break; |
|
142 case EMemModelTypeFlexible: |
|
143 iPageDirectoryBase = 0xF4000000u; |
|
144 iPageTableBase = 0xF8000000u; |
|
145 iMemoryModel = EMemModelFlexible; |
|
146 break; |
|
147 default: |
|
148 iPageDirectoryBase = 0x00000000; |
|
149 iPageTableBase = 0x00000000; |
|
150 iMemoryModel = EMemModelOther; |
|
151 } |
114 return KErrNone; |
152 return KErrNone; |
115 } |
153 } |
116 |
154 |
117 DShadow::~DShadow() |
155 DShadow::~DShadow() |
118 // |
156 // |
289 TUint pageTable; |
327 TUint pageTable; |
290 TUint numPds; |
328 TUint numPds; |
291 |
329 |
292 #ifdef __EPOC32__ |
330 #ifdef __EPOC32__ |
293 |
331 |
294 #if defined(__MEMMODEL_MULTIPLE__) || defined(__MEMMODEL_FLEXIBLE__) |
332 if (iMemoryModel == EMemModelFlexible || iMemoryModel == EMemModelMultiple) |
295 numPds = KMaxNumberOfPageDirectories; |
333 numPds = KMaxNumberOfPageDirectories; |
296 #else |
334 else |
297 numPds = 0; |
335 numPds = 0; |
298 #endif |
336 r = iMemoryModel; |
299 r = KMemoryModel; |
337 #endif |
300 #endif |
338 pageTable = iPageTableBase; |
301 pageTable = KPageTableBase; |
|
302 |
339 |
303 kumemput(a1, &pageTable, sizeof(TUint)); |
340 kumemput(a1, &pageTable, sizeof(TUint)); |
304 kumemput(a2, &numPds, sizeof(TUint)); |
341 kumemput(a2, &numPds, sizeof(TUint)); |
305 break; |
342 break; |
306 } |
343 } |
315 TUint pdSize; |
352 TUint pdSize; |
316 TUint pdBase; |
353 TUint pdBase; |
317 |
354 |
318 r=KErrNoPageTable; |
355 r=KErrNoPageTable; |
319 |
356 |
320 #if defined(__MEMMODEL_MOVING__) |
357 if (iMemoryModel == EMemModelMoving) |
321 |
|
322 if (pd==KGlobalPageDirectory) |
|
323 { |
358 { |
324 pdSize=KPageDirectorySize; |
359 if (pd==KGlobalPageDirectory) |
325 pdBase=KPageDirectoryBase; |
360 { |
326 r = KErrNone; |
361 pdSize=KPageDirectorySize; |
|
362 pdBase=iPageDirectoryBase; |
|
363 r = KErrNone; |
|
364 } |
327 } |
365 } |
328 |
366 else if(iMemoryModel == EMemModelFlexible || iMemoryModel == EMemModelMultiple) |
329 #elif defined(__MEMMODEL_MULTIPLE__) || defined(__MEMMODEL_FLEXIBLE__) |
367 { |
330 |
|
331 #ifdef __CPU_X86 |
368 #ifdef __CPU_X86 |
332 TUint ttbcr = KPsudoX86TTBCR; |
369 TUint ttbcr = KPsudoX86TTBCR; |
333 #else |
370 #else |
334 TUint ttbcr = KPageDirectorySize >> GetTTBCR(); |
371 TUint ttbcr = KPageDirectorySize >> GetTTBCR(); |
335 #endif |
372 #endif // __CPU_X86 |
336 |
373 |
337 if (pd==KGlobalPageDirectory) |
374 if (pd==KGlobalPageDirectory) |
338 { |
375 { |
339 pdSize=KPageDirectorySize - ttbcr; |
376 pdSize=KPageDirectorySize - ttbcr; |
340 pdBase=KPageDirectoryBase + ttbcr*4; |
377 pdBase=iPageDirectoryBase + ttbcr*4; |
341 r = ttbcr & KPageOffsetMask; |
378 r = ttbcr & KPageOffsetMask; |
|
379 } |
|
380 else |
|
381 { |
|
382 pdSize = ttbcr; |
|
383 pdBase=iPageDirectoryBase + pd * KPageDirectorySize * 4; |
|
384 |
|
385 TPhysAddr phys=Epoc::LinearToPhysical((TLinAddr)pdBase); |
|
386 r = (phys==KPhysAddrInvalid) ? KErrNoPageTable : KErrNone; |
|
387 } |
342 } |
388 } |
343 else |
|
344 { |
|
345 pdSize = ttbcr; |
|
346 pdBase=KPageDirectoryBase + pd * KPageDirectorySize * 4; |
|
347 |
|
348 TPhysAddr phys=Epoc::LinearToPhysical((TLinAddr)pdBase); |
|
349 r = (phys==KPhysAddrInvalid) ? KErrNoPageTable : KErrNone; |
|
350 } |
|
351 |
|
352 #endif //memmodel |
|
353 |
389 |
354 if ((r & KErrNoPageTable) == 0) |
390 if ((r & KErrNoPageTable) == 0) |
355 { |
391 { |
356 kumemput(a1, &pdSize, sizeof(TUint)); |
392 kumemput(a1, &pdSize, sizeof(TUint)); |
357 kumemput(a2, &pdBase, sizeof(TUint)); |
393 kumemput(a2, &pdBase, sizeof(TUint)); |