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>
23 // The NumberOfPages values below are ad-hoc. They are updated sporadically at
24 // best (please refer to git-blame for past updates). The values capture a set
25 // of BIN hints that made sense at a particular time, for some (now likely
26 // unknown) workloads / boot paths.
28 STATIC EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation
[] = {
29 { EfiACPIMemoryNVS
, 0x004 },
30 { EfiACPIReclaimMemory
, 0x008 },
31 { EfiReservedMemoryType
, 0x004 },
32 { EfiRuntimeServicesData
, 0x024 },
33 { EfiRuntimeServicesCode
, 0x030 },
34 { EfiBootServicesCode
, 0x180 },
35 { EfiBootServicesData
, 0xF00 },
36 { EfiMaxMemoryType
, 0x000 }
46 &gEfiMemoryTypeInformationGuid
,
47 mDefaultMemoryTypeInformation
,
48 sizeof mDefaultMemoryTypeInformation
50 DEBUG ((DEBUG_INFO
, "%a: default memory type information HOB built\n",
55 Notification function called when EFI_PEI_READ_ONLY_VARIABLE2_PPI becomes
58 @param[in] PeiServices Indirect reference to the PEI Services Table.
59 @param[in] NotifyDescriptor Address of the notification descriptor data
61 @param[in] Ppi Address of the PPI that was installed.
63 @return Status of the notification. The status code returned from this
69 OnReadOnlyVariable2Available (
70 IN EFI_PEI_SERVICES
**PeiServices
,
71 IN EFI_PEI_NOTIFY_DESCRIPTOR
*NotifyDescriptor
,
75 EFI_PEI_READ_ONLY_VARIABLE2_PPI
*ReadOnlyVariable2
;
79 DEBUG ((DEBUG_VERBOSE
, "%a\n", __FUNCTION__
));
82 // Check if the "MemoryTypeInformation" variable exists, in the
83 // gEfiMemoryTypeInformationGuid namespace.
85 ReadOnlyVariable2
= Ppi
;
87 Status
= ReadOnlyVariable2
->GetVariable (
89 EFI_MEMORY_TYPE_INFORMATION_VARIABLE_NAME
,
90 &gEfiMemoryTypeInformationGuid
,
96 case EFI_BUFFER_TOO_SMALL
:
98 // The variable exists; the DXE IPL PEIM will build the HOB from it.
103 // The variable does not exist; install the default memory type information
106 BuildMemTypeInfoHob ();
109 DEBUG ((DEBUG_ERROR
, "%a: unexpected: GetVariable(): %r\n", __FUNCTION__
,
120 // Notification object for registering the callback, for when
121 // EFI_PEI_READ_ONLY_VARIABLE2_PPI becomes available.
123 STATIC CONST EFI_PEI_NOTIFY_DESCRIPTOR mReadOnlyVariable2Notify
= {
124 (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_DISPATCH
|
125 EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST
), // Flags
126 &gEfiPeiReadOnlyVariable2PpiGuid
, // Guid
127 OnReadOnlyVariable2Available
// Notify
131 MemTypeInfoInitialization (
137 if (!FeaturePcdGet (PcdSmmSmramRequire
)) {
139 // EFI_PEI_READ_ONLY_VARIABLE2_PPI will never be available; install
140 // the default memory type information HOB right away.
142 BuildMemTypeInfoHob ();
146 Status
= PeiServicesNotifyPpi (&mReadOnlyVariable2Notify
);
147 if (EFI_ERROR (Status
)) {
148 DEBUG ((DEBUG_ERROR
, "%a: failed to set up R/O Variable 2 callback: %r\n",
149 __FUNCTION__
, Status
));