From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM12-DM6-obe.outbound.protection.outlook.com (NAM12-DM6-obe.outbound.protection.outlook.com [40.107.243.60]) by mx.groups.io with SMTP id smtpd.web12.3643.1661806037899565481 for ; Mon, 29 Aug 2022 13:47:18 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@amd.com header.s=selector1 header.b=HniRP4RO; spf=permerror, err=parse error for token &{10 18 %{i}._ip.%{h}._ehlo.%{d}._spf.vali.email}: invalid domain name (domain: amd.com, ip: 40.107.243.60, mailfrom: thomas.lendacky@amd.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=NCc/FETs65aFbNyJ26eKLdoDfOj1+QHZMfoWOZfS/Ofyn666PeC36xNqtw+oU6DyHRX3jTdH33lciDMMyD9xdeKQi4frmXmjFMYBAmXXhYORwhb4LD8r5zbqtzuiGUYykVgxUOOBPYb69bKzsEp3v7QqO2pK0ZtWrO2hy7deK8r/dD09jaahxE3Jl9UXqkiCwLe8DjXWg+A/LgpdpZyE8JMK5Ov0b1OX0uzOznuGKv1P4P34LUTTPHb1cQOh/lArIqBZF6a57M30HkX0EbZGmlqTZ/Dmtd+bGFS2/bWD+YLrGqsYjpEmgYdzKFmz0iCLcadt8nYL1p2T0qbx+7dHsA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=YkQojesAwGaQZhOLwIijZfp3VNhZDDSRI7mJP6a7wkw=; b=FjR3dt+ShpJgu/bdkDpRGS7cZkAOFcv7SiuNiZRafdJthlZIAIG8Ls1xr8NQunW9pmhMrdIqUol80XNJ5kytYVrIGn26vGU/e1tDC0mxWjdk673YWAbs8tSIzxMbUEh8ki/+pY7ShYRIR+1rxCgBLtES+kPsfm6CK3oeH4Xk/V4W5A5XSj93TVw17wDK5lXZYgXhGAXA9nf8JyHBzJs3Xfvqv5QCmfziMtpMBFNzHaCHsLU7OMaTjA+rxlWOwu4/GfXKC0KgvLzD/ts8A4vN2zvdZ+G2NKGKgTzglp2hLX/oHp7zK2IBeZjCuwb4bYi8wijfQ0ouVke7z0pVXfqpYQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; dkim=pass header.d=amd.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=YkQojesAwGaQZhOLwIijZfp3VNhZDDSRI7mJP6a7wkw=; b=HniRP4ROSA+hlQER9ddLUwTP8KO9HHQzSO/2/MMV8dP2YTdwl/oxFOH9QzmBApVD2mycXrjCvTFdC7N1bA5jf6Xqz5/BaHbSQxLB8h8wTMcdhzYtnP5nYgz6JZ15+2TXUnGHRn7vUEDg8xaQMJeIuB8A37GKWZk34YWtGhqfvCw= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=amd.com; Received: from DM4PR12MB5229.namprd12.prod.outlook.com (2603:10b6:5:398::12) by CO6PR12MB5409.namprd12.prod.outlook.com (2603:10b6:5:357::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5566.15; Mon, 29 Aug 2022 20:47:15 +0000 Received: from DM4PR12MB5229.namprd12.prod.outlook.com ([fe80::c175:4c:c0d:1396]) by DM4PR12MB5229.namprd12.prod.outlook.com ([fe80::c175:4c:c0d:1396%4]) with mapi id 15.20.5566.021; Mon, 29 Aug 2022 20:47:15 +0000 Message-ID: <0df27647-88c0-2b21-cfea-3f5536451567@amd.com> Date: Mon, 29 Aug 2022 15:47:13 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.11.0 Subject: Re: [PATCH V2 14/14] MdeModulePkg: Pool and page functions accept memory when OOM occurs To: Min Xu , devel@edk2.groups.io Cc: Jiaqi Gao , Jian J Wang , Liming Gao , Dandan Bi , Erdem Aktas , James Bottomley , Jiewen Yao , Gerd Hoffmann References: From: "Lendacky, Thomas" In-Reply-To: X-ClientProxiedBy: BL0PR02CA0052.namprd02.prod.outlook.com (2603:10b6:207:3d::29) To DM4PR12MB5229.namprd12.prod.outlook.com (2603:10b6:5:398::12) Return-Path: Thomas.Lendacky@amd.com MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: ffd485ef-0588-49d6-4228-08da89ffa7fd X-MS-TrafficTypeDiagnostic: CO6PR12MB5409:EE_ X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 95bXlxJbBTBYeT5KVpmCmErPH8lQFvIf9wpZHl4G9JTdxq+XKZw2yStc1RtoXUCBKysDvvF5Z5M5nm8qgXnYh8RPQk6mCzZ72BqqsLaC6vAycajvonacP7EgjRVeIX7KWPvlKO0dnjOhGb0F1Jjh587HQxNDvQ+0umAadT84PF5vfRCLkdSzIX/8rlaIrhkWIW3STCnmIlU7TxUg84tdbtPMzeJTn4IZkq7IJ9RoXp8xu94YG808BE0plt2XqJZ65GKxSpOqAydJc9OfAkNGDJs9E2sIbA5pAnwzeMl1cV6HCU69z6XeSTvsrB8X9gx303UjqBAu9kwaatBtqbqR8m7sOmH/OTPBOTAT063WlxLSF/yuEUzcAWtG4gFWR6jrdYoh3U7XtxSGY8puZl926bRtkV9xC7cXneOoF34Ef9zWK3SNWEmndMveN0c3buqsXgNuDrrKIv6/8oxDBQPhk7wMIN0tHZNiQgXi5IhCI7+rF90IwixFPPo7LcLqq1bkkZgmGmrRwhZfe2wr6ZCqj0/cUnNLPWDgPsBygGszu7bI+hbD5vUI8tRHYw0tkl3KxUsssgzKPaPGg+iVNsYsTdEuiFcezfeJ+SP1oBbK16KWGFQ0bYHiw0oNcYQsx4eVEGdCu9Su0EDUJVo8Gx+18mzELlsviWSB+bIE1bgQQJAQssuAIlkPyh51vR+Zz10dlxLEIqAXT1pmCUeKxS0uoO2VfqMJ+3gkIOMAua8U1XgKDKv5ET258ZXXD9tfFKDJMYl9AesBleDwOmeQ4pnCDg14mxO1p/1mg9RTZvPhTbQlTE1vp0LIk9ikQ1SbXt49AX32f3J+csPQgupnsRLw3w== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM4PR12MB5229.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230016)(4636009)(39860400002)(376002)(346002)(366004)(396003)(136003)(7416002)(5660300002)(8936002)(41300700001)(186003)(2616005)(86362001)(31696002)(6506007)(83380400001)(6512007)(53546011)(2906002)(26005)(36756003)(31686004)(316002)(54906003)(66946007)(478600001)(66476007)(966005)(38100700002)(4326008)(6486002)(8676002)(66556008)(43740500002)(45980500001);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?TmlzV0RPWHJjUk5WWk95YXUrVEpSbDBrNHBmc0lUeHZUazN0MHBSd3FKSWVG?= =?utf-8?B?QTk4b1hTZkNkNEIvMElGOHpjdWxGeGpxelZDbTRzWC9PODh2dzZXcFlnRHlZ?= =?utf-8?B?MW9JWEV1WVJuTmxMVlNIWWFlanRTTHhRTFkwZmlMUG5sSUF5dzhmUC9zblBW?= =?utf-8?B?WDkycFA0eEo0VlV1a1ZWWGxETThMMEpLRlUwc0NVd2xkMGR2YlZiSm9TQVNa?= =?utf-8?B?RFRScVZ4TGxnak11bUwrZjBqdk5EbXNkRlR4MTRhMWNqeE1rRzJpREtIZUxu?= =?utf-8?B?azR6MCswYnNpNjFJK3RpZjdDVytSUC9Hb0RxT3hFeWJXeldjOHk0UkN2ZWRj?= =?utf-8?B?NEp2Q0NQVDhaa1dWczZvWG5BdnUzYXZVRzk3QldFQTBDcldrTU1oYXhEdmhP?= =?utf-8?B?ZW1ocXROWHVSR0JBaFNxQ1NKTWZlVzV2dWx1TitQVDJVSmExUlFka3JkK04v?= =?utf-8?B?TEJhNFJ5MmM4YkZ1SU9rM082ZXlaa0tscnFFZDBnNzFrZjhnMnR4ODRqd1Bx?= =?utf-8?B?cG1JQnZjZXlndnBGNk0xNkg1L0lMM003S3RsT1BtbkJoTDQrKzd2RUtuaU9H?= =?utf-8?B?TVNqWDgyLy84K002ZlFYMENRbFZqRExvcHBlL1Y1WmlrQXY0TG9Oa0hidkFk?= =?utf-8?B?d0JKdTNaUHFaUXJHV2g5TFlnY2JPWFM5T2J4cVNZVlhhN2tkb0tUZXlZcUVs?= =?utf-8?B?WlhwK1oyZk0yeWdjUmRZUVp0MkdPZUtlU3FUeWdXQ3ROY0FFTXJaalF1cmdU?= =?utf-8?B?Z2l6UDhGZkJwcHlrK0I1bWVZQUlEalpMcTRqNTJOc1g3MHlSZm9sZTlNNVRr?= =?utf-8?B?V1NYMDhaUHBvTi9ZKzc3RXBkYjgwSmZYNmVhbkhuZTA0WHVaT2lxUXI5YVJs?= =?utf-8?B?aGoxNVc4SGxzTGJhS0p5WXFmTkw2cVF1aUV6Q05WV1RWZloydGtUSEdvazZQ?= =?utf-8?B?cWN5N0x4U09pSnpWVWQrVWxydjA0RWpuR3dtVjJmdXVkOEdBeUdreTZkMG9l?= =?utf-8?B?ZnFOK3ZIYm9jOXduSkFxNGp5Vk9SN2Q1ajBiaHoyd1kzUHRKdVJJblNmRUVp?= =?utf-8?B?bTRPK2JBZ3BXNVNzRTBzKzBCOWtUMTBKNzBsMGIxM05hL3RZUVh3RmMzaUNT?= =?utf-8?B?S0xpOG1oZVpINTFIQ1BFOGZxaVBiRWQwWS9Xc1lPMkUyQzd2N1FNYVZ1ejQ4?= =?utf-8?B?YWZYSlRnbjJ4YWMwUmZBOW1mdXBTMi9WTmMrWGVuVEdYZTQ3TXl1WnpEWEhK?= =?utf-8?B?Qi84L2E1N085bGJ1bmgwY01QSXk4R2EwYjl0c1hTcnVhT2ZNSGNTR055UWlo?= =?utf-8?B?Y0cwbkJETGNqSG1oOFZnMHlORklsMDNtWXNLbXkvdXhzM3BTdE1GdXhTMm9M?= =?utf-8?B?aVdKaFA2NS9DVmRaZjhJVCtNSGUyd0haUURMenFVSFBZWFRMOE5nRjVWQmgx?= =?utf-8?B?ZVYwTmlRWDBsZGU5U2dCcTdSc0U5Y2o2bDN3UTgzWExhUGxTTW1jQjJwUUNP?= =?utf-8?B?R2hidzRodEs4SU4rRkxDdkpFeEd6M1QrUUJnU0FhRjVLRVd5YkErbTZ5TzRq?= =?utf-8?B?OXgrUDVKSXlKOWRJM0JIYkkvVWJReVVOU1p5TVFMam5qdTdaTlo0cTVRakF4?= =?utf-8?B?R0RlQ09SZ1MraTAxOHcvdGZ5cXJmdWlSREZwOUhvSDE2bEhjOXAwSHZJWC8r?= =?utf-8?B?NjBaOHMxcFl3WnFHODZNODAveEFNdnJDSG5YdjIxbjh5RXlSdmVCdXZ2UldC?= =?utf-8?B?M2psazFUZ0tTWWZuV3NQZHA5SUtvVGpKVlJhbC9xcFRWZG5hU0JlZGR3aEFr?= =?utf-8?B?YWVkRFpVdnFhQVRvL01HR2U1WTltU01aS3lSK0FwY3QwaDVodnZyQjZNYzJD?= =?utf-8?B?ZmFiRW1hSFBGZDYwTitQU2dqVGUybkpxQkxJRlpQUm96Y0pNZ1V6U3czUWl6?= =?utf-8?B?Snk0aWxaUGNKeGs2cFI1YnYrM1pRY09tcXlVeWxNU1N4dFZveGoreHNPaUk1?= =?utf-8?B?NlJMaFFrZXAyK24zeWxzL1BrZktPMFNmVlpBNndTNUpDNVp4YTBIWXBNMlBx?= =?utf-8?B?QmsxcERTd3JBd1JlMkxvZ2NFcXlJZ0RVdm9ETDBQK2FkZWFENlZxQUxRMFFV?= =?utf-8?Q?pov1JHLTHNmDzWS0knQL5TagX?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-Network-Message-Id: ffd485ef-0588-49d6-4228-08da89ffa7fd X-MS-Exchange-CrossTenant-AuthSource: DM4PR12MB5229.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Aug 2022 20:47:15.6278 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: YkP95esKZVMWd7kcVayD0tLXHXpq7VawGFQAAU/wkx8q8s11rtYI/otVY/1VfNFoxSG1KMRVj+MYOo2tUAlLzA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO6PR12MB5409 Content-Language: en-US Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 8/27/22 01:21, Min Xu wrote: > From: Jiaqi Gao > > RFC: https://bugzilla.tianocore.org/show_bug.cgi?id=3937 > > When CoreAllocatePages() / CoreAllocatePool() meets error of > EFI_OUT_OF_RESOURCES, locate the EdkiiMemoryAcceptProtocol and accept extra > memory dynamically. > > Firstly, find the unaccpeted memory region with enough size in GCD s/unaccpeted/unaccepted/ > entries. Then locate the EdkiiMemoryAcceptProtocol and accept the memory. > Finally, update the GCD memory and gMemoryMap entries. > > After updating the memory infomation, CoreInternalAllocatePages() / > CoreInternalAllocatePool() will be recalled to allocate pages / pool. What path does allocation take when called through boot services? If I set a 256MB accepted memory size, I can get to the bootloader and select my kernel. But then the kernel dies in efi_relocate_kernel() with: EFI stub: ERROR: Failed to allocate usable memory for kernel. EFI stub: ERROR: efi_relocate_kernel() failed! EFI stub: ERROR: efi_main() failed! because both efi_bs_call(allocate_pages, ...) and efi_low_alloc_above() fail. Similar to DXE, should OVMF accept more memory through this path to let the kernel boot? Thanks, Tom > > Cc: Jian J Wang > Cc: Liming Gao > Cc: Dandan Bi > Cc: Erdem Aktas > Cc: James Bottomley > Cc: Jiewen Yao > Cc: Tom Lendacky > Cc: Gerd Hoffmann > Signed-off-by: Jiaqi Gao > Signed-off-by: Min Xu > --- > MdeModulePkg/Core/Dxe/DxeMain.inf | 1 + > MdeModulePkg/Core/Dxe/Mem/Imem.h | 16 +++ > MdeModulePkg/Core/Dxe/Mem/Page.c | 190 ++++++++++++++++++++++++++++++ > MdeModulePkg/Core/Dxe/Mem/Pool.c | 14 +++ > 4 files changed, 221 insertions(+) > > diff --git a/MdeModulePkg/Core/Dxe/DxeMain.inf b/MdeModulePkg/Core/Dxe/DxeMain.inf > index e4bca895773d..371ba45357be 100644 > --- a/MdeModulePkg/Core/Dxe/DxeMain.inf > +++ b/MdeModulePkg/Core/Dxe/DxeMain.inf > @@ -169,6 +169,7 @@ > gEfiVariableArchProtocolGuid ## CONSUMES > gEfiCapsuleArchProtocolGuid ## CONSUMES > gEfiWatchdogTimerArchProtocolGuid ## CONSUMES > + gEdkiiMemoryAcceptProtocolGuid ## CONSUMES > > [Pcd] > gEfiMdeModulePkgTokenSpaceGuid.PcdLoadFixAddressBootTimeCodePageNumber ## SOMETIMES_CONSUMES > diff --git a/MdeModulePkg/Core/Dxe/Mem/Imem.h b/MdeModulePkg/Core/Dxe/Mem/Imem.h > index 2f0bf2bf631f..22e0d0e44030 100644 > --- a/MdeModulePkg/Core/Dxe/Mem/Imem.h > +++ b/MdeModulePkg/Core/Dxe/Mem/Imem.h > @@ -47,6 +47,22 @@ typedef struct { > // Internal prototypes > // > > +/** > + Internal function. Used by the pool and page functions to accept memory > + when OOM occurs. > + > + @param Type The type of allocation to perform. > + @param AcceptSize Size of memory to be accepted. > + @param Memory Accept memory address > + > +**/ > +EFI_STATUS > +AcceptMemoryResource ( > + IN EFI_ALLOCATE_TYPE Type, > + IN UINTN AcceptSize, > + IN OUT EFI_PHYSICAL_ADDRESS *Memory > + ); > + > /** > Internal function. Used by the pool functions to allocate pages > to back pool allocation requests. > diff --git a/MdeModulePkg/Core/Dxe/Mem/Page.c b/MdeModulePkg/Core/Dxe/Mem/Page.c > index 160289c1f9ec..513792a7fe04 100644 > --- a/MdeModulePkg/Core/Dxe/Mem/Page.c > +++ b/MdeModulePkg/Core/Dxe/Mem/Page.c > @@ -10,6 +10,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent > #include "Imem.h" > #include "HeapGuard.h" > #include > +#include > > // > // Entry for tracking the memory regions for each memory type to coalesce similar memory types > @@ -379,6 +380,176 @@ CoreFreeMemoryMapStack ( > mFreeMapStack -= 1; > } > > +/** > + Used to accept memory when OOM occurs. > + > + @param Type The type of allocation to perform. > + @param AcceptSize Size of memory to be accepted. > + @param Memory Accept memory address > + > +**/ > +EFI_STATUS > +AcceptMemoryResource ( > + IN EFI_ALLOCATE_TYPE Type, > + IN UINTN AcceptSize, > + IN OUT EFI_PHYSICAL_ADDRESS *Memory > + ) > +{ > + #ifdef MDE_CPU_X64 > + > + LIST_ENTRY *Link; > + EFI_GCD_MAP_ENTRY *GcdEntry; > + EFI_GCD_MAP_ENTRY UnacceptedEntry; > + EDKII_MEMORY_ACCEPT_PROTOCOL *MemoryAcceptProtocol; > + UINTN Start; > + UINTN End; > + EFI_STATUS Status; > + > + // > + // We accept n*32MB at one time to improve the efficiency. > + // > + AcceptSize = (AcceptSize + SIZE_32MB - 1) & ~(SIZE_32MB - 1); > + > + if (AcceptSize == 0) { > + return EFI_INVALID_PARAMETER; > + } > + > + Status = gBS->LocateProtocol (&gEdkiiMemoryAcceptProtocolGuid, NULL, (VOID **)&MemoryAcceptProtocol); > + if (EFI_ERROR (Status)) { > + return EFI_UNSUPPORTED; > + } > + > + if (Type == AllocateAddress) { > + Start = *Memory; > + End = *Memory + AcceptSize; > + } > + > + if (Type == AllocateMaxAddress) { > + if (*Memory < EFI_PAGE_MASK) { > + return EFI_INVALID_PARAMETER; > + } > + > + if ((*Memory & EFI_PAGE_MASK) != EFI_PAGE_MASK) { > + // > + // Change MaxAddress to be 1 page lower > + // > + *Memory -= EFI_PAGE_SIZE; > + > + // > + // Set MaxAddress to a page boundary > + // > + *Memory &= ~(UINT64)EFI_PAGE_MASK; > + > + // > + // Set MaxAddress to end of the page > + // > + *Memory |= EFI_PAGE_MASK; > + } > + } > + > + // > + // Traverse the mGcdMemorySpaceMap to find out the unaccepted > + // memory entry with big enough size. > + // > + Link = mGcdMemorySpaceMap.ForwardLink; > + while (Link != &mGcdMemorySpaceMap) { > + GcdEntry = CR (Link, EFI_GCD_MAP_ENTRY, Link, EFI_GCD_MAP_SIGNATURE); > + if (GcdEntry->GcdMemoryType == EFI_GCD_MEMORY_TYPE_UNACCEPTED) { > + if (Type == AllocateMaxAddress) { > + if (GcdEntry->BaseAddress + AcceptSize - 1 > *Memory) { > + Link = Link->ForwardLink; > + continue; > + } > + } else if (Type == AllocateAddress) { > + if ((GcdEntry->BaseAddress > *Memory) || (GcdEntry->EndAddress < *Memory + AcceptSize - 1)) { > + Link = Link->ForwardLink; > + continue; > + } > + } > + > + // > + // Is the entry big enough? > + // > + if (AcceptSize <= GcdEntry->EndAddress - GcdEntry->BaseAddress + 1) { > + UnacceptedEntry = *GcdEntry; > + if (Type != AllocateAddress) { > + Start = UnacceptedEntry.BaseAddress; > + End = UnacceptedEntry.BaseAddress + AcceptSize - 1; > + } > + > + break; > + } > + } > + > + Link = Link->ForwardLink; > + } > + > + if (Link == &mGcdMemorySpaceMap) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + // > + // Accept memory using the interface provide by the protocol. > + // > + Status = MemoryAcceptProtocol->AcceptMemory (MemoryAcceptProtocol, Start, AcceptSize); > + if (EFI_ERROR (Status)) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + // > + // If memory is accepted successfully, remove the target memory space from GCD. > + // > + CoreRemoveMemorySpace (UnacceptedEntry.BaseAddress, UnacceptedEntry.EndAddress - UnacceptedEntry.BaseAddress + 1); > + > + // > + // Add the remain lower part of unaccepted memory to the > + // Gcd memory space and memory map. > + // > + if (Start > UnacceptedEntry.BaseAddress) { > + CoreAddMemorySpace ( > + EFI_GCD_MEMORY_TYPE_UNACCEPTED, > + UnacceptedEntry.BaseAddress, > + Start - UnacceptedEntry.BaseAddress, > + UnacceptedEntry.Capabilities > + ); > + } > + > + // > + // Update accepted part of the memory entry to type of EfiGcdMemoryTypeSystemMemory > + // and add the range to the memory map. > + // > + CoreAddMemorySpace ( > + EfiGcdMemoryTypeSystemMemory, > + Start, > + AcceptSize, > + // > + // Hardcode memory space attributes. > + // > + EFI_MEMORY_CPU_CRYPTO | EFI_MEMORY_XP | EFI_MEMORY_RO | EFI_MEMORY_RP > + ); > + > + // > + // Add the remain higher part of unaccepted memory to the > + // Gcd memory space and memory map. > + // > + if (UnacceptedEntry.EndAddress > End) { > + CoreAddMemorySpace ( > + EFI_GCD_MEMORY_TYPE_UNACCEPTED, > + End + 1, > + UnacceptedEntry.EndAddress - End, > + UnacceptedEntry.Capabilities > + ); > + } > + > + return EFI_SUCCESS; > + > + #else > + > + return EFI_UNSUPPORTED; > + > + #endif > +} > + > /** > Find untested but initialized memory regions in GCD map and convert them to be DXE allocatable. > > @@ -1486,6 +1657,25 @@ CoreAllocatePages ( > Memory, > NeedGuard > ); > + #ifdef MDE_CPU_X64 > + > + if (Status == EFI_OUT_OF_RESOURCES) { > + Status = AcceptMemoryResource (Type, NumberOfPages << EFI_PAGE_SHIFT, Memory); > + if (!EFI_ERROR (Status)) { > + Status = CoreInternalAllocatePages ( > + Type, > + MemoryType, > + NumberOfPages, > + Memory, > + NeedGuard > + ); > + } else { > + Status = EFI_OUT_OF_RESOURCES; > + } > + } > + > + #endif > + > if (!EFI_ERROR (Status)) { > CoreUpdateProfile ( > (EFI_PHYSICAL_ADDRESS)(UINTN)RETURN_ADDRESS (0), > diff --git a/MdeModulePkg/Core/Dxe/Mem/Pool.c b/MdeModulePkg/Core/Dxe/Mem/Pool.c > index 7aaf501600cf..9e8c8611c1ef 100644 > --- a/MdeModulePkg/Core/Dxe/Mem/Pool.c > +++ b/MdeModulePkg/Core/Dxe/Mem/Pool.c > @@ -273,6 +273,20 @@ CoreAllocatePool ( > EFI_STATUS Status; > > Status = CoreInternalAllocatePool (PoolType, Size, Buffer); > + > + #ifdef MDE_CPU_X64 > + > + if (Status == EFI_OUT_OF_RESOURCES) { > + Status = AcceptMemoryResource (AllocateAnyPages, Size, NULL); > + if (!EFI_ERROR (Status)) { > + Status = CoreInternalAllocatePool (PoolType, Size, Buffer); > + } else { > + Status = EFI_OUT_OF_RESOURCES; > + } > + } > + > + #endif > + > if (!EFI_ERROR (Status)) { > CoreUpdateProfile ( > (EFI_PHYSICAL_ADDRESS)(UINTN)RETURN_ADDRESS (0),