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;
 | 
						|
}
 |