[edk2-devel] [edk2-test][PATCH v1 1/1] uefi-sct/SctPkg: Update page alignment calculations

Tuan Phan via groups.io tuanphan=os.amperecomputing.com at groups.io
Tue Aug 3 21:40:22 UTC 2021


Reviewed-By: Tuan Phan <tuanphan at os.amperecomputing.com>

> On Jul 19, 2021, at 1:07 AM, Sunny Wang via groups.io <Sunny.Wang=arm.com at 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-mahmoud at arm.com>
> Cc: G Edhaya Chandran <edhaya.chandran at arm.com>
> Cc: Barton Gao <gaojie at byosoft.com.cn>
> Signed-off-by: Sunny Wang <sunny.wang at 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/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/edk2-devel-archive/attachments/20210803/cdddb06c/attachment.htm>


More information about the edk2-devel-archive mailing list