#include <Guid/IdleLoopEvent.h>\r
#include <Guid/VectorHandoffTable.h>\r
#include <Ppi/VectorHandoffInfo.h>\r
+#include <Guid/ZeroGuid.h>\r
+#include <Guid/MemoryProfile.h>\r
\r
#include <Library/DxeCoreEntryPoint.h>\r
#include <Library/DebugLib.h>\r
EFI_HANDLE DeviceHandle;\r
} EFI_GCD_MAP_ENTRY;\r
\r
+\r
+#define LOADED_IMAGE_PRIVATE_DATA_SIGNATURE SIGNATURE_32('l','d','r','i')\r
+\r
+typedef struct {\r
+ UINTN Signature;\r
+ /// Image handle\r
+ EFI_HANDLE Handle; \r
+ /// Image type\r
+ UINTN Type; \r
+ /// If entrypoint has been called\r
+ BOOLEAN Started; \r
+ /// The image's entry point\r
+ EFI_IMAGE_ENTRY_POINT EntryPoint; \r
+ /// loaded image protocol\r
+ EFI_LOADED_IMAGE_PROTOCOL Info; \r
+ /// Location in memory\r
+ EFI_PHYSICAL_ADDRESS ImageBasePage; \r
+ /// Number of pages\r
+ UINTN NumberOfPages; \r
+ /// Original fixup data\r
+ CHAR8 *FixupData; \r
+ /// Tpl of started image\r
+ EFI_TPL Tpl; \r
+ /// Status returned by started image\r
+ EFI_STATUS Status; \r
+ /// Size of ExitData from started image\r
+ UINTN ExitDataSize; \r
+ /// Pointer to exit data from started image\r
+ VOID *ExitData; \r
+ /// Pointer to pool allocation for context save/retore\r
+ VOID *JumpBuffer; \r
+ /// Pointer to buffer for context save/retore\r
+ BASE_LIBRARY_JUMP_BUFFER *JumpContext; \r
+ /// Machine type from PE image\r
+ UINT16 Machine; \r
+ /// EBC Protocol pointer\r
+ EFI_EBC_PROTOCOL *Ebc; \r
+ /// Runtime image list\r
+ EFI_RUNTIME_IMAGE_ENTRY *RuntimeData; \r
+ /// Pointer to Loaded Image Device Path Protocl\r
+ EFI_DEVICE_PATH_PROTOCOL *LoadedImageDevicePath; \r
+ /// PeCoffLoader ImageContext\r
+ PE_COFF_LOADER_IMAGE_CONTEXT ImageContext; \r
+ /// Status returned by LoadImage() service.\r
+ EFI_STATUS LoadImageStatus;\r
+} LOADED_IMAGE_PRIVATE_DATA;\r
+\r
+#define LOADED_IMAGE_PRIVATE_DATA_FROM_THIS(a) \\r
+ CR(a, LOADED_IMAGE_PRIVATE_DATA, Info, LOADED_IMAGE_PRIVATE_DATA_SIGNATURE)\r
+\r
//\r
// DXE Core Global Variables\r
//\r
IN OUT EFI_PHYSICAL_ADDRESS *Memory\r
);\r
\r
+/**\r
+ Allocates pages from the memory map.\r
+\r
+ @param Type The type of allocation to perform\r
+ @param MemoryType The type of memory to turn the allocated pages\r
+ into\r
+ @param NumberOfPages The number of pages to allocate\r
+ @param Memory A pointer to receive the base allocated memory\r
+ address\r
+\r
+ @return Status. On success, Memory is filled in with the base address allocated\r
+ @retval EFI_INVALID_PARAMETER Parameters violate checking rules defined in\r
+ spec.\r
+ @retval EFI_NOT_FOUND Could not allocate pages match the requirement.\r
+ @retval EFI_OUT_OF_RESOURCES No enough pages to allocate.\r
+ @retval EFI_SUCCESS Pages successfully allocated.\r
\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CoreInternalAllocatePages (\r
+ IN EFI_ALLOCATE_TYPE Type,\r
+ IN EFI_MEMORY_TYPE MemoryType,\r
+ IN UINTN NumberOfPages,\r
+ IN OUT EFI_PHYSICAL_ADDRESS *Memory\r
+ );\r
\r
/**\r
Frees previous allocated pages.\r
IN UINTN NumberOfPages\r
);\r
\r
+/**\r
+ Frees previous allocated pages.\r
\r
+ @param Memory Base address of memory being freed\r
+ @param NumberOfPages The number of pages to free\r
+\r
+ @retval EFI_NOT_FOUND Could not find the entry that covers the range\r
+ @retval EFI_INVALID_PARAMETER Address not aligned\r
+ @return EFI_SUCCESS -Pages successfully freed.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CoreInternalFreePages (\r
+ IN EFI_PHYSICAL_ADDRESS Memory,\r
+ IN UINTN NumberOfPages\r
+ );\r
\r
/**\r
This function returns a copy of the current memory map. The map is an array of\r
OUT VOID **Buffer\r
);\r
\r
+/**\r
+ Allocate pool of a particular type.\r
\r
+ @param PoolType Type of pool to allocate\r
+ @param Size The amount of pool to allocate\r
+ @param Buffer The address to return a pointer to the allocated\r
+ pool\r
+\r
+ @retval EFI_INVALID_PARAMETER PoolType not valid or Buffer is NULL\r
+ @retval EFI_OUT_OF_RESOURCES Size exceeds max pool size or allocation failed.\r
+ @retval EFI_SUCCESS Pool successfully allocated.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CoreInternalAllocatePool (\r
+ IN EFI_MEMORY_TYPE PoolType,\r
+ IN UINTN Size,\r
+ OUT VOID **Buffer\r
+ );\r
\r
/**\r
Frees pool.\r
IN VOID *Buffer\r
);\r
\r
+/**\r
+ Frees pool.\r
+\r
+ @param Buffer The allocated pool entry to free\r
+\r
+ @retval EFI_INVALID_PARAMETER Buffer is not a valid value.\r
+ @retval EFI_SUCCESS Pool successfully freed.\r
\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CoreInternalFreePool (\r
+ IN VOID *Buffer\r
+ );\r
\r
/**\r
Loads an EFI image into memory and returns a handle to the image.\r
resource range specified by BaseAddress and Length.\r
@retval EFI_UNSUPPORTED The bit mask of attributes is not support for the memory resource\r
range specified by BaseAddress and Length.\r
- @retval EFI_ACCESS_DEFINED The attributes for the memory resource range specified by\r
+ @retval EFI_ACCESS_DENIED The attributes for the memory resource range specified by\r
BaseAddress and Length cannot be modified.\r
@retval EFI_OUT_OF_RESOURCES There are not enough system resources to modify the attributes of\r
the memory resource range.\r
);\r
\r
\r
+/**\r
+ Modifies the capabilities for a memory region in the global coherency domain of the\r
+ processor.\r
+\r
+ @param BaseAddress The physical address that is the start address of a memory region.\r
+ @param Length The size in bytes of the memory region.\r
+ @param Capabilities The bit mask of capabilities that the memory region supports.\r
+\r
+ @retval EFI_SUCCESS The capabilities were set for the memory region.\r
+ @retval EFI_INVALID_PARAMETER Length is zero.\r
+ @retval EFI_UNSUPPORTED The capabilities specified by Capabilities do not include the\r
+ memory region attributes currently in use.\r
+ @retval EFI_ACCESS_DENIED The capabilities for the memory resource range specified by\r
+ BaseAddress and Length cannot be modified.\r
+ @retval EFI_OUT_OF_RESOURCES There are not enough system resources to modify the capabilities\r
+ of the memory resource range.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CoreSetMemorySpaceCapabilities (\r
+ IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
+ IN UINT64 Length,\r
+ IN UINT64 Capabilities\r
+ );\r
+\r
+\r
/**\r
Returns a map of the memory resources in the global coherency domain of the\r
processor.\r
@retval EFI_OUT_OF_RESOURCES No enough buffer could be allocated.\r
@retval EFI_SUCCESS Successfully read volume header to the allocated\r
buffer.\r
+ @retval EFI_INVALID_PARAMETER The FV Header signature is not as expected or\r
+ the file system could not be understood.\r
\r
**/\r
EFI_STATUS\r
IN EFI_FIRMWARE_VOLUME_HEADER *FvHeader\r
);\r
\r
+/**\r
+ Initialize memory profile.\r
+\r
+ @param HobStart The start address of the HOB.\r
+\r
+**/\r
+VOID\r
+MemoryProfileInit (\r
+ IN VOID *HobStart\r
+ );\r
+\r
+/**\r
+ Install memory profile protocol.\r
+\r
+**/\r
+VOID\r
+MemoryProfileInstallProtocol (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ Register image to memory profile.\r
+\r
+ @param DriverEntry Image info.\r
+ @param FileType Image file type.\r
+\r
+ @retval TRUE Register success.\r
+ @retval FALSE Register fail.\r
+\r
+**/\r
+BOOLEAN\r
+RegisterMemoryProfileImage (\r
+ IN LOADED_IMAGE_PRIVATE_DATA *DriverEntry,\r
+ IN EFI_FV_FILETYPE FileType\r
+ );\r
+\r
+/**\r
+ Unregister image from memory profile.\r
+\r
+ @param DriverEntry Image info.\r
+\r
+ @retval TRUE Unregister success.\r
+ @retval FALSE Unregister fail.\r
+\r
+**/\r
+BOOLEAN\r
+UnregisterMemoryProfileImage (\r
+ IN LOADED_IMAGE_PRIVATE_DATA *DriverEntry\r
+ );\r
+\r
+/**\r
+ Update memory profile information.\r
+\r
+ @param CallerAddress Address of caller who call Allocate or Free.\r
+ @param Action This Allocate or Free action.\r
+ @param MemoryType Memory type.\r
+ @param Size Buffer size.\r
+ @param Buffer Buffer address.\r
+\r
+ @retval TRUE Profile udpate success.\r
+ @retval FALSE Profile update fail.\r
+\r
+**/\r
+BOOLEAN\r
+CoreUpdateProfile (\r
+ IN EFI_PHYSICAL_ADDRESS CallerAddress,\r
+ IN MEMORY_PROFILE_ACTION Action,\r
+ IN EFI_MEMORY_TYPE MemoryType, // Valid for AllocatePages/AllocatePool\r
+ IN UINTN Size, // Valid for AllocatePages/FreePages/AllocatePool\r
+ IN VOID *Buffer\r
+ );\r
+\r
+/**\r
+ Internal function. Converts a memory range to use new attributes.\r
+\r
+ @param Start The first address of the range Must be page\r
+ aligned\r
+ @param NumberOfPages The number of pages to convert\r
+ @param NewAttributes The new attributes value for the range.\r
+\r
+**/\r
+VOID\r
+CoreUpdateMemoryAttributes (\r
+ IN EFI_PHYSICAL_ADDRESS Start,\r
+ IN UINT64 NumberOfPages,\r
+ IN UINT64 NewAttributes\r
+ );\r
+\r
#endif\r