]> git.proxmox.com Git - mirror_edk2.git/blame - UefiCpuPkg/Library/MtrrLib/UnitTest/MtrrLibUnitTest.c
UefiCpuPkg: Apply uncrustify changes
[mirror_edk2.git] / UefiCpuPkg / Library / MtrrLib / UnitTest / MtrrLibUnitTest.c
CommitLineData
e17f459a
RN
1/** @file\r
2 Unit tests of the MtrrLib instance of the MtrrLib class\r
3\r
4 Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>\r
5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
6\r
7**/\r
8\r
9#include "MtrrLibUnitTest.h"\r
10\r
053e878b 11STATIC CONST MTRR_LIB_SYSTEM_PARAMETER mDefaultSystemParameter = {\r
e17f459a
RN
12 42, TRUE, TRUE, CacheUncacheable, 12\r
13};\r
14\r
053e878b 15STATIC MTRR_LIB_SYSTEM_PARAMETER mSystemParameters[] = {\r
e17f459a
RN
16 { 38, TRUE, TRUE, CacheUncacheable, 12 },\r
17 { 38, TRUE, TRUE, CacheWriteBack, 12 },\r
18 { 38, TRUE, TRUE, CacheWriteThrough, 12 },\r
19 { 38, TRUE, TRUE, CacheWriteProtected, 12 },\r
20 { 38, TRUE, TRUE, CacheWriteCombining, 12 },\r
21\r
22 { 42, TRUE, TRUE, CacheUncacheable, 12 },\r
23 { 42, TRUE, TRUE, CacheWriteBack, 12 },\r
24 { 42, TRUE, TRUE, CacheWriteThrough, 12 },\r
25 { 42, TRUE, TRUE, CacheWriteProtected, 12 },\r
26 { 42, TRUE, TRUE, CacheWriteCombining, 12 },\r
27\r
28 { 48, TRUE, TRUE, CacheUncacheable, 12 },\r
29 { 48, TRUE, TRUE, CacheWriteBack, 12 },\r
30 { 48, TRUE, TRUE, CacheWriteThrough, 12 },\r
31 { 48, TRUE, TRUE, CacheWriteProtected, 12 },\r
32 { 48, TRUE, TRUE, CacheWriteCombining, 12 },\r
33};\r
34\r
053e878b 35UINT32 mFixedMtrrsIndex[] = {\r
e17f459a
RN
36 MSR_IA32_MTRR_FIX64K_00000,\r
37 MSR_IA32_MTRR_FIX16K_80000,\r
38 MSR_IA32_MTRR_FIX16K_A0000,\r
39 MSR_IA32_MTRR_FIX4K_C0000,\r
40 MSR_IA32_MTRR_FIX4K_C8000,\r
41 MSR_IA32_MTRR_FIX4K_D0000,\r
42 MSR_IA32_MTRR_FIX4K_D8000,\r
43 MSR_IA32_MTRR_FIX4K_E0000,\r
44 MSR_IA32_MTRR_FIX4K_E8000,\r
45 MSR_IA32_MTRR_FIX4K_F0000,\r
46 MSR_IA32_MTRR_FIX4K_F8000\r
47};\r
48STATIC_ASSERT (\r
49 (ARRAY_SIZE (mFixedMtrrsIndex) == MTRR_NUMBER_OF_FIXED_MTRR),\r
50 "gFixedMtrrIndex does NOT contain all the fixed MTRRs!"\r
51 );\r
52\r
53//\r
54// Context structure to be used for most of the test cases.\r
55//\r
56typedef struct {\r
053e878b 57 CONST MTRR_LIB_SYSTEM_PARAMETER *SystemParameter;\r
e17f459a
RN
58} MTRR_LIB_TEST_CONTEXT;\r
59\r
60//\r
61// Context structure to be used for GetFirmwareVariableMtrrCount() test.\r
62//\r
63typedef struct {\r
053e878b
MK
64 UINT32 NumberOfReservedVariableMtrrs;\r
65 CONST MTRR_LIB_SYSTEM_PARAMETER *SystemParameter;\r
e17f459a
RN
66} MTRR_LIB_GET_FIRMWARE_VARIABLE_MTRR_COUNT_CONTEXT;\r
67\r
053e878b 68STATIC CHAR8 *mCacheDescription[] = { "UC", "WC", "N/A", "N/A", "WT", "WP", "WB" };\r
e17f459a
RN
69\r
70/**\r
71 Compare the actual memory ranges against expected memory ranges and return PASS when they match.\r
72\r
73 @param ExpectedMemoryRanges Expected memory ranges.\r
74 @param ExpectedMemoryRangeCount Count of expected memory ranges.\r
75 @param ActualRanges Actual memory ranges.\r
76 @param ActualRangeCount Count of actual memory ranges.\r
77\r
78 @retval UNIT_TEST_PASSED Test passed.\r
79 @retval others Test failed.\r
80**/\r
81UNIT_TEST_STATUS\r
82VerifyMemoryRanges (\r
83 IN MTRR_MEMORY_RANGE *ExpectedMemoryRanges,\r
84 IN UINTN ExpectedMemoryRangeCount,\r
85 IN MTRR_MEMORY_RANGE *ActualRanges,\r
86 IN UINTN ActualRangeCount\r
87 )\r
88{\r
89 UINTN Index;\r
053e878b 90\r
e17f459a
RN
91 UT_ASSERT_EQUAL (ExpectedMemoryRangeCount, ActualRangeCount);\r
92 for (Index = 0; Index < ExpectedMemoryRangeCount; Index++) {\r
93 UT_ASSERT_EQUAL (ExpectedMemoryRanges[Index].BaseAddress, ActualRanges[Index].BaseAddress);\r
94 UT_ASSERT_EQUAL (ExpectedMemoryRanges[Index].Length, ActualRanges[Index].Length);\r
95 UT_ASSERT_EQUAL (ExpectedMemoryRanges[Index].Type, ActualRanges[Index].Type);\r
96 }\r
97\r
98 return UNIT_TEST_PASSED;\r
99}\r
100\r
101/**\r
102 Dump the memory ranges.\r
103\r
104 @param Ranges Memory ranges to dump.\r
105 @param RangeCount Count of memory ranges.\r
106**/\r
107VOID\r
108DumpMemoryRanges (\r
053e878b
MK
109 MTRR_MEMORY_RANGE *Ranges,\r
110 UINTN RangeCount\r
e17f459a
RN
111 )\r
112{\r
053e878b
MK
113 UINTN Index;\r
114\r
e17f459a
RN
115 for (Index = 0; Index < RangeCount; Index++) {\r
116 UT_LOG_INFO ("\t{ 0x%016llx, 0x%016llx, %a },\n", Ranges[Index].BaseAddress, Ranges[Index].Length, mCacheDescription[Ranges[Index].Type]);\r
117 }\r
118}\r
119\r
120/**\r
121**/\r
122\r
123/**\r
124 Generate random count of MTRRs for each cache type.\r
125\r
126 @param TotalCount Total MTRR count.\r
127 @param UcCount Return count of Uncacheable type.\r
128 @param WtCount Return count of Write Through type.\r
129 @param WbCount Return count of Write Back type.\r
130 @param WpCount Return count of Write Protected type.\r
131 @param WcCount Return count of Write Combining type.\r
132**/\r
133VOID\r
134GenerateRandomMemoryTypeCombination (\r
053e878b
MK
135 IN UINT32 TotalCount,\r
136 OUT UINT32 *UcCount,\r
137 OUT UINT32 *WtCount,\r
138 OUT UINT32 *WbCount,\r
139 OUT UINT32 *WpCount,\r
140 OUT UINT32 *WcCount\r
e17f459a
RN
141 )\r
142{\r
053e878b
MK
143 UINTN Index;\r
144 UINT32 TotalMtrrCount;\r
145 UINT32 *CountPerType[5];\r
e17f459a
RN
146\r
147 CountPerType[0] = UcCount;\r
148 CountPerType[1] = WtCount;\r
149 CountPerType[2] = WbCount;\r
150 CountPerType[3] = WpCount;\r
151 CountPerType[4] = WcCount;\r
152\r
153 //\r
154 // Initialize the count of each cache type to 0.\r
155 //\r
156 for (Index = 0; Index < ARRAY_SIZE (CountPerType); Index++) {\r
157 *(CountPerType[Index]) = 0;\r
158 }\r
159\r
160 //\r
161 // Pick a random count of MTRRs\r
162 //\r
163 TotalMtrrCount = Random32 (1, TotalCount);\r
164 for (Index = 0; Index < TotalMtrrCount; Index++) {\r
165 //\r
166 // For each of them, pick a random cache type.\r
167 //\r
168 (*(CountPerType[Random32 (0, ARRAY_SIZE (CountPerType) - 1)]))++;\r
169 }\r
170}\r
171\r
172/**\r
173 Unit test of MtrrLib service MtrrSetMemoryAttribute()\r
174\r
175 @param[in] Context Ignored\r
176\r
177 @retval UNIT_TEST_PASSED The Unit test has completed and the test\r
178 case was successful.\r
179 @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.\r
180\r
181**/\r
182UNIT_TEST_STATUS\r
183EFIAPI\r
184UnitTestMtrrSetMemoryAttributesInMtrrSettings (\r
185 IN UNIT_TEST_CONTEXT Context\r
186 )\r
187{\r
053e878b
MK
188 CONST MTRR_LIB_SYSTEM_PARAMETER *SystemParameter;\r
189 RETURN_STATUS Status;\r
190 UINT32 UcCount;\r
191 UINT32 WtCount;\r
192 UINT32 WbCount;\r
193 UINT32 WpCount;\r
194 UINT32 WcCount;\r
195\r
196 UINT32 MtrrIndex;\r
197 UINT8 *Scratch;\r
198 UINTN ScratchSize;\r
199 MTRR_SETTINGS LocalMtrrs;\r
200\r
201 MTRR_MEMORY_RANGE RawMtrrRange[MTRR_NUMBER_OF_VARIABLE_MTRR];\r
202 MTRR_MEMORY_RANGE ExpectedMemoryRanges[MTRR_NUMBER_OF_FIXED_MTRR * sizeof (UINT64) + 2 * MTRR_NUMBER_OF_VARIABLE_MTRR + 1];\r
203 UINT32 ExpectedVariableMtrrUsage;\r
204 UINTN ExpectedMemoryRangesCount;\r
205\r
206 MTRR_MEMORY_RANGE ActualMemoryRanges[MTRR_NUMBER_OF_FIXED_MTRR * sizeof (UINT64) + 2 * MTRR_NUMBER_OF_VARIABLE_MTRR + 1];\r
207 UINT32 ActualVariableMtrrUsage;\r
208 UINTN ActualMemoryRangesCount;\r
209\r
210 MTRR_SETTINGS *Mtrrs[2];\r
211\r
212 SystemParameter = (MTRR_LIB_SYSTEM_PARAMETER *)Context;\r
e17f459a
RN
213 GenerateRandomMemoryTypeCombination (\r
214 SystemParameter->VariableMtrrCount - PatchPcdGet32 (PcdCpuNumberOfReservedVariableMtrrs),\r
053e878b
MK
215 &UcCount,\r
216 &WtCount,\r
217 &WbCount,\r
218 &WpCount,\r
219 &WcCount\r
e17f459a
RN
220 );\r
221 GenerateValidAndConfigurableMtrrPairs (\r
053e878b
MK
222 SystemParameter->PhysicalAddressBits,\r
223 RawMtrrRange,\r
224 UcCount,\r
225 WtCount,\r
226 WbCount,\r
227 WpCount,\r
228 WcCount\r
e17f459a
RN
229 );\r
230\r
231 ExpectedVariableMtrrUsage = UcCount + WtCount + WbCount + WpCount + WcCount;\r
232 ExpectedMemoryRangesCount = ARRAY_SIZE (ExpectedMemoryRanges);\r
233 GetEffectiveMemoryRanges (\r
234 SystemParameter->DefaultCacheType,\r
235 SystemParameter->PhysicalAddressBits,\r
053e878b
MK
236 RawMtrrRange,\r
237 ExpectedVariableMtrrUsage,\r
238 ExpectedMemoryRanges,\r
239 &ExpectedMemoryRangesCount\r
e17f459a
RN
240 );\r
241\r
242 UT_LOG_INFO (\r
243 "Total MTRR [%d]: UC=%d, WT=%d, WB=%d, WP=%d, WC=%d\n",\r
053e878b
MK
244 ExpectedVariableMtrrUsage,\r
245 UcCount,\r
246 WtCount,\r
247 WbCount,\r
248 WpCount,\r
249 WcCount\r
e17f459a
RN
250 );\r
251 UT_LOG_INFO ("--- Expected Memory Ranges [%d] ---\n", ExpectedMemoryRangesCount);\r
252 DumpMemoryRanges (ExpectedMemoryRanges, ExpectedMemoryRangesCount);\r
253\r
254 //\r
255 // Default cache type is always an INPUT\r
256 //\r
257 ZeroMem (&LocalMtrrs, sizeof (LocalMtrrs));\r
258 LocalMtrrs.MtrrDefType = MtrrGetDefaultMemoryType ();\r
259 ScratchSize = SCRATCH_BUFFER_SIZE;\r
260 Mtrrs[0] = &LocalMtrrs;\r
261 Mtrrs[1] = NULL;\r
262\r
263 for (MtrrIndex = 0; MtrrIndex < ARRAY_SIZE (Mtrrs); MtrrIndex++) {\r
264 Scratch = calloc (ScratchSize, sizeof (UINT8));\r
053e878b 265 Status = MtrrSetMemoryAttributesInMtrrSettings (Mtrrs[MtrrIndex], Scratch, &ScratchSize, ExpectedMemoryRanges, ExpectedMemoryRangesCount);\r
e17f459a
RN
266 if (Status == RETURN_BUFFER_TOO_SMALL) {\r
267 Scratch = realloc (Scratch, ScratchSize);\r
053e878b 268 Status = MtrrSetMemoryAttributesInMtrrSettings (Mtrrs[MtrrIndex], Scratch, &ScratchSize, ExpectedMemoryRanges, ExpectedMemoryRangesCount);\r
e17f459a 269 }\r
053e878b 270\r
e17f459a
RN
271 UT_ASSERT_STATUS_EQUAL (Status, RETURN_SUCCESS);\r
272\r
273 if (Mtrrs[MtrrIndex] == NULL) {\r
274 ZeroMem (&LocalMtrrs, sizeof (LocalMtrrs));\r
275 MtrrGetAllMtrrs (&LocalMtrrs);\r
276 }\r
053e878b 277\r
e17f459a
RN
278 ActualMemoryRangesCount = ARRAY_SIZE (ActualMemoryRanges);\r
279 CollectTestResult (\r
053e878b
MK
280 SystemParameter->DefaultCacheType,\r
281 SystemParameter->PhysicalAddressBits,\r
282 SystemParameter->VariableMtrrCount,\r
283 &LocalMtrrs,\r
284 ActualMemoryRanges,\r
285 &ActualMemoryRangesCount,\r
286 &ActualVariableMtrrUsage\r
e17f459a
RN
287 );\r
288\r
289 UT_LOG_INFO ("--- Actual Memory Ranges [%d] ---\n", ActualMemoryRangesCount);\r
290 DumpMemoryRanges (ActualMemoryRanges, ActualMemoryRangesCount);\r
291 VerifyMemoryRanges (ExpectedMemoryRanges, ExpectedMemoryRangesCount, ActualMemoryRanges, ActualMemoryRangesCount);\r
292 UT_ASSERT_TRUE (ExpectedVariableMtrrUsage >= ActualVariableMtrrUsage);\r
293\r
294 ZeroMem (&LocalMtrrs, sizeof (LocalMtrrs));\r
295 }\r
296\r
297 free (Scratch);\r
298\r
299 return UNIT_TEST_PASSED;\r
300}\r
301\r
302/**\r
303 Test routine to check whether invalid base/size can be rejected.\r
304\r
305 @param Context Pointer to MTRR_LIB_SYSTEM_PARAMETER.\r
306\r
307 @return Test status.\r
308**/\r
309UNIT_TEST_STATUS\r
310EFIAPI\r
311UnitTestInvalidMemoryLayouts (\r
053e878b 312 IN UNIT_TEST_CONTEXT Context\r
e17f459a
RN
313 )\r
314{\r
053e878b
MK
315 CONST MTRR_LIB_SYSTEM_PARAMETER *SystemParameter;\r
316 MTRR_MEMORY_RANGE Ranges[MTRR_NUMBER_OF_VARIABLE_MTRR * 2 + 1];\r
317 UINTN RangeCount;\r
318 UINT64 MaxAddress;\r
319 UINT32 Index;\r
320 UINT64 BaseAddress;\r
321 UINT64 Length;\r
322 RETURN_STATUS Status;\r
323 UINTN ScratchSize;\r
324\r
325 SystemParameter = (MTRR_LIB_SYSTEM_PARAMETER *)Context;\r
e17f459a
RN
326\r
327 RangeCount = Random32 (1, ARRAY_SIZE (Ranges));\r
328 MaxAddress = 1ull << SystemParameter->PhysicalAddressBits;\r
329\r
330 for (Index = 0; Index < RangeCount; Index++) {\r
331 do {\r
332 BaseAddress = Random64 (0, MaxAddress);\r
333 Length = Random64 (1, MaxAddress - BaseAddress);\r
334 } while (((BaseAddress & 0xFFF) == 0) || ((Length & 0xFFF) == 0));\r
335\r
336 Ranges[Index].BaseAddress = BaseAddress;\r
337 Ranges[Index].Length = Length;\r
338 Ranges[Index].Type = GenerateRandomCacheType ();\r
339\r
340 Status = MtrrSetMemoryAttribute (\r
053e878b
MK
341 Ranges[Index].BaseAddress,\r
342 Ranges[Index].Length,\r
343 Ranges[Index].Type\r
344 );\r
e17f459a
RN
345 UT_ASSERT_TRUE (RETURN_ERROR (Status));\r
346 }\r
347\r
348 ScratchSize = 0;\r
053e878b 349 Status = MtrrSetMemoryAttributesInMtrrSettings (NULL, NULL, &ScratchSize, Ranges, RangeCount);\r
e17f459a
RN
350 UT_ASSERT_TRUE (RETURN_ERROR (Status));\r
351\r
352 return UNIT_TEST_PASSED;\r
353}\r
354\r
355/**\r
356 Unit test of MtrrLib service IsMtrrSupported()\r
357\r
358 @param[in] Context Ignored\r
359\r
360 @retval UNIT_TEST_PASSED The Unit test has completed and the test\r
361 case was successful.\r
362 @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.\r
363\r
364**/\r
365UNIT_TEST_STATUS\r
366EFIAPI\r
367UnitTestIsMtrrSupported (\r
368 IN UNIT_TEST_CONTEXT Context\r
369 )\r
370{\r
371 MTRR_LIB_SYSTEM_PARAMETER SystemParameter;\r
372 MTRR_LIB_TEST_CONTEXT *LocalContext;\r
373\r
053e878b 374 LocalContext = (MTRR_LIB_TEST_CONTEXT *)Context;\r
e17f459a
RN
375\r
376 CopyMem (&SystemParameter, LocalContext->SystemParameter, sizeof (SystemParameter));\r
377 //\r
378 // MTRR capability off in CPUID leaf.\r
379 //\r
380 SystemParameter.MtrrSupported = FALSE;\r
381 InitializeMtrrRegs (&SystemParameter);\r
382 UT_ASSERT_FALSE (IsMtrrSupported ());\r
383\r
384 //\r
385 // MTRR capability on in CPUID leaf, but no variable or fixed MTRRs.\r
386 //\r
053e878b
MK
387 SystemParameter.MtrrSupported = TRUE;\r
388 SystemParameter.VariableMtrrCount = 0;\r
e17f459a
RN
389 SystemParameter.FixedMtrrSupported = FALSE;\r
390 InitializeMtrrRegs (&SystemParameter);\r
391 UT_ASSERT_FALSE (IsMtrrSupported ());\r
392\r
393 //\r
394 // MTRR capability on in CPUID leaf, but no variable MTRRs.\r
395 //\r
053e878b
MK
396 SystemParameter.MtrrSupported = TRUE;\r
397 SystemParameter.VariableMtrrCount = 0;\r
e17f459a
RN
398 SystemParameter.FixedMtrrSupported = TRUE;\r
399 InitializeMtrrRegs (&SystemParameter);\r
400 UT_ASSERT_FALSE (IsMtrrSupported ());\r
401\r
402 //\r
403 // MTRR capability on in CPUID leaf, but no fixed MTRRs.\r
404 //\r
053e878b
MK
405 SystemParameter.MtrrSupported = TRUE;\r
406 SystemParameter.VariableMtrrCount = 7;\r
e17f459a
RN
407 SystemParameter.FixedMtrrSupported = FALSE;\r
408 InitializeMtrrRegs (&SystemParameter);\r
409 UT_ASSERT_FALSE (IsMtrrSupported ());\r
410\r
411 //\r
412 // MTRR capability on in CPUID leaf with both variable and fixed MTRRs.\r
413 //\r
053e878b
MK
414 SystemParameter.MtrrSupported = TRUE;\r
415 SystemParameter.VariableMtrrCount = 7;\r
e17f459a
RN
416 SystemParameter.FixedMtrrSupported = TRUE;\r
417 InitializeMtrrRegs (&SystemParameter);\r
418 UT_ASSERT_TRUE (IsMtrrSupported ());\r
419\r
420 return UNIT_TEST_PASSED;\r
421}\r
422\r
423/**\r
424 Unit test of MtrrLib service GetVariableMtrrCount()\r
425\r
426 @param[in] Context Ignored\r
427\r
428 @retval UNIT_TEST_PASSED The Unit test has completed and the test\r
429 case was successful.\r
430 @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.\r
431\r
432**/\r
433UNIT_TEST_STATUS\r
434EFIAPI\r
435UnitTestGetVariableMtrrCount (\r
436 IN UNIT_TEST_CONTEXT Context\r
437 )\r
438{\r
053e878b
MK
439 UINT32 Result;\r
440 MTRR_LIB_SYSTEM_PARAMETER SystemParameter;\r
441 MTRR_LIB_TEST_CONTEXT *LocalContext;\r
e17f459a 442\r
053e878b 443 LocalContext = (MTRR_LIB_TEST_CONTEXT *)Context;\r
e17f459a
RN
444\r
445 CopyMem (&SystemParameter, LocalContext->SystemParameter, sizeof (SystemParameter));\r
446 //\r
447 // If MTRR capability off in CPUID leaf, then the count is always 0.\r
448 //\r
449 SystemParameter.MtrrSupported = FALSE;\r
450 for (SystemParameter.VariableMtrrCount = 1; SystemParameter.VariableMtrrCount <= MTRR_NUMBER_OF_VARIABLE_MTRR; SystemParameter.VariableMtrrCount++) {\r
451 InitializeMtrrRegs (&SystemParameter);\r
452 Result = GetVariableMtrrCount ();\r
453 UT_ASSERT_EQUAL (Result, 0);\r
454 }\r
455\r
456 //\r
457 // Try all supported variable MTRR counts.\r
458 // If variable MTRR count is > MTRR_NUMBER_OF_VARIABLE_MTRR, then an ASSERT()\r
459 // is generated.\r
460 //\r
461 SystemParameter.MtrrSupported = TRUE;\r
462 for (SystemParameter.VariableMtrrCount = 1; SystemParameter.VariableMtrrCount <= MTRR_NUMBER_OF_VARIABLE_MTRR; SystemParameter.VariableMtrrCount++) {\r
463 InitializeMtrrRegs (&SystemParameter);\r
464 Result = GetVariableMtrrCount ();\r
465 UT_ASSERT_EQUAL (Result, SystemParameter.VariableMtrrCount);\r
466 }\r
467\r
468 //\r
469 // Expect ASSERT() if variable MTRR count is > MTRR_NUMBER_OF_VARIABLE_MTRR\r
470 //\r
471 SystemParameter.VariableMtrrCount = MTRR_NUMBER_OF_VARIABLE_MTRR + 1;\r
472 InitializeMtrrRegs (&SystemParameter);\r
473 UT_EXPECT_ASSERT_FAILURE (GetVariableMtrrCount (), NULL);\r
474\r
053e878b 475 SystemParameter.MtrrSupported = TRUE;\r
e17f459a
RN
476 SystemParameter.VariableMtrrCount = MAX_UINT8;\r
477 InitializeMtrrRegs (&SystemParameter);\r
478 UT_EXPECT_ASSERT_FAILURE (GetVariableMtrrCount (), NULL);\r
479\r
480 return UNIT_TEST_PASSED;\r
481}\r
482\r
483/**\r
484 Unit test of MtrrLib service GetFirmwareVariableMtrrCount()\r
485\r
486 @param[in] Context Ignored\r
487\r
488 @retval UNIT_TEST_PASSED The Unit test has completed and the test\r
489 case was successful.\r
490 @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.\r
491\r
492**/\r
493UNIT_TEST_STATUS\r
494EFIAPI\r
495UnitTestGetFirmwareVariableMtrrCount (\r
496 IN UNIT_TEST_CONTEXT Context\r
497 )\r
498{\r
053e878b
MK
499 UINT32 Result;\r
500 UINT32 ReservedMtrrs;\r
501 MTRR_LIB_SYSTEM_PARAMETER SystemParameter;\r
502 MTRR_LIB_GET_FIRMWARE_VARIABLE_MTRR_COUNT_CONTEXT *LocalContext;\r
e17f459a 503\r
053e878b 504 LocalContext = (MTRR_LIB_GET_FIRMWARE_VARIABLE_MTRR_COUNT_CONTEXT *)Context;\r
e17f459a
RN
505\r
506 CopyMem (&SystemParameter, LocalContext->SystemParameter, sizeof (SystemParameter));\r
507\r
508 InitializeMtrrRegs (&SystemParameter);\r
509 //\r
510 // Positive test cases for VCNT = 10 and Reserved PCD in range 0..10\r
511 //\r
512 for (ReservedMtrrs = 0; ReservedMtrrs <= SystemParameter.VariableMtrrCount; ReservedMtrrs++) {\r
513 PatchPcdSet32 (PcdCpuNumberOfReservedVariableMtrrs, ReservedMtrrs);\r
514 Result = GetFirmwareVariableMtrrCount ();\r
515 UT_ASSERT_EQUAL (Result, SystemParameter.VariableMtrrCount - ReservedMtrrs);\r
516 }\r
517\r
518 //\r
519 // Negative test cases when Reserved PCD is larger than VCNT\r
520 //\r
521 for (ReservedMtrrs = SystemParameter.VariableMtrrCount + 1; ReservedMtrrs <= 255; ReservedMtrrs++) {\r
522 PatchPcdSet32 (PcdCpuNumberOfReservedVariableMtrrs, ReservedMtrrs);\r
523 Result = GetFirmwareVariableMtrrCount ();\r
524 UT_ASSERT_EQUAL (Result, 0);\r
525 }\r
526\r
527 //\r
528 // Negative test cases when Reserved PCD is larger than VCNT\r
529 //\r
530 PatchPcdSet32 (PcdCpuNumberOfReservedVariableMtrrs, MAX_UINT32);\r
531 Result = GetFirmwareVariableMtrrCount ();\r
532 UT_ASSERT_EQUAL (Result, 0);\r
533\r
534 //\r
535 // Negative test case when MTRRs are not supported\r
536 //\r
537 SystemParameter.MtrrSupported = FALSE;\r
538 InitializeMtrrRegs (&SystemParameter);\r
539 PatchPcdSet32 (PcdCpuNumberOfReservedVariableMtrrs, 2);\r
540 Result = GetFirmwareVariableMtrrCount ();\r
541 UT_ASSERT_EQUAL (Result, 0);\r
542\r
543 //\r
544 // Negative test case when Fixed MTRRs are not supported\r
545 //\r
053e878b 546 SystemParameter.MtrrSupported = TRUE;\r
e17f459a
RN
547 SystemParameter.FixedMtrrSupported = FALSE;\r
548 InitializeMtrrRegs (&SystemParameter);\r
549 PatchPcdSet32 (PcdCpuNumberOfReservedVariableMtrrs, 2);\r
550 Result = GetFirmwareVariableMtrrCount ();\r
551 UT_ASSERT_EQUAL (Result, 0);\r
552\r
553 //\r
554 // Expect ASSERT() if variable MTRR count is > MTRR_NUMBER_OF_VARIABLE_MTRR\r
555 //\r
556 SystemParameter.FixedMtrrSupported = TRUE;\r
053e878b 557 SystemParameter.VariableMtrrCount = MTRR_NUMBER_OF_VARIABLE_MTRR + 1;\r
e17f459a
RN
558 InitializeMtrrRegs (&SystemParameter);\r
559 UT_EXPECT_ASSERT_FAILURE (GetFirmwareVariableMtrrCount (), NULL);\r
560\r
561 return UNIT_TEST_PASSED;\r
562}\r
563\r
564/**\r
565 Unit test of MtrrLib service MtrrGetMemoryAttribute()\r
566\r
567 @param[in] Context Ignored\r
568\r
569 @retval UNIT_TEST_PASSED The Unit test has completed and the test\r
570 case was successful.\r
571 @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.\r
572\r
573**/\r
574UNIT_TEST_STATUS\r
575EFIAPI\r
576UnitTestMtrrGetMemoryAttribute (\r
577 IN UNIT_TEST_CONTEXT Context\r
578 )\r
579{\r
580 return UNIT_TEST_PASSED;\r
581}\r
582\r
583/**\r
584 Unit test of MtrrLib service MtrrGetFixedMtrr()\r
585\r
586 @param[in] Context Ignored\r
587\r
588 @retval UNIT_TEST_PASSED The Unit test has completed and the test\r
589 case was successful.\r
590 @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.\r
591\r
592**/\r
593UNIT_TEST_STATUS\r
594EFIAPI\r
595UnitTestMtrrGetFixedMtrr (\r
596 IN UNIT_TEST_CONTEXT Context\r
597 )\r
598{\r
053e878b
MK
599 MTRR_FIXED_SETTINGS *Result;\r
600 MTRR_FIXED_SETTINGS ExpectedFixedSettings;\r
601 MTRR_FIXED_SETTINGS FixedSettings;\r
602 UINTN Index;\r
603 UINTN MsrIndex;\r
604 UINTN ByteIndex;\r
605 UINT64 MsrValue;\r
606 MTRR_LIB_SYSTEM_PARAMETER SystemParameter;\r
607 MTRR_LIB_TEST_CONTEXT *LocalContext;\r
608\r
609 LocalContext = (MTRR_LIB_TEST_CONTEXT *)Context;\r
e17f459a
RN
610\r
611 CopyMem (&SystemParameter, LocalContext->SystemParameter, sizeof (SystemParameter));\r
612 InitializeMtrrRegs (&SystemParameter);\r
613 //\r
614 // Set random cache type to different ranges under 1MB and make sure\r
615 // the fixed MTRR settings are expected.\r
616 // Try 100 times.\r
617 //\r
618 for (Index = 0; Index < 100; Index++) {\r
619 for (MsrIndex = 0; MsrIndex < ARRAY_SIZE (mFixedMtrrsIndex); MsrIndex++) {\r
620 MsrValue = 0;\r
621 for (ByteIndex = 0; ByteIndex < sizeof (UINT64); ByteIndex++) {\r
622 MsrValue = MsrValue | LShiftU64 (GenerateRandomCacheType (), ByteIndex * 8);\r
623 }\r
053e878b 624\r
e17f459a
RN
625 ExpectedFixedSettings.Mtrr[MsrIndex] = MsrValue;\r
626 AsmWriteMsr64 (mFixedMtrrsIndex[MsrIndex], MsrValue);\r
627 }\r
628\r
629 Result = MtrrGetFixedMtrr (&FixedSettings);\r
15e635d1 630 UT_ASSERT_EQUAL ((UINTN)Result, (UINTN)&FixedSettings);\r
e17f459a
RN
631 UT_ASSERT_MEM_EQUAL (&FixedSettings, &ExpectedFixedSettings, sizeof (FixedSettings));\r
632 }\r
633\r
634 //\r
635 // Negative test case when MTRRs are not supported\r
636 //\r
637 SystemParameter.MtrrSupported = FALSE;\r
638 InitializeMtrrRegs (&SystemParameter);\r
639\r
640 ZeroMem (&FixedSettings, sizeof (FixedSettings));\r
641 ZeroMem (&ExpectedFixedSettings, sizeof (ExpectedFixedSettings));\r
642 Result = MtrrGetFixedMtrr (&FixedSettings);\r
15e635d1 643 UT_ASSERT_EQUAL ((UINTN)Result, (UINTN)&FixedSettings);\r
e17f459a
RN
644 UT_ASSERT_MEM_EQUAL (&ExpectedFixedSettings, &FixedSettings, sizeof (ExpectedFixedSettings));\r
645\r
646 return UNIT_TEST_PASSED;\r
647}\r
648\r
649/**\r
650 Unit test of MtrrLib service MtrrGetAllMtrrs()\r
651\r
652 @param[in] Context Ignored\r
653\r
654 @retval UNIT_TEST_PASSED The Unit test has completed and the test\r
655 case was successful.\r
656 @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.\r
657\r
658**/\r
659UNIT_TEST_STATUS\r
660EFIAPI\r
661UnitTestMtrrGetAllMtrrs (\r
053e878b 662 IN UNIT_TEST_CONTEXT Context\r
e17f459a
RN
663 )\r
664{\r
053e878b
MK
665 MTRR_SETTINGS *Result;\r
666 MTRR_SETTINGS Mtrrs;\r
667 MTRR_SETTINGS ExpectedMtrrs;\r
668 MTRR_VARIABLE_SETTING VariableMtrr[MTRR_NUMBER_OF_VARIABLE_MTRR];\r
669 UINT32 Index;\r
670 MTRR_LIB_SYSTEM_PARAMETER SystemParameter;\r
671 MTRR_LIB_TEST_CONTEXT *LocalContext;\r
e17f459a 672\r
053e878b 673 LocalContext = (MTRR_LIB_TEST_CONTEXT *)Context;\r
e17f459a
RN
674\r
675 CopyMem (&SystemParameter, LocalContext->SystemParameter, sizeof (SystemParameter));\r
676 InitializeMtrrRegs (&SystemParameter);\r
677\r
678 for (Index = 0; Index < SystemParameter.VariableMtrrCount; Index++) {\r
679 GenerateRandomMtrrPair (SystemParameter.PhysicalAddressBits, GenerateRandomCacheType (), &VariableMtrr[Index], NULL);\r
680 AsmWriteMsr64 (MSR_IA32_MTRR_PHYSBASE0 + (Index << 1), VariableMtrr[Index].Base);\r
681 AsmWriteMsr64 (MSR_IA32_MTRR_PHYSMASK0 + (Index << 1), VariableMtrr[Index].Mask);\r
682 }\r
053e878b 683\r
e17f459a 684 Result = MtrrGetAllMtrrs (&Mtrrs);\r
15e635d1 685 UT_ASSERT_EQUAL ((UINTN)Result, (UINTN)&Mtrrs);\r
e17f459a
RN
686 UT_ASSERT_MEM_EQUAL (Mtrrs.Variables.Mtrr, VariableMtrr, sizeof (MTRR_VARIABLE_SETTING) * SystemParameter.VariableMtrrCount);\r
687\r
688 //\r
689 // Negative test case when MTRRs are not supported\r
690 //\r
691 ZeroMem (&ExpectedMtrrs, sizeof (ExpectedMtrrs));\r
692 ZeroMem (&Mtrrs, sizeof (Mtrrs));\r
693\r
694 SystemParameter.MtrrSupported = FALSE;\r
695 InitializeMtrrRegs (&SystemParameter);\r
696 Result = MtrrGetAllMtrrs (&Mtrrs);\r
15e635d1 697 UT_ASSERT_EQUAL ((UINTN)Result, (UINTN)&Mtrrs);\r
e17f459a
RN
698 UT_ASSERT_MEM_EQUAL (&ExpectedMtrrs, &Mtrrs, sizeof (ExpectedMtrrs));\r
699\r
700 //\r
701 // Expect ASSERT() if variable MTRR count is > MTRR_NUMBER_OF_VARIABLE_MTRR\r
702 //\r
053e878b 703 SystemParameter.MtrrSupported = TRUE;\r
e17f459a
RN
704 SystemParameter.VariableMtrrCount = MTRR_NUMBER_OF_VARIABLE_MTRR + 1;\r
705 InitializeMtrrRegs (&SystemParameter);\r
706 UT_EXPECT_ASSERT_FAILURE (MtrrGetAllMtrrs (&Mtrrs), NULL);\r
707\r
708 return UNIT_TEST_PASSED;\r
709}\r
710\r
711/**\r
712 Unit test of MtrrLib service MtrrSetAllMtrrs()\r
713\r
714 @param[in] Context Ignored\r
715\r
716 @retval UNIT_TEST_PASSED The Unit test has completed and the test\r
717 case was successful.\r
718 @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.\r
719\r
720**/\r
721UNIT_TEST_STATUS\r
722EFIAPI\r
723UnitTestMtrrSetAllMtrrs (\r
724 IN UNIT_TEST_CONTEXT Context\r
725 )\r
726{\r
053e878b
MK
727 MTRR_SETTINGS *Result;\r
728 MTRR_SETTINGS Mtrrs;\r
729 UINT32 Index;\r
730 MSR_IA32_MTRR_DEF_TYPE_REGISTER Default;\r
731 MTRR_LIB_SYSTEM_PARAMETER SystemParameter;\r
732 MTRR_LIB_TEST_CONTEXT *LocalContext;\r
e17f459a 733\r
053e878b 734 LocalContext = (MTRR_LIB_TEST_CONTEXT *)Context;\r
e17f459a
RN
735\r
736 CopyMem (&SystemParameter, LocalContext->SystemParameter, sizeof (SystemParameter));\r
737 InitializeMtrrRegs (&SystemParameter);\r
738\r
053e878b
MK
739 Default.Uint64 = 0;\r
740 Default.Bits.E = 1;\r
741 Default.Bits.FE = 1;\r
e17f459a
RN
742 Default.Bits.Type = GenerateRandomCacheType ();\r
743\r
744 ZeroMem (&Mtrrs, sizeof (Mtrrs));\r
745 Mtrrs.MtrrDefType = Default.Uint64;\r
746 for (Index = 0; Index < SystemParameter.VariableMtrrCount; Index++) {\r
747 GenerateRandomMtrrPair (SystemParameter.PhysicalAddressBits, GenerateRandomCacheType (), &Mtrrs.Variables.Mtrr[Index], NULL);\r
748 }\r
053e878b 749\r
e17f459a 750 Result = MtrrSetAllMtrrs (&Mtrrs);\r
15e635d1 751 UT_ASSERT_EQUAL ((UINTN)Result, (UINTN)&Mtrrs);\r
e17f459a
RN
752\r
753 UT_ASSERT_EQUAL (AsmReadMsr64 (MSR_IA32_MTRR_DEF_TYPE), Mtrrs.MtrrDefType);\r
754 for (Index = 0; Index < SystemParameter.VariableMtrrCount; Index++) {\r
755 UT_ASSERT_EQUAL (AsmReadMsr64 (MSR_IA32_MTRR_PHYSBASE0 + (Index << 1)), Mtrrs.Variables.Mtrr[Index].Base);\r
756 UT_ASSERT_EQUAL (AsmReadMsr64 (MSR_IA32_MTRR_PHYSMASK0 + (Index << 1)), Mtrrs.Variables.Mtrr[Index].Mask);\r
757 }\r
758\r
759 return UNIT_TEST_PASSED;\r
760}\r
761\r
762/**\r
763 Unit test of MtrrLib service MtrrGetMemoryAttributeInVariableMtrr()\r
764\r
765 @param[in] Context Ignored\r
766\r
767 @retval UNIT_TEST_PASSED The Unit test has completed and the test\r
768 case was successful.\r
769 @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.\r
770\r
771**/\r
772UNIT_TEST_STATUS\r
773EFIAPI\r
774UnitTestMtrrGetMemoryAttributeInVariableMtrr (\r
775 IN UNIT_TEST_CONTEXT Context\r
776 )\r
777{\r
053e878b
MK
778 MTRR_LIB_TEST_CONTEXT *LocalContext;\r
779 MTRR_LIB_SYSTEM_PARAMETER SystemParameter;\r
780 UINT32 Result;\r
781 MTRR_VARIABLE_SETTING VariableSetting[MTRR_NUMBER_OF_VARIABLE_MTRR];\r
782 VARIABLE_MTRR VariableMtrr[MTRR_NUMBER_OF_VARIABLE_MTRR];\r
783 UINT64 ValidMtrrBitsMask;\r
784 UINT64 ValidMtrrAddressMask;\r
785 UINT32 Index;\r
786 MSR_IA32_MTRR_PHYSBASE_REGISTER Base;\r
787 MSR_IA32_MTRR_PHYSMASK_REGISTER Mask;\r
788\r
789 LocalContext = (MTRR_LIB_TEST_CONTEXT *)Context;\r
e17f459a
RN
790\r
791 CopyMem (&SystemParameter, LocalContext->SystemParameter, sizeof (SystemParameter));\r
792\r
793 InitializeMtrrRegs (&SystemParameter);\r
794\r
795 ValidMtrrBitsMask = (1ull << SystemParameter.PhysicalAddressBits) - 1;\r
796 ValidMtrrAddressMask = ValidMtrrBitsMask & 0xfffffffffffff000ULL;\r
797\r
798 for (Index = 0; Index < SystemParameter.VariableMtrrCount; Index++) {\r
799 GenerateRandomMtrrPair (SystemParameter.PhysicalAddressBits, GenerateRandomCacheType (), &VariableSetting[Index], NULL);\r
800 AsmWriteMsr64 (MSR_IA32_MTRR_PHYSBASE0 + (Index << 1), VariableSetting[Index].Base);\r
801 AsmWriteMsr64 (MSR_IA32_MTRR_PHYSMASK0 + (Index << 1), VariableSetting[Index].Mask);\r
802 }\r
053e878b 803\r
e17f459a
RN
804 Result = MtrrGetMemoryAttributeInVariableMtrr (ValidMtrrBitsMask, ValidMtrrAddressMask, VariableMtrr);\r
805 UT_ASSERT_EQUAL (Result, SystemParameter.VariableMtrrCount);\r
806\r
807 for (Index = 0; Index < SystemParameter.VariableMtrrCount; Index++) {\r
808 Base.Uint64 = VariableMtrr[Index].BaseAddress;\r
053e878b 809 Base.Bits.Type = (UINT32)VariableMtrr[Index].Type;\r
e17f459a
RN
810 UT_ASSERT_EQUAL (Base.Uint64, VariableSetting[Index].Base);\r
811\r
053e878b
MK
812 Mask.Uint64 = ~(VariableMtrr[Index].Length - 1) & ValidMtrrBitsMask;\r
813 Mask.Bits.V = 1;\r
e17f459a
RN
814 UT_ASSERT_EQUAL (Mask.Uint64, VariableSetting[Index].Mask);\r
815 }\r
816\r
817 //\r
818 // Negative test case when MTRRs are not supported\r
819 //\r
820 SystemParameter.MtrrSupported = FALSE;\r
821 InitializeMtrrRegs (&SystemParameter);\r
822 Result = MtrrGetMemoryAttributeInVariableMtrr (ValidMtrrBitsMask, ValidMtrrAddressMask, VariableMtrr);\r
823 UT_ASSERT_EQUAL (Result, 0);\r
824\r
825 //\r
826 // Expect ASSERT() if variable MTRR count is > MTRR_NUMBER_OF_VARIABLE_MTRR\r
827 //\r
053e878b 828 SystemParameter.MtrrSupported = TRUE;\r
e17f459a
RN
829 SystemParameter.VariableMtrrCount = MTRR_NUMBER_OF_VARIABLE_MTRR + 1;\r
830 InitializeMtrrRegs (&SystemParameter);\r
831 UT_EXPECT_ASSERT_FAILURE (MtrrGetMemoryAttributeInVariableMtrr (ValidMtrrBitsMask, ValidMtrrAddressMask, VariableMtrr), NULL);\r
832\r
833 return UNIT_TEST_PASSED;\r
834}\r
835\r
836/**\r
837 Unit test of MtrrLib service MtrrDebugPrintAllMtrrs()\r
838\r
839 @param[in] Context Ignored\r
840\r
841 @retval UNIT_TEST_PASSED The Unit test has completed and the test\r
842 case was successful.\r
843 @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.\r
844\r
845**/\r
846UNIT_TEST_STATUS\r
847EFIAPI\r
848UnitTestMtrrDebugPrintAllMtrrs (\r
849 IN UNIT_TEST_CONTEXT Context\r
850 )\r
851{\r
852 return UNIT_TEST_PASSED;\r
853}\r
854\r
855/**\r
856 Unit test of MtrrLib service MtrrGetDefaultMemoryType().\r
857\r
858 @param[in] Context Ignored\r
859\r
860 @retval UNIT_TEST_PASSED The Unit test has completed and the test\r
861 case was successful.\r
862 @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.\r
863\r
864**/\r
865UNIT_TEST_STATUS\r
866EFIAPI\r
867UnitTestMtrrGetDefaultMemoryType (\r
868 IN UNIT_TEST_CONTEXT Context\r
869 )\r
870{\r
053e878b
MK
871 MTRR_LIB_TEST_CONTEXT *LocalContext;\r
872 UINTN Index;\r
873 MTRR_MEMORY_CACHE_TYPE Result;\r
874 MTRR_LIB_SYSTEM_PARAMETER SystemParameter;\r
875 MTRR_MEMORY_CACHE_TYPE CacheType[5];\r
e17f459a
RN
876\r
877 CacheType[0] = CacheUncacheable;\r
878 CacheType[1] = CacheWriteCombining;\r
879 CacheType[2] = CacheWriteThrough;\r
880 CacheType[3] = CacheWriteProtected;\r
881 CacheType[4] = CacheWriteBack;\r
882\r
053e878b 883 LocalContext = (MTRR_LIB_TEST_CONTEXT *)Context;\r
e17f459a
RN
884\r
885 CopyMem (&SystemParameter, LocalContext->SystemParameter, sizeof (SystemParameter));\r
886 //\r
887 // If MTRRs are supported, then always return the cache type in the MSR\r
888 // MSR_IA32_MTRR_DEF_TYPE\r
889 //\r
890 for (Index = 0; Index < ARRAY_SIZE (CacheType); Index++) {\r
891 SystemParameter.DefaultCacheType = CacheType[Index];\r
892 InitializeMtrrRegs (&SystemParameter);\r
893 Result = MtrrGetDefaultMemoryType ();\r
894 UT_ASSERT_EQUAL (Result, SystemParameter.DefaultCacheType);\r
895 }\r
896\r
897 //\r
898 // If MTRRs are not supported, then always return CacheUncacheable\r
899 //\r
900 SystemParameter.MtrrSupported = FALSE;\r
901 InitializeMtrrRegs (&SystemParameter);\r
902 Result = MtrrGetDefaultMemoryType ();\r
903 UT_ASSERT_EQUAL (Result, CacheUncacheable);\r
904\r
053e878b 905 SystemParameter.MtrrSupported = TRUE;\r
e17f459a
RN
906 SystemParameter.FixedMtrrSupported = FALSE;\r
907 InitializeMtrrRegs (&SystemParameter);\r
908 Result = MtrrGetDefaultMemoryType ();\r
909 UT_ASSERT_EQUAL (Result, CacheUncacheable);\r
910\r
053e878b 911 SystemParameter.MtrrSupported = TRUE;\r
e17f459a 912 SystemParameter.FixedMtrrSupported = TRUE;\r
053e878b 913 SystemParameter.VariableMtrrCount = 0;\r
e17f459a
RN
914 InitializeMtrrRegs (&SystemParameter);\r
915 Result = MtrrGetDefaultMemoryType ();\r
916 UT_ASSERT_EQUAL (Result, CacheUncacheable);\r
917\r
918 return UNIT_TEST_PASSED;\r
919}\r
920\r
921/**\r
922 Unit test of MtrrLib service MtrrSetMemoryAttributeInMtrrSettings().\r
923\r
924 @param[in] Context Ignored\r
925\r
926 @retval UNIT_TEST_PASSED The Unit test has completed and the test\r
927 case was successful.\r
928 @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.\r
929\r
930**/\r
931UNIT_TEST_STATUS\r
932EFIAPI\r
933UnitTestMtrrSetMemoryAttributeInMtrrSettings (\r
934 IN UNIT_TEST_CONTEXT Context\r
935 )\r
936{\r
053e878b
MK
937 CONST MTRR_LIB_SYSTEM_PARAMETER *SystemParameter;\r
938 RETURN_STATUS Status;\r
939 UINT32 UcCount;\r
940 UINT32 WtCount;\r
941 UINT32 WbCount;\r
942 UINT32 WpCount;\r
943 UINT32 WcCount;\r
944\r
945 UINTN MtrrIndex;\r
946 UINTN Index;\r
947 MTRR_SETTINGS LocalMtrrs;\r
948\r
949 MTRR_MEMORY_RANGE RawMtrrRange[MTRR_NUMBER_OF_VARIABLE_MTRR];\r
950 MTRR_MEMORY_RANGE ExpectedMemoryRanges[MTRR_NUMBER_OF_FIXED_MTRR * sizeof (UINT64) + 2 * MTRR_NUMBER_OF_VARIABLE_MTRR + 1];\r
951 UINT32 ExpectedVariableMtrrUsage;\r
952 UINTN ExpectedMemoryRangesCount;\r
953\r
954 MTRR_MEMORY_RANGE ActualMemoryRanges[MTRR_NUMBER_OF_FIXED_MTRR * sizeof (UINT64) + 2 * MTRR_NUMBER_OF_VARIABLE_MTRR + 1];\r
955 UINT32 ActualVariableMtrrUsage;\r
956 UINTN ActualMemoryRangesCount;\r
957\r
958 MTRR_SETTINGS *Mtrrs[2];\r
959\r
960 SystemParameter = (MTRR_LIB_SYSTEM_PARAMETER *)Context;\r
e17f459a
RN
961 GenerateRandomMemoryTypeCombination (\r
962 SystemParameter->VariableMtrrCount - PatchPcdGet32 (PcdCpuNumberOfReservedVariableMtrrs),\r
053e878b
MK
963 &UcCount,\r
964 &WtCount,\r
965 &WbCount,\r
966 &WpCount,\r
967 &WcCount\r
e17f459a
RN
968 );\r
969 GenerateValidAndConfigurableMtrrPairs (\r
053e878b
MK
970 SystemParameter->PhysicalAddressBits,\r
971 RawMtrrRange,\r
972 UcCount,\r
973 WtCount,\r
974 WbCount,\r
975 WpCount,\r
976 WcCount\r
e17f459a
RN
977 );\r
978\r
979 ExpectedVariableMtrrUsage = UcCount + WtCount + WbCount + WpCount + WcCount;\r
980 ExpectedMemoryRangesCount = ARRAY_SIZE (ExpectedMemoryRanges);\r
981 GetEffectiveMemoryRanges (\r
982 SystemParameter->DefaultCacheType,\r
983 SystemParameter->PhysicalAddressBits,\r
053e878b
MK
984 RawMtrrRange,\r
985 ExpectedVariableMtrrUsage,\r
986 ExpectedMemoryRanges,\r
987 &ExpectedMemoryRangesCount\r
e17f459a
RN
988 );\r
989\r
990 UT_LOG_INFO ("--- Expected Memory Ranges [%d] ---\n", ExpectedMemoryRangesCount);\r
991 DumpMemoryRanges (ExpectedMemoryRanges, ExpectedMemoryRangesCount);\r
992 //\r
993 // Default cache type is always an INPUT\r
994 //\r
995 ZeroMem (&LocalMtrrs, sizeof (LocalMtrrs));\r
996 LocalMtrrs.MtrrDefType = MtrrGetDefaultMemoryType ();\r
997 Mtrrs[0] = &LocalMtrrs;\r
998 Mtrrs[1] = NULL;\r
999\r
1000 for (MtrrIndex = 0; MtrrIndex < ARRAY_SIZE (Mtrrs); MtrrIndex++) {\r
1001 for (Index = 0; Index < ExpectedMemoryRangesCount; Index++) {\r
1002 Status = MtrrSetMemoryAttributeInMtrrSettings (\r
1003 Mtrrs[MtrrIndex],\r
1004 ExpectedMemoryRanges[Index].BaseAddress,\r
1005 ExpectedMemoryRanges[Index].Length,\r
1006 ExpectedMemoryRanges[Index].Type\r
1007 );\r
1008 UT_ASSERT_TRUE (Status == RETURN_SUCCESS || Status == RETURN_OUT_OF_RESOURCES || Status == RETURN_BUFFER_TOO_SMALL);\r
053e878b 1009 if ((Status == RETURN_OUT_OF_RESOURCES) || (Status == RETURN_BUFFER_TOO_SMALL)) {\r
e17f459a
RN
1010 return UNIT_TEST_SKIPPED;\r
1011 }\r
1012 }\r
1013\r
1014 if (Mtrrs[MtrrIndex] == NULL) {\r
1015 ZeroMem (&LocalMtrrs, sizeof (LocalMtrrs));\r
1016 MtrrGetAllMtrrs (&LocalMtrrs);\r
1017 }\r
053e878b 1018\r
e17f459a
RN
1019 ActualMemoryRangesCount = ARRAY_SIZE (ActualMemoryRanges);\r
1020 CollectTestResult (\r
053e878b
MK
1021 SystemParameter->DefaultCacheType,\r
1022 SystemParameter->PhysicalAddressBits,\r
1023 SystemParameter->VariableMtrrCount,\r
1024 &LocalMtrrs,\r
1025 ActualMemoryRanges,\r
1026 &ActualMemoryRangesCount,\r
1027 &ActualVariableMtrrUsage\r
e17f459a
RN
1028 );\r
1029 UT_LOG_INFO ("--- Actual Memory Ranges [%d] ---\n", ActualMemoryRangesCount);\r
1030 DumpMemoryRanges (ActualMemoryRanges, ActualMemoryRangesCount);\r
1031 VerifyMemoryRanges (ExpectedMemoryRanges, ExpectedMemoryRangesCount, ActualMemoryRanges, ActualMemoryRangesCount);\r
1032 UT_ASSERT_TRUE (ExpectedVariableMtrrUsage >= ActualVariableMtrrUsage);\r
1033\r
1034 ZeroMem (&LocalMtrrs, sizeof (LocalMtrrs));\r
1035 }\r
1036\r
1037 return UNIT_TEST_PASSED;\r
1038}\r
1039\r
e17f459a
RN
1040/**\r
1041 Prep routine for UnitTestGetFirmwareVariableMtrrCount().\r
1042\r
1043 @param Context Point to a UINT32 data to save the PcdCpuNumberOfReservedVariableMtrrs.\r
1044**/\r
1045UNIT_TEST_STATUS\r
1046EFIAPI\r
1047SavePcdValue (\r
1048 UNIT_TEST_CONTEXT Context\r
1049 )\r
1050{\r
1051 MTRR_LIB_GET_FIRMWARE_VARIABLE_MTRR_COUNT_CONTEXT *LocalContext;\r
1052\r
053e878b 1053 LocalContext = (MTRR_LIB_GET_FIRMWARE_VARIABLE_MTRR_COUNT_CONTEXT *)Context;\r
e17f459a
RN
1054 LocalContext->NumberOfReservedVariableMtrrs = PatchPcdGet32 (PcdCpuNumberOfReservedVariableMtrrs);\r
1055 return UNIT_TEST_PASSED;\r
1056}\r
1057\r
1058/**\r
1059 Clean up routine for UnitTestGetFirmwareVariableMtrrCount().\r
1060\r
1061 @param Context Point to a UINT32 data to save the PcdCpuNumberOfReservedVariableMtrrs.\r
1062**/\r
1063VOID\r
1064EFIAPI\r
1065RestorePcdValue (\r
1066 UNIT_TEST_CONTEXT Context\r
1067 )\r
1068{\r
1069 MTRR_LIB_GET_FIRMWARE_VARIABLE_MTRR_COUNT_CONTEXT *LocalContext;\r
1070\r
053e878b 1071 LocalContext = (MTRR_LIB_GET_FIRMWARE_VARIABLE_MTRR_COUNT_CONTEXT *)Context;\r
e17f459a
RN
1072 PatchPcdSet32 (PcdCpuNumberOfReservedVariableMtrrs, LocalContext->NumberOfReservedVariableMtrrs);\r
1073}\r
1074\r
1075/**\r
1076 Initialize the unit test framework, suite, and unit tests for the\r
1077 ResetSystemLib and run the ResetSystemLib unit test.\r
1078\r
1079 @param Iteration Iteration of testing MtrrSetMemoryAttributeInMtrrSettings\r
1080 and MtrrSetMemoryAttributesInMtrrSettings using random inputs.\r
1081\r
1082 @retval EFI_SUCCESS All test cases were dispatched.\r
1083 @retval EFI_OUT_OF_RESOURCES There are not enough resources available to\r
1084 initialize the unit tests.\r
1085**/\r
1086STATIC\r
1087EFI_STATUS\r
1088EFIAPI\r
1089UnitTestingEntry (\r
053e878b 1090 UINTN Iteration\r
e17f459a
RN
1091 )\r
1092{\r
053e878b
MK
1093 EFI_STATUS Status;\r
1094 UNIT_TEST_FRAMEWORK_HANDLE Framework;\r
1095 UNIT_TEST_SUITE_HANDLE MtrrApiTests;\r
1096 UINTN Index;\r
1097 UINTN SystemIndex;\r
1098 MTRR_LIB_TEST_CONTEXT Context;\r
1099 MTRR_LIB_GET_FIRMWARE_VARIABLE_MTRR_COUNT_CONTEXT GetFirmwareVariableMtrrCountContext;\r
e17f459a
RN
1100\r
1101 Context.SystemParameter = &mDefaultSystemParameter;\r
1102 GetFirmwareVariableMtrrCountContext.SystemParameter = &mDefaultSystemParameter;\r
053e878b 1103 Framework = NULL;\r
e17f459a 1104\r
e17f459a
RN
1105 //\r
1106 // Setup the test framework for running the tests.\r
1107 //\r
1108 Status = InitUnitTestFramework (&Framework, UNIT_TEST_APP_NAME, gEfiCallerBaseName, UNIT_TEST_APP_VERSION);\r
1109 if (EFI_ERROR (Status)) {\r
1110 DEBUG ((DEBUG_ERROR, "Failed in InitUnitTestFramework. Status = %r\n", Status));\r
1111 goto EXIT;\r
1112 }\r
1113\r
1114 //\r
1115 // --------------Suite-----------Description--------------Name----------Function--------Pre---Post-------------------Context-----------\r
1116 //\r
1117\r
1118 //\r
1119 // Populate the MtrrLib API Unit Test Suite.\r
1120 //\r
1121 Status = CreateUnitTestSuite (&MtrrApiTests, Framework, "MtrrLib API Tests", "MtrrLib.MtrrLib", NULL, NULL);\r
1122 if (EFI_ERROR (Status)) {\r
1123 DEBUG ((DEBUG_ERROR, "Failed in CreateUnitTestSuite for MtrrLib API Tests\n"));\r
1124 Status = EFI_OUT_OF_RESOURCES;\r
1125 goto EXIT;\r
1126 }\r
053e878b
MK
1127\r
1128 AddTestCase (MtrrApiTests, "Test IsMtrrSupported", "MtrrSupported", UnitTestIsMtrrSupported, NULL, NULL, &Context);\r
1129 AddTestCase (MtrrApiTests, "Test GetVariableMtrrCount", "GetVariableMtrrCount", UnitTestGetVariableMtrrCount, NULL, NULL, &Context);\r
1130 AddTestCase (MtrrApiTests, "Test GetFirmwareVariableMtrrCount", "GetFirmwareVariableMtrrCount", UnitTestGetFirmwareVariableMtrrCount, SavePcdValue, RestorePcdValue, &GetFirmwareVariableMtrrCountContext);\r
1131 AddTestCase (MtrrApiTests, "Test MtrrGetMemoryAttribute", "MtrrGetMemoryAttribute", UnitTestMtrrGetMemoryAttribute, NULL, NULL, &Context);\r
1132 AddTestCase (MtrrApiTests, "Test MtrrGetFixedMtrr", "MtrrGetFixedMtrr", UnitTestMtrrGetFixedMtrr, NULL, NULL, &Context);\r
1133 AddTestCase (MtrrApiTests, "Test MtrrGetAllMtrrs", "MtrrGetAllMtrrs", UnitTestMtrrGetAllMtrrs, NULL, NULL, &Context);\r
1134 AddTestCase (MtrrApiTests, "Test MtrrSetAllMtrrs", "MtrrSetAllMtrrs", UnitTestMtrrSetAllMtrrs, NULL, NULL, &Context);\r
e17f459a 1135 AddTestCase (MtrrApiTests, "Test MtrrGetMemoryAttributeInVariableMtrr", "MtrrGetMemoryAttributeInVariableMtrr", UnitTestMtrrGetMemoryAttributeInVariableMtrr, NULL, NULL, &Context);\r
053e878b
MK
1136 AddTestCase (MtrrApiTests, "Test MtrrDebugPrintAllMtrrs", "MtrrDebugPrintAllMtrrs", UnitTestMtrrDebugPrintAllMtrrs, NULL, NULL, &Context);\r
1137 AddTestCase (MtrrApiTests, "Test MtrrGetDefaultMemoryType", "MtrrGetDefaultMemoryType", UnitTestMtrrGetDefaultMemoryType, NULL, NULL, &Context);\r
e17f459a
RN
1138\r
1139 for (SystemIndex = 0; SystemIndex < ARRAY_SIZE (mSystemParameters); SystemIndex++) {\r
1140 for (Index = 0; Index < Iteration; Index++) {\r
053e878b
MK
1141 AddTestCase (MtrrApiTests, "Test InvalidMemoryLayouts", "InvalidMemoryLayouts", UnitTestInvalidMemoryLayouts, InitializeSystem, NULL, &mSystemParameters[SystemIndex]);\r
1142 AddTestCase (MtrrApiTests, "Test MtrrSetMemoryAttributeInMtrrSettings", "MtrrSetMemoryAttributeInMtrrSettings", UnitTestMtrrSetMemoryAttributeInMtrrSettings, InitializeSystem, NULL, &mSystemParameters[SystemIndex]);\r
e17f459a
RN
1143 AddTestCase (MtrrApiTests, "Test MtrrSetMemoryAttributesInMtrrSettings", "MtrrSetMemoryAttributesInMtrrSettings", UnitTestMtrrSetMemoryAttributesInMtrrSettings, InitializeSystem, NULL, &mSystemParameters[SystemIndex]);\r
1144 }\r
1145 }\r
053e878b 1146\r
e17f459a
RN
1147 //\r
1148 // Execute the tests.\r
1149 //\r
e17f459a
RN
1150 Status = RunAllTestSuites (Framework);\r
1151\r
1152EXIT:\r
1153 if (Framework != NULL) {\r
1154 FreeUnitTestFramework (Framework);\r
1155 }\r
1156\r
1157 return Status;\r
1158}\r
1159\r
1160/**\r
1161 Standard POSIX C entry point for host based unit test execution.\r
1162\r
1163 @param Argc Number of arguments.\r
1164 @param Argv Array of arguments.\r
1165\r
1166 @return Test application exit code.\r
1167**/\r
1168INT32\r
1169main (\r
053e878b
MK
1170 INT32 Argc,\r
1171 CHAR8 *Argv[]\r
e17f459a
RN
1172 )\r
1173{\r
053e878b 1174 UINTN Count;\r
65904cdb
RN
1175\r
1176 DEBUG ((DEBUG_INFO, "%a v%a\n", UNIT_TEST_APP_NAME, UNIT_TEST_APP_VERSION));\r
053e878b 1177 srand ((unsigned int)time (NULL));\r
65904cdb
RN
1178\r
1179 //\r
1180 // MtrrLibUnitTest generate-random-numbers <path to MtrrLib/UnitTest/RandomNumber.c> <random-number count>\r
1181 //\r
1182 if ((Argc == 4) && (AsciiStriCmp ("generate-random-numbers", Argv[1]) == 0)) {\r
1183 Count = atoi (Argv[3]);\r
1184 DEBUG ((DEBUG_INFO, "Generate %d random numbers to %a.\n", Count, Argv[2]));\r
1185 GenerateRandomNumbers (Argv[2], Count);\r
1186 return 0;\r
1187 }\r
e17f459a
RN
1188\r
1189 //\r
65904cdb
RN
1190 // MtrrLibUnitTest [<iterations>]\r
1191 // <iterations> [fixed|random]\r
1192 // Default <iterations> is 10.\r
1193 // Default uses fixed inputs.\r
e17f459a 1194 //\r
65904cdb
RN
1195 Count = 10;\r
1196 mRandomInput = FALSE;\r
1197 if ((Argc == 2) || (Argc == 3)) {\r
1198 Count = atoi (Argv[1]);\r
1199 if (Argc == 3) {\r
1200 if (AsciiStriCmp ("fixed", Argv[2]) == 0) {\r
1201 mRandomInput = FALSE;\r
1202 } else if (AsciiStriCmp ("random", Argv[2]) == 0) {\r
1203 mRandomInput = TRUE;\r
1204 }\r
1205 }\r
e17f459a 1206 }\r
65904cdb
RN
1207\r
1208 DEBUG ((DEBUG_INFO, "Iterations = %d\n", Count));\r
1209 DEBUG ((DEBUG_INFO, "Input = %a\n", mRandomInput ? "random" : "fixed"));\r
1210\r
1211 return UnitTestingEntry (Count);\r
e17f459a 1212}\r