mirror of https://github.com/acidanthera/audk.git
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;
|
||
|
}
|