2 Produce a default memory type information HOB unless we can determine, from
3 the existence of the "MemoryTypeInformation" variable, that the DXE IPL PEIM
6 Copyright (C) 2017-2020, Red Hat, Inc.
8 SPDX-License-Identifier: BSD-2-Clause-Patent
11 #include <Guid/MemoryTypeInformation.h>
12 #include <Library/BaseLib.h>
13 #include <Library/DebugLib.h>
14 #include <Library/HobLib.h>
15 #include <Library/PcdLib.h>
16 #include <Library/PeiServicesLib.h>
17 #include <Ppi/ReadOnlyVariable2.h>
18 #include <Uefi/UefiMultiPhase.h>
22 STATIC EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation
[] = {
23 { EfiACPIMemoryNVS
, 0x004 },
24 { EfiACPIReclaimMemory
, 0x008 },
25 { EfiReservedMemoryType
, 0x004 },
26 { EfiRuntimeServicesData
, 0x024 },
27 { EfiRuntimeServicesCode
, 0x030 },
28 { EfiBootServicesCode
, 0x180 },
29 { EfiBootServicesData
, 0xF00 },
30 { EfiMaxMemoryType
, 0x000 }
40 &gEfiMemoryTypeInformationGuid
,
41 mDefaultMemoryTypeInformation
,
42 sizeof mDefaultMemoryTypeInformation
44 DEBUG ((DEBUG_INFO
, "%a: default memory type information HOB built\n",
49 Notification function called when EFI_PEI_READ_ONLY_VARIABLE2_PPI becomes
52 @param[in] PeiServices Indirect reference to the PEI Services Table.
53 @param[in] NotifyDescriptor Address of the notification descriptor data
55 @param[in] Ppi Address of the PPI that was installed.
57 @return Status of the notification. The status code returned from this
63 OnReadOnlyVariable2Available (
64 IN EFI_PEI_SERVICES
**PeiServices
,
65 IN EFI_PEI_NOTIFY_DESCRIPTOR
*NotifyDescriptor
,
69 EFI_PEI_READ_ONLY_VARIABLE2_PPI
*ReadOnlyVariable2
;
73 DEBUG ((DEBUG_VERBOSE
, "%a\n", __FUNCTION__
));
76 // Check if the "MemoryTypeInformation" variable exists, in the
77 // gEfiMemoryTypeInformationGuid namespace.
79 ReadOnlyVariable2
= Ppi
;
81 Status
= ReadOnlyVariable2
->GetVariable (
83 EFI_MEMORY_TYPE_INFORMATION_VARIABLE_NAME
,
84 &gEfiMemoryTypeInformationGuid
,
90 case EFI_BUFFER_TOO_SMALL
:
92 // The variable exists; the DXE IPL PEIM will build the HOB from it.
97 // The variable does not exist; install the default memory type information
100 BuildMemTypeInfoHob ();
103 DEBUG ((DEBUG_ERROR
, "%a: unexpected: GetVariable(): %r\n", __FUNCTION__
,
114 // Notification object for registering the callback, for when
115 // EFI_PEI_READ_ONLY_VARIABLE2_PPI becomes available.
117 STATIC CONST EFI_PEI_NOTIFY_DESCRIPTOR mReadOnlyVariable2Notify
= {
118 (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_DISPATCH
|
119 EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST
), // Flags
120 &gEfiPeiReadOnlyVariable2PpiGuid
, // Guid
121 OnReadOnlyVariable2Available
// Notify
125 MemTypeInfoInitialization (
131 if (!FeaturePcdGet (PcdSmmSmramRequire
)) {
133 // EFI_PEI_READ_ONLY_VARIABLE2_PPI will never be available; install
134 // the default memory type information HOB right away.
136 BuildMemTypeInfoHob ();
140 Status
= PeiServicesNotifyPpi (&mReadOnlyVariable2Notify
);
141 if (EFI_ERROR (Status
)) {
142 DEBUG ((DEBUG_ERROR
, "%a: failed to set up R/O Variable 2 callback: %r\n",
143 __FUNCTION__
, Status
));