Reviewed-By: Tuan Phan <tuanp...@os.amperecomputing.com> > On Jul 19, 2021, at 1:07 AM, Sunny Wang via groups.io > <Sunny.Wang=arm....@groups.io> wrote: > > This is to fix the SCT BS.AllocatePages failures (not found) with the > case that the Start address is not aligned to 64k. > For example, > The following is available memory region for testing: > 0000000082012000-00000000EB6D9FFF 00000000000696C8 > With the current page alignment calculation, we will get: > Start address is 0x82020000 > PageNum is 0x696B8 > In BS.AllocatePages, it will make the end address align with 64k, > so PageNum will be changed from 0x696B8 to 0x696C0. Therefore, the > end address will become 0xEB6E0000 which is larger than 0xEB6D9FFF, > so we get not found error in the end. > > Therefore, the calculation for getting the PageNum should be updated > to PageNum - (2 * EFI_SIZE_TO_PAGES(0x10000)) so that we won't get a > wrong PageNum to allocate a memory with a size larger than available > space's size. > > With this solution, the example above will get 0x696A8 as calculated > PageNum. Then, in BS.AllocatePages, the PageNum will be changed from > 0x696A8 to 0x696B0. Therefore, the end address will become 0xEB6D0000 > that is smaller than 0xEB6D9FFF, so we get not found error in the end. > > I also tested this solution on two ARM platforms (NXP1046A and RPi4). > > Cc: Samer El-Haj-Mahmoud <samer.el-haj-mahm...@arm.com> > Cc: G Edhaya Chandran <edhaya.chand...@arm.com> > Cc: Barton Gao <gao...@byosoft.com.cn> > Signed-off-by: Sunny Wang <sunny.w...@arm.com> > --- > .../MemoryAllocationServicesBBTestFunction.c | 110 +++++++++++------- > 1 file changed, 66 insertions(+), 44 deletions(-) > > diff --git > a/uefi-sct/SctPkg/TestCase/UEFI/EFI/BootServices/MemoryAllocationServices/BlackBoxTest/MemoryAllocationServicesBBTestFunction.c > > b/uefi-sct/SctPkg/TestCase/UEFI/EFI/BootServices/MemoryAllocationServices/BlackBoxTest/MemoryAllocationServicesBBTestFunction.c > index bf8cd3b3..cdfac992 100644 > --- > a/uefi-sct/SctPkg/TestCase/UEFI/EFI/BootServices/MemoryAllocationServices/BlackBoxTest/MemoryAllocationServicesBBTestFunction.c > +++ > b/uefi-sct/SctPkg/TestCase/UEFI/EFI/BootServices/MemoryAllocationServices/BlackBoxTest/MemoryAllocationServicesBBTestFunction.c > @@ -2,6 +2,7 @@ > > Copyright 2006 - 2013 Unified EFI, Inc.<BR> > Copyright (c) 2010 - 2013, Intel Corporation. All rights reserved.<BR> > + Copyright (c) 2021, ARM Limited. All rights reserved. > > This program and the accompanying materials > are licensed and made available under the terms and conditions of the BSD > License > @@ -24,7 +25,7 @@ Abstract: > > --*/ > > -#include "SctLib.h" > +#include "SctLib.h" > #include "MemoryAllocationServicesBBTestMain.h" > > #define ALLOCATEPAGES_MEMORYTYPE_NUM 16 > @@ -700,14 +701,17 @@ BBTestAllocatePagesInterfaceTest ( > PageNum = (UINTN)Descriptor.NumberOfPages; > Start = Descriptor.PhysicalStart; > > - // > - // Some memory types need more alignment than 4K, so > - // > - if (PageNum <= 0x10) { > + // > + // Calculate New Start address and PageNum with 64k alignment to > + // cover the case that some memory types' alignment is more than > + // 4k. If the available memory is less than 192k, the memory > + // allocation call will be skipped. > + // > + if (PageNum < (3 * EFI_SIZE_TO_PAGES(0x10000))) { > break; > } > - Start = (Start + 0xFFFF) & 0xFFFFFFFFFFFF0000; > - PageNum = PageNum - EFI_SIZE_TO_PAGES(0x10000); > + Start = (Start + 0xFFFF) & 0xFFFFFFFFFFFF0000; > + PageNum = PageNum - (2 * EFI_SIZE_TO_PAGES(0x10000)); > > Memory = Start; > > @@ -830,14 +834,17 @@ BBTestAllocatePagesInterfaceTest ( > PageNum = (UINTN)Descriptor.NumberOfPages; > Start = Descriptor.PhysicalStart; > > - // > - // Some memory types need more alignment than 4K, so > - // > - if (PageNum <= 0x10) { > + // > + // Calculate New Start address and PageNum with 64k alignment to > + // cover the case that some memory types' alignment is more than > + // 4k. If the available memory is less than 192k, the memory > + // allocation call will be skipped. > + // > + if (PageNum < (3 * EFI_SIZE_TO_PAGES(0x10000))) { > break; > } > - Start = (Start + 0xFFFF) & 0xFFFFFFFFFFFF0000; > - PageNum = PageNum - EFI_SIZE_TO_PAGES(0x10000); > + Start = (Start + 0xFFFF) & 0xFFFFFFFFFFFF0000; > + PageNum = PageNum - (2 * EFI_SIZE_TO_PAGES(0x10000)); > > Memory = Start; > > @@ -953,14 +960,17 @@ BBTestAllocatePagesInterfaceTest ( > PageNum = (UINTN)Descriptor.NumberOfPages; > Start = Descriptor.PhysicalStart; > > - // > - // Some memory types need more alignment than 4K, so > - // > - if (PageNum <= 0x10) { > + // > + // Calculate New Start address and PageNum with 64k alignment to > + // cover the case that some memory types' alignment is more than > + // 4k. If the available memory is less than 192k, the memory > + // allocation call will be skipped. > + // > + if (PageNum < (3 * EFI_SIZE_TO_PAGES(0x10000))) { > break; > } > - Start = (Start + 0xFFFF) & 0xFFFFFFFFFFFF0000; > - PageNum = PageNum - EFI_SIZE_TO_PAGES(0x10000); > + Start = (Start + 0xFFFF) & 0xFFFFFFFFFFFF0000; > + PageNum = PageNum - (2 * EFI_SIZE_TO_PAGES(0x10000)); > > Memory = Start + (SctLShiftU64 (PageNum/3, EFI_PAGE_SHIFT) & > 0xFFFFFFFFFFFF0000); > > @@ -1076,14 +1086,17 @@ BBTestAllocatePagesInterfaceTest ( > PageNum = (UINTN)Descriptor.NumberOfPages; > Start = Descriptor.PhysicalStart; > > - // > - // Some memory types need more alignment than 4K, so > - // > - if (PageNum <= 0x10) { > + // > + // Calculate New Start address and PageNum with 64k alignment to > + // cover the case that some memory types' alignment is more than > + // 4k. If the available memory is less than 192k, the memory > + // allocation call will be skipped. > + // > + if (PageNum < (3 * EFI_SIZE_TO_PAGES(0x10000))) { > break; > } > - Start = (Start + 0xFFFF) & 0xFFFFFFFFFFFF0000; > - PageNum = PageNum - EFI_SIZE_TO_PAGES(0x10000); > + Start = (Start + 0xFFFF) & 0xFFFFFFFFFFFF0000; > + PageNum = PageNum - (2 * EFI_SIZE_TO_PAGES(0x10000)); > > Memory = Start + (SctLShiftU64 (PageNum * 2 / 3, EFI_PAGE_SHIFT) & > 0xFFFFFFFFFFFF0000); > > @@ -1206,14 +1219,17 @@ BBTestAllocatePagesInterfaceTest ( > PageNum = (UINTN)Descriptor.NumberOfPages; > Start = Descriptor.PhysicalStart; > > - // > - // Some memory types need more alignment than 4K, so > - // > - if (PageNum <= 0x10) { > + // > + // Calculate New Start address and PageNum with 64k alignment to > + // cover the case that some memory types' alignment is more than > + // 4k. If the available memory is less than 192k, the memory > + // allocation call will be skipped. > + // > + if (PageNum < (3 * EFI_SIZE_TO_PAGES(0x10000))) { > break; > } > - Start = (Start + 0xFFFF) & 0xFFFFFFFFFFFF0000; > - PageNum = PageNum - EFI_SIZE_TO_PAGES(0x10000); > + Start = (Start + 0xFFFF) & 0xFFFFFFFFFFFF0000; > + PageNum = PageNum - (2 * EFI_SIZE_TO_PAGES(0x10000)); > > Memory = Start; > > @@ -1329,14 +1345,17 @@ BBTestAllocatePagesInterfaceTest ( > PageNum = (UINTN)Descriptor.NumberOfPages; > Start = Descriptor.PhysicalStart; > > - // > - // Some memory types need more alignment than 4K, so > - // > - if (PageNum <= 0x10) { > + // > + // Calculate New Start address and PageNum with 64k alignment to > + // cover the case that some memory types' alignment is more than > + // 4k. If the available memory is less than 192k, the memory > + // allocation call will be skipped. > + // > + if (PageNum < (3 * EFI_SIZE_TO_PAGES(0x10000))) { > break; > } > - Start = (Start + 0xFFFF) & 0xFFFFFFFFFFFF0000; > - PageNum = PageNum - EFI_SIZE_TO_PAGES(0x10000); > + Start = (Start + 0xFFFF) & 0xFFFFFFFFFFFF0000; > + PageNum = PageNum - (2 * EFI_SIZE_TO_PAGES(0x10000)); > > Memory = Start; > > @@ -1468,14 +1487,17 @@ BBTestAllocatePagesInterfaceTest ( > PageNum = (UINTN)Descriptor.NumberOfPages; > Start = Descriptor.PhysicalStart; > > - // > - // Some memory types need more alignment than 4K, so > - // > - if (PageNum <= 0x10) { > + // > + // Calculate New Start address and PageNum with 64k alignment to > + // cover the case that some memory types' alignment is more than > + // 4k. If the available memory is less than 192k, the memory > + // allocation call will be skipped. > + // > + if (PageNum < (3 * EFI_SIZE_TO_PAGES(0x10000))) { > break; > } > - Start = (Start + 0xFFFF) & 0xFFFFFFFFFFFF0000; > - PageNum = PageNum - EFI_SIZE_TO_PAGES(0x10000); > + Start = (Start + 0xFFFF) & 0xFFFFFFFFFFFF0000; > + PageNum = PageNum - (2 * EFI_SIZE_TO_PAGES(0x10000)); > > Memory = Start; > > @@ -1923,4 +1945,4 @@ BBTestFreePoolInterfaceTest ( > > FreeMemoryMap (); > return EFI_SUCCESS; > -} > +} > -- > 2.31.0.windows.1 > > > > > >
-=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#78619): https://edk2.groups.io/g/devel/message/78619 Mute This Topic: https://groups.io/mt/84303611/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-