提交 fdfdc7e0 编写于 作者: C coolhaxor 提交者: vit9696

OcMemoryLib: Implement Type for ReservedMemory

上级 8acdb177
......@@ -11,6 +11,7 @@ OpenCore Changelog
- Added cacheless 32-bit kext injection (10.4-10.7)
- Added 32-bit kernel/kext patching/blocking support
- Fixed issues loading 10.7 EfiBoot
- Added `Type` to `ReservedMemory` to fulfil hibernation hack needs
#### v0.6.1
- Improved recognition of early pressed hotkeys, thx @varahash
......
......@@ -4338,7 +4338,7 @@ be used. Version with macOS specific enhancements can be downloaded from
\item
\texttt{ProcessorType}
\textbf{Type}: \texttt{plist\ integer}\\
\textbf{Failsafe}: Automatic\\
\textbf{Failsafe}: \texttt{0} (Automatic)\\
\textbf{Description}: Refer to SMBIOS \texttt{ProcessorType}.
\item
\texttt{SystemProductName}\\
......@@ -4478,7 +4478,7 @@ be used. Version with macOS specific enhancements can be downloaded from
\item
\texttt{FSBFrequency}\\
\textbf{Type}: \texttt{plist\ integer}, 64-bit\\
\textbf{Failsafe}: Automatic\\
\textbf{Failsafe}: \texttt{0} (Automatic)\\
\textbf{Description}: Sets \texttt{FSBFrequency} in
\texttt{gEfiProcessorSubClassGuid}.
......@@ -4492,7 +4492,7 @@ be used. Version with macOS specific enhancements can be downloaded from
\item
\texttt{ARTFrequency}\\
\textbf{Type}: \texttt{plist\ integer}, 64-bit\\
\textbf{Failsafe}: Automatic\\
\textbf{Failsafe}: \texttt{0} (Automatic)\\
\textbf{Description}: Sets \texttt{ARTFrequency} in
\texttt{gEfiProcessorSubClassGuid}.
......@@ -4838,7 +4838,7 @@ Apple ROM Version
\item
\texttt{ProcessorType}\\
\textbf{Type}: \texttt{plist\ integer}, 16-bit\\
\textbf{Failsafe}: Automatic\\
\textbf{Failsafe}: \texttt{0} (Automatic)\\
\textbf{SMBIOS}: \texttt{APPLE\_SMBIOS\_TABLE\_TYPE131} -
\texttt{ProcessorType}\\
\textbf{Description}: Combined of Processor Major and Minor types.
......@@ -6067,6 +6067,11 @@ functioning. Feature highlights:
The addresses written here must be part of the memory map, have \texttt{EfiConventionalMemory}
type, and page-aligned (4 KBs).
\emph{Note}: Some firmwares may not allocate memory areas used by S3 (sleep) and S4 (hibernation)
code unless CSM is enabled causing wake failures. After comparing the memory maps with CSM disabled
and enabled you could find these areas in the lower memory and fix them up by doing the reservation.
See \texttt{Sample.plist} for more details.
\item
\texttt{Comment}\\
\textbf{Type}: \texttt{plist\ string}\\
......@@ -6081,6 +6086,32 @@ functioning. Feature highlights:
\textbf{Failsafe}: \texttt{0}\\
\textbf{Description}: Size of the reserved memory region, must be page-aligned (4 KBs).
\item
\texttt{Type}\\
\textbf{Type}: \texttt{plist\ string}\\
\textbf{Failsafe}: \texttt{Reserved}\\
\textbf{Description}: Memory region type matching the UEFI specification memory descriptor
types. Mapping:
\begin{itemize}
\tightlist
\item \texttt{Reserved} --- \texttt{EfiReservedMemoryType}
\item \texttt{LoaderCode} --- \texttt{EfiLoaderCode}
\item \texttt{LoaderData} --- \texttt{EfiLoaderData}
\item \texttt{BootServiceCode} --- \texttt{EfiBootServicesCode}
\item \texttt{BootServiceData} --- \texttt{EfiBootServicesData}
\item \texttt{RuntimeCode} --- \texttt{EfiRuntimeServicesCode}
\item \texttt{RuntimeData} --- \texttt{EfiRuntimeServicesData}
\item \texttt{Available} --- \texttt{EfiConventionalMemory}
\item \texttt{Persistent} --- \texttt{EfiPersistentMemory}
\item \texttt{UnusableMemory} --- \texttt{EfiUnusableMemory}
\item \texttt{ACPIReclaimMemory} --- \texttt{EfiACPIReclaimMemory}
\item \texttt{ACPIMemoryNVS} --- \texttt{EfiACPIMemoryNVS}
\item \texttt{MemoryMappedIO} --- \texttt{EfiMemoryMappedIO}
\item \texttt{MemoryMappedIOPortSpace} --- \texttt{EfiMemoryMappedIOPortSpace}
\item \texttt{PalCode} --- \texttt{EfiPalCode}
\end{itemize}
\item
\texttt{Enabled}\\
\textbf{Type}: \texttt{plist\ boolean}\\
......
\documentclass[]{article}
%DIF LATEXDIFF DIFFERENCE FILE
%DIF DEL PreviousConfiguration.tex Wed Sep 16 22:53:45 2020
%DIF ADD ../Configuration.tex Wed Sep 16 22:58:02 2020
%DIF DEL PreviousConfiguration.tex Tue Sep 8 21:12:21 2020
%DIF ADD ../Configuration.tex Wed Sep 23 22:27:56 2020
\usepackage{lmodern}
\usepackage{amssymb,amsmath}
......@@ -4403,7 +4403,7 @@ be used. Version with macOS specific enhancements can be downloaded from
\item
\DIFaddbegin \texttt{\DIFadd{ProcessorType}}
\textbf{\DIFadd{Type}}\DIFadd{: }\texttt{\DIFadd{plist\ integer}}\\
\textbf{\DIFadd{Failsafe}}\DIFadd{: Automatic}\\
\textbf{\DIFadd{Failsafe}}\DIFadd{: }\texttt{\DIFadd{0}} \DIFadd{(Automatic)}\\
\textbf{\DIFadd{Description}}\DIFadd{: Refer to SMBIOS }\texttt{\DIFadd{ProcessorType}}\DIFadd{.
}\item
\DIFaddend \texttt{SystemProductName}\\
......@@ -4543,7 +4543,7 @@ be used. Version with macOS specific enhancements can be downloaded from
\item
\texttt{FSBFrequency}\\
\textbf{Type}: \texttt{plist\ integer}, 64-bit\\
\textbf{Failsafe}: Automatic\\
\textbf{Failsafe}: \DIFdelbegin \DIFdel{Automatic}\DIFdelend \DIFaddbegin \texttt{\DIFadd{0}} \DIFadd{(Automatic)}\DIFaddend \\
\textbf{Description}: Sets \texttt{FSBFrequency} in
\texttt{gEfiProcessorSubClassGuid}.
......@@ -4557,7 +4557,7 @@ be used. Version with macOS specific enhancements can be downloaded from
\item
\texttt{ARTFrequency}\\
\textbf{Type}: \texttt{plist\ integer}, 64-bit\\
\textbf{Failsafe}: Automatic\\
\textbf{Failsafe}: \DIFdelbegin \DIFdel{Automatic}\DIFdelend \DIFaddbegin \texttt{\DIFadd{0}} \DIFadd{(Automatic)}\DIFaddend \\
\textbf{Description}: Sets \texttt{ARTFrequency} in
\texttt{gEfiProcessorSubClassGuid}.
......@@ -4903,7 +4903,7 @@ Apple ROM Version
\item
\texttt{ProcessorType}\\
\textbf{Type}: \texttt{plist\ integer}, 16-bit\\
\textbf{Failsafe}: Automatic\\
\textbf{Failsafe}: \DIFdelbegin \DIFdel{Automatic}\DIFdelend \DIFaddbegin \texttt{\DIFadd{0}} \DIFadd{(Automatic)}\DIFaddend \\
\textbf{SMBIOS}: \texttt{APPLE\_SMBIOS\_TABLE\_TYPE131} -
\texttt{ProcessorType}\\
\textbf{Description}: Combined of Processor Major and Minor types.
......@@ -6133,7 +6133,13 @@ functioning. Feature highlights:
The addresses written here must be part of the memory map, have \texttt{EfiConventionalMemory}
type, and page-aligned (4 KBs).
\item
\DIFaddbegin \emph{\DIFadd{Note}}\DIFadd{: Some firmwares may not allocate memory areas used by S3 (sleep) and S4 (hibernation)
code unless CSM is enabled causing wake failures. After comparing the memory maps with CSM disabled
and enabled you could find these areas in the lower memory and fix them up by doing the reservation.
See }\texttt{\DIFadd{Sample.plist}} \DIFadd{for more details.
}
\DIFaddend \item
\texttt{Comment}\\
\textbf{Type}: \texttt{plist\ string}\\
\textbf{Failsafe}: Empty string\\
......@@ -6148,7 +6154,34 @@ functioning. Feature highlights:
\textbf{Description}: Size of the reserved memory region, must be page-aligned (4 KBs).
\item
\texttt{Enabled}\\
\DIFaddbegin \texttt{\DIFadd{Type}}\\
\textbf{\DIFadd{Type}}\DIFadd{: }\texttt{\DIFadd{plist\ string}}\\
\textbf{\DIFadd{Failsafe}}\DIFadd{: }\texttt{\DIFadd{Reserved}}\\
\textbf{\DIFadd{Description}}\DIFadd{: Memory region type matching the UEFI specification memory descriptor
types. Mapping:
}
\begin{itemize}
\tightlist
\item \texttt{\DIFadd{Reserved}} \DIFadd{--- }\texttt{\DIFadd{EfiReservedMemoryType}}
\item \texttt{\DIFadd{LoaderCode}} \DIFadd{--- }\texttt{\DIFadd{EfiLoaderCode}}
\item \texttt{\DIFadd{LoaderData}} \DIFadd{--- }\texttt{\DIFadd{EfiLoaderData}}
\item \texttt{\DIFadd{BootServiceCode}} \DIFadd{--- }\texttt{\DIFadd{EfiBootServicesCode}}
\item \texttt{\DIFadd{BootServiceData}} \DIFadd{--- }\texttt{\DIFadd{EfiBootServicesData}}
\item \texttt{\DIFadd{RuntimeCode}} \DIFadd{--- }\texttt{\DIFadd{EfiRuntimeServicesCode}}
\item \texttt{\DIFadd{RuntimeData}} \DIFadd{--- }\texttt{\DIFadd{EfiRuntimeServicesData}}
\item \texttt{\DIFadd{Available}} \DIFadd{--- }\texttt{\DIFadd{EfiConventionalMemory}}
\item \texttt{\DIFadd{Persistent}} \DIFadd{--- }\texttt{\DIFadd{EfiPersistentMemory}}
\item \texttt{\DIFadd{UnusableMemory}} \DIFadd{--- }\texttt{\DIFadd{EfiUnusableMemory}}
\item \texttt{\DIFadd{ACPIReclaimMemory}} \DIFadd{--- }\texttt{\DIFadd{EfiACPIReclaimMemory}}
\item \texttt{\DIFadd{ACPIMemoryNVS}} \DIFadd{--- }\texttt{\DIFadd{EfiACPIMemoryNVS}}
\item \texttt{\DIFadd{MemoryMappedIO}} \DIFadd{--- }\texttt{\DIFadd{EfiMemoryMappedIO}}
\item \texttt{\DIFadd{MemoryMappedIOPortSpace}} \DIFadd{--- }\texttt{\DIFadd{EfiMemoryMappedIOPortSpace}}
\item \texttt{\DIFadd{PalCode}} \DIFadd{--- }\texttt{\DIFadd{EfiPalCode}}
\end{itemize}
\item
\DIFaddend \texttt{Enabled}\\
\textbf{Type}: \texttt{plist\ boolean}\\
\textbf{Failsafe}: \texttt{false}\\
\textbf{Description}: This region will not be reserved unless set to \texttt{true}.
......
......@@ -1108,6 +1108,8 @@
<dict>
<key>Address</key>
<integer>268435456</integer>
<key>Type</key>
<string>Reserved</string>
<key>Comment</key>
<string>HD3000: IGPU memory corruption errata</string>
<key>Enabled</key>
......@@ -1115,6 +1117,18 @@
<key>Size</key>
<integer>268435456</integer>
</dict>
<dict>
<key>Address</key>
<integer>569344</integer>
<key>Type</key>
<string>RuntimeCode</string>
<key>Comment</key>
<string>Fix black screen on wake from hibernation for Lenovo Thinkpad T490</string>
<key>Enabled</key>
<false/>
<key>Size</key>
<integer>4096</integer>
</dict>
</array>
</dict>
</dict>
......
......@@ -1211,6 +1211,8 @@
<dict>
<key>Address</key>
<integer>268435456</integer>
<key>Type</key>
<string>Reserved</string>
<key>Comment</key>
<string>HD3000: IGPU memory corruption errata</string>
<key>Enabled</key>
......@@ -1218,6 +1220,18 @@
<key>Size</key>
<integer>268435456</integer>
</dict>
<dict>
<key>Address</key>
<integer>569344</integer>
<key>Type</key>
<string>RuntimeCode</string>
<key>Comment</key>
<string>Fix black screen on wake from hibernation for Lenovo Thinkpad T490</string>
<key>Enabled</key>
<false/>
<key>Size</key>
<integer>4096</integer>
</dict>
</array>
</dict>
</dict>
......
......@@ -601,6 +601,7 @@ typedef enum {
_(UINT64 , Address , , 0 , () ) \
_(UINT64 , Size , , 0 , () ) \
_(BOOLEAN , Enabled , , FALSE , () ) \
_(OC_STRING , Type , , OC_STRING_CONSTR ("Reserved", _, __), OC_DESTR (OC_STRING) ) \
_(OC_STRING , Comment , , OC_STRING_CONSTR ("", _, __), OC_DESTR (OC_STRING) )
OC_DECLARE (OC_UEFI_RSVD_ENTRY)
......
......@@ -50,6 +50,13 @@
**/
#define OC_DEFAULT_MEMORY_MAP_SIZE (EFI_PAGE_SIZE*3)
#define OC_MEMORY_TYPE_DESC_COUNT 16
typedef struct {
CHAR8 *Name;
EFI_MEMORY_TYPE Type;
} OC_MEMORY_TYPE_DESC;
/**
Lock the legacy region specified to enable modification.
......@@ -322,7 +329,7 @@ OcGetMemoryAttributes (
Refresh memory attributes entry containing the specified address.
@param[in] Address Address contained in the updated entry.
@param[in] GetMemoryMap
@param[in] GetMemoryMap
@retval EFI_SUCCESS on success.
@retval EFI_NOT_FOUND no entry contains the specified address.
......@@ -395,6 +402,22 @@ OcGetPhysicalAddress (
OUT EFI_PHYSICAL_ADDRESS *PhysicalAddr
);
/**
Return EFI memory type for given type description
@param[in] MemoryTypeDesc Memory type string representation.
@param[out] MemoryType EFI memory type to return.
@retval EFI_NOT_FOUND on unsuccessful lookup.
@retval EFI_INVALID_PARAMETER on wrong passed agruments.
@retval EFI_SUCCESS on successful lookup.
**/
EFI_STATUS
OcDescToMemoryType (
IN CHAR8 *MemoryTypeDesc,
OUT EFI_MEMORY_TYPE *MemoryType
);
/**
Virtual memory context
**/
......
......@@ -664,6 +664,7 @@ mUefiReservedMemoryEntrySchema[] = {
OC_SCHEMA_STRING_IN ("Comment", OC_UEFI_RSVD_ENTRY, Comment),
OC_SCHEMA_BOOLEAN_IN ("Enabled", OC_UEFI_RSVD_ENTRY, Enabled),
OC_SCHEMA_INTEGER_IN ("Size", OC_UEFI_RSVD_ENTRY, Size),
OC_SCHEMA_STRING_IN ("Type", OC_UEFI_RSVD_ENTRY, Type),
};
STATIC
......
......@@ -23,6 +23,94 @@
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiLib.h>
STATIC OC_MEMORY_TYPE_DESC OcMemoryTypeString [OC_MEMORY_TYPE_DESC_COUNT] = {
{
"Reserved",
EfiReservedMemoryType
},
{
"LoaderCode",
EfiLoaderCode
},
{
"LoaderData",
EfiLoaderData
},
{
"BootServiceCode",
EfiBootServicesCode
},
{
"BootServiceData",
EfiBootServicesData
},
{
"RuntimeCode",
EfiRuntimeServicesCode
},
{
"RuntimeData",
EfiRuntimeServicesData
},
{
"Available",
EfiConventionalMemory
},
{
"Persistent",
EfiPersistentMemory
},
{
"UnusableMemory",
EfiUnusableMemory
},
{
"ACPIReclaimMemory",
EfiACPIReclaimMemory
},
{
"ACPIMemoryNVS",
EfiACPIMemoryNVS
},
{
"MemoryMappedIO",
EfiMemoryMappedIO
},
{
"MemoryMappedIOPortSpace",
EfiMemoryMappedIOPortSpace
},
{
"PalCode",
EfiPalCode
}
};
EFI_STATUS
OcDescToMemoryType (
IN CHAR8 *MemoryTypeDesc,
OUT EFI_MEMORY_TYPE *MemoryType
)
{
UINTN Index;
EFI_STATUS Status = EFI_INVALID_PARAMETER;
if (MemoryTypeDesc != NULL && MemoryType !=NULL) {
for (Index = 0; Index < OC_MEMORY_TYPE_DESC_COUNT; Index++) {
if (AsciiStrCmp (MemoryTypeDesc, OcMemoryTypeString[Index].Name) == 0) {
Status = EFI_SUCCESS;
*MemoryType=OcMemoryTypeString[Index].Type;
break;
}
}
if (EFI_ERROR (Status)) {
Status = EFI_NOT_FOUND;
}
}
return Status;
}
EFI_MEMORY_DESCRIPTOR *
OcGetCurrentMemoryMap (
OUT UINTN *MemoryMapSize,
......
......@@ -3,13 +3,13 @@
# Copyright (C) 2018, Download-Fritz. All rights reserved.<BR>
#
# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
#
#
# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
#
#
# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
#
#
# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
#
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
##
......
......@@ -140,7 +140,7 @@ ProduceDebugReport (
Status = AcpiDumpTables (SubReport);
SubReport->Close (SubReport);
}
DEBUG ((DEBUG_INFO, "OC: ACPI dumping - %r\n", Status));
DEBUG ((DEBUG_INFO, "OC: ACPI dumping - %r\n", Status));
Status = SafeFileOpen (
SysReport,
......@@ -154,7 +154,7 @@ ProduceDebugReport (
Status = OcSmbiosDump (SubReport);
SubReport->Close (SubReport);
}
DEBUG ((DEBUG_INFO, "OC: ACPI dumping - %r\n", Status));
DEBUG ((DEBUG_INFO, "OC: ACPI dumping - %r\n", Status));
SysReport->Close (SysReport);
Fs->Close (Fs);
......
......@@ -42,6 +42,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#include <Library/OcFirmwareVolumeLib.h>
#include <Library/OcHashServicesLib.h>
#include <Library/OcMiscLib.h>
#include <Library/OcMemoryLib.h>
#include <Library/OcRtcLib.h>
#include <Library/OcSmcLib.h>
#include <Library/OcOSInfoLib.h>
......@@ -498,6 +499,55 @@ OcLoadBooterUefiSupport (
OcAbcInitialize (&AbcSettings);
}
VOID
OcReserveMemory (
IN OC_GLOBAL_CONFIG *Config
)
{
EFI_STATUS Status;
UINTN Index;
EFI_PHYSICAL_ADDRESS ReservedAddress;
EFI_MEMORY_TYPE RsvdMemoryType;
CHAR8 *RsvdMemoryTypeStr;
for (Index = 0; Index < Config->Uefi.ReservedMemory.Count; ++Index) {
if (!Config->Uefi.ReservedMemory.Values[Index]->Enabled) {
continue;
}
if ((Config->Uefi.ReservedMemory.Values[Index]->Address & (BASE_4KB - 1)) != 0
|| (Config->Uefi.ReservedMemory.Values[Index]->Size & (BASE_4KB - 1)) != 0) {
Status = EFI_INVALID_PARAMETER;
} else {
RsvdMemoryTypeStr = OC_BLOB_GET (&Config->Uefi.ReservedMemory.Values[Index]->Type);
Status = OcDescToMemoryType (RsvdMemoryTypeStr, &RsvdMemoryType);
if (EFI_ERROR (Status)){
DEBUG ((DEBUG_INFO, "OC: Invalid ReservedMemory Type: %a\n", RsvdMemoryTypeStr));
RsvdMemoryType = EfiReservedMemoryType;
}
ReservedAddress = Config->Uefi.ReservedMemory.Values[Index]->Address;
Status = gBS->AllocatePages (
AllocateAddress,
RsvdMemoryType,
(UINTN) EFI_SIZE_TO_PAGES (Config->Uefi.ReservedMemory.Values[Index]->Size),
&ReservedAddress
);
}
DEBUG ((
DEBUG_INFO,
"OC: Reserving region %Lx of %Lx size - %r\n",
Config->Uefi.ReservedMemory.Values[Index]->Address,
Config->Uefi.ReservedMemory.Values[Index]->Size,
Status
));
}
}
VOID
OcLoadUefiSupport (
IN OC_STORAGE_CONTEXT *Storage,
......@@ -505,14 +555,11 @@ OcLoadUefiSupport (
IN OC_CPU_INFO *CpuInfo
)
{
EFI_STATUS Status;
EFI_HANDLE *DriversToConnect;
UINTN Index;
UINT16 *BootOrder;
UINTN BootOrderCount;
BOOLEAN BootOrderChanged;
EFI_EVENT Event;
EFI_PHYSICAL_ADDRESS ReservedAddress;
OcReinstallProtocols (Config);
......@@ -584,32 +631,10 @@ OcLoadUefiSupport (
OcMiscUefiQuirksLoaded (Config);
for (Index = 0; Index < Config->Uefi.ReservedMemory.Count; ++Index) {
if (!Config->Uefi.ReservedMemory.Values[Index]->Enabled) {
continue;
}
if ((Config->Uefi.ReservedMemory.Values[Index]->Address & (BASE_4KB - 1)) != 0
|| (Config->Uefi.ReservedMemory.Values[Index]->Size & (BASE_4KB - 1)) != 0) {
Status = EFI_INVALID_PARAMETER;
} else {
ReservedAddress = Config->Uefi.ReservedMemory.Values[Index]->Address;
Status = gBS->AllocatePages (
AllocateAddress,
EfiReservedMemoryType,
(UINTN) EFI_SIZE_TO_PAGES (Config->Uefi.ReservedMemory.Values[Index]->Size),
&ReservedAddress
);
}
DEBUG ((
DEBUG_INFO,
"OC: Reserving region %Lx of %Lx size - %r\n",
Config->Uefi.ReservedMemory.Values[Index]->Address,
Config->Uefi.ReservedMemory.Values[Index]->Size,
Status
));
}
//
// Reserve requested memory regions
//
OcReserveMemory (Config);
if (Config->Uefi.ConnectDrivers) {
OcLoadDrivers (Storage, Config, &DriversToConnect);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册