| /*++ | |
| Copyright (c) 2006 - 2007, Intel Corporation | |
| All rights reserved. This program and the accompanying materials | |
| are licensed and made available under the terms and conditions of the BSD License | |
| which accompanies this distribution. The full text of the license may be found at | |
| http://opensource.org/licenses/bsd-license.php | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| Module Name: | |
| NullMemoryTest.c | |
| Abstract: | |
| --*/ | |
| #include "NullMemoryTest.h" | |
| // | |
| // Module global members | |
| // | |
| UINT64 mTestedSystemMemory = 0; | |
| UINT64 mTotalSystemMemory = 0; | |
| EFI_HANDLE mGenericMemoryTestHandle; | |
| // | |
| // Driver entry here | |
| // | |
| EFI_GENERIC_MEMORY_TEST_PROTOCOL mGenericMemoryTest = { | |
| InitializeMemoryTest, | |
| GenPerformMemoryTest, | |
| GenMemoryTestFinished, | |
| GenCompatibleRangeTest | |
| }; | |
| EFI_STATUS | |
| EFIAPI | |
| GenericMemoryTestEntryPoint ( | |
| IN EFI_HANDLE ImageHandle, | |
| IN EFI_SYSTEM_TABLE *SystemTable | |
| ) | |
| /*++ | |
| Routine Description: | |
| The generic memory test driver's entry point, it can initialize private data | |
| to default value | |
| Arguments: | |
| ImageHandle of the loaded driver | |
| Pointer to the System Table | |
| Returns: | |
| Status | |
| EFI_SUCCESS - Protocol successfully installed | |
| EFI_OUT_OF_RESOURCES - Can not allocate protocol data structure in base | |
| memory | |
| --*/ | |
| { | |
| EFI_STATUS Status; | |
| // | |
| // Install the protocol | |
| // | |
| Status = gBS->InstallProtocolInterface ( | |
| &mGenericMemoryTestHandle, | |
| &gEfiGenericMemTestProtocolGuid, | |
| EFI_NATIVE_INTERFACE, | |
| &mGenericMemoryTest | |
| ); | |
| return Status; | |
| } | |
| // | |
| // EFI_GENERIC_MEMORY_TEST_PROTOCOL implementation | |
| // | |
| EFI_STATUS | |
| EFIAPI | |
| InitializeMemoryTest ( | |
| IN EFI_GENERIC_MEMORY_TEST_PROTOCOL *This, | |
| IN EXTENDMEM_COVERAGE_LEVEL Level, | |
| OUT BOOLEAN *RequireSoftECCInit | |
| ) | |
| /*++ | |
| Routine Description: | |
| Arguments: | |
| Returns: | |
| --*/ | |
| { | |
| UINTN NumberOfDescriptors; | |
| EFI_GCD_MEMORY_SPACE_DESCRIPTOR *MemorySpaceMap; | |
| UINTN Index; | |
| gDS->GetMemorySpaceMap (&NumberOfDescriptors, &MemorySpaceMap); | |
| for (Index = 0; Index < NumberOfDescriptors; Index++) { | |
| if (MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeReserved && | |
| (MemorySpaceMap[Index].Capabilities & (EFI_MEMORY_PRESENT | EFI_MEMORY_INITIALIZED | EFI_MEMORY_TESTED)) == | |
| (EFI_MEMORY_PRESENT | EFI_MEMORY_INITIALIZED) | |
| ) { | |
| gDS->RemoveMemorySpace ( | |
| MemorySpaceMap[Index].BaseAddress, | |
| MemorySpaceMap[Index].Length | |
| ); | |
| gDS->AddMemorySpace ( | |
| EfiGcdMemoryTypeSystemMemory, | |
| MemorySpaceMap[Index].BaseAddress, | |
| MemorySpaceMap[Index].Length, | |
| MemorySpaceMap[Index].Capabilities &~ | |
| (EFI_MEMORY_PRESENT | EFI_MEMORY_INITIALIZED | EFI_MEMORY_TESTED | EFI_MEMORY_RUNTIME) | |
| ); | |
| mTestedSystemMemory += MemorySpaceMap[Index].Length; | |
| mTotalSystemMemory += MemorySpaceMap[Index].Length; | |
| } else if (MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeSystemMemory) { | |
| mTotalSystemMemory += MemorySpaceMap[Index].Length; | |
| } | |
| } | |
| FreePool (MemorySpaceMap); | |
| *RequireSoftECCInit = FALSE; | |
| return EFI_SUCCESS; | |
| } | |
| EFI_STATUS | |
| EFIAPI | |
| GenPerformMemoryTest ( | |
| IN EFI_GENERIC_MEMORY_TEST_PROTOCOL *This, | |
| IN OUT UINT64 *TestedMemorySize, | |
| OUT UINT64 *TotalMemorySize, | |
| OUT BOOLEAN *ErrorOut, | |
| IN BOOLEAN TestAbort | |
| ) | |
| /*++ | |
| Routine Description: | |
| Arguments: | |
| Returns: | |
| --*/ | |
| { | |
| *ErrorOut = FALSE; | |
| *TestedMemorySize = mTestedSystemMemory; | |
| *TotalMemorySize = mTotalSystemMemory; | |
| return EFI_NOT_FOUND; | |
| } | |
| EFI_STATUS | |
| EFIAPI | |
| GenMemoryTestFinished ( | |
| IN EFI_GENERIC_MEMORY_TEST_PROTOCOL *This | |
| ) | |
| /*++ | |
| Routine Description: | |
| Arguments: | |
| Returns: | |
| --*/ | |
| { | |
| return EFI_SUCCESS; | |
| } | |
| EFI_STATUS | |
| EFIAPI | |
| GenCompatibleRangeTest ( | |
| IN EFI_GENERIC_MEMORY_TEST_PROTOCOL *This, | |
| IN EFI_PHYSICAL_ADDRESS StartAddress, | |
| IN UINT64 Length | |
| ) | |
| /*++ | |
| Routine Description: | |
| Arguments: | |
| Returns: | |
| --*/ | |
| { | |
| EFI_GCD_MEMORY_SPACE_DESCRIPTOR descriptor; | |
| gDS->GetMemorySpaceDescriptor (StartAddress, &descriptor); | |
| gDS->RemoveMemorySpace (StartAddress, Length); | |
| gDS->AddMemorySpace ( | |
| EfiGcdMemoryTypeSystemMemory, | |
| StartAddress, | |
| Length, | |
| descriptor.Capabilities &~(EFI_MEMORY_PRESENT | EFI_MEMORY_INITIALIZED | EFI_MEMORY_TESTED | EFI_MEMORY_RUNTIME) | |
| ); | |
| return EFI_SUCCESS; | |
| } |