git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2542 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			215 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			215 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*++
 | |
| 
 | |
| 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;
 | |
| }
 |