Nikolai, Based Section 2.3 of the UEFI Spec section on Calling Convention and Data Types, my proposed code change for compatibility should use UINT32 instead of UINTN:
if ((PoolType >= EfiMaxMemoryType && (UINT32)PoolType <= 0x7fffffff) || Does this code change resolve the clang compiler warning/error? UEFI Spec defines EFI_MEMORY_TYPE as an enum, and ANSI C allows compilers to have flexibility for enums to be signed or unsigned. Details from UEFI Spec shown below. This means we cannot change the declaration of EFI_MEMORY_TYPE to be a UINT32 and we cannot make any assumptions about EFI_MEMORY_TYPE being signed or unsigned. UEFI Specification Section 6.2 - Memory Allocation Services - AllocatePages() defines EFI_MEMORY_TYPE to be an enum.: //******************************************************* //EFI_MEMORY_TYPE //******************************************************* // These type values are discussed in Table 24 and Table 25. typedef enum { EfiReservedMemoryType, EfiLoaderCode, EfiLoaderData, EfiBootServicesCode, EfiBootServicesData, EfiRuntimeServicesCode, EfiRuntimeServicesData, EfiConventionalMemory, EfiUnusableMemory, EfiACPIReclaimMemory, EfiACPIMemoryNVS, EfiMemoryMappedIO, EfiMemoryMappedIOPortSpace, EfiPalCode, EfiMaxMemoryType } EFI_MEMORY_TYPE; UEFI Specification Section 2.3.1 - Data Types - Table 6 has the following entry for enumerated types: <Enumerated Type> Element of a standard ANSI C enum type declaration. Type INT32 or UINT32. ANSI C does not define the size of sign of an enum so they should never be used in structures. ANSI C integer promotion rules make INT32 or UINT32 interchangeable when passed as an argument to a function. The issue is that some compilers treat enums as signed and others as unsigned. The EDK II implementation attempts to be compatible with both types of compilers. Best regards, Mike -----Original Message----- From: Nikolai Saoukh [mailto:n...@otdel-1.org] Sent: Friday, January 11, 2013 9:32 AM To: edk2-devel@lists.sourceforge.net Subject: Re: [edk2] clang compilation error Well, what is wrong with UINT32 as type for EFI_MEMORY_TYPE? Why EFI_MEMORY_TYPE should be signed? On Fri, Jan 11, 2013 at 9:00 PM, Kinney, Michael D <michael.d.kin...@intel.com> wrote: > Sergey, > > > > The comparison against 0x7fffffff is required due to a UEFI Spec > requirement. UEFI Specification 2.3.1 Section 6.2 AllocatePages() and > AllocatePool() both have a MemoryType parameter that is defined as follows: > > > > MemoryType > > > > The type of memory to allocate. The type EFI_MEMORY_TYPE is defined in > “Related Definitions” below. These memory types are also described in more > detail in Table 24 and Table 25. Normal allocations (that is, allocations by > any UEFI application) are of type EfiLoaderData. MemoryType values in the > range 0x80000000..0xFFFFFFFF are reserved for use by UEFI OS loaders that > are provided by operating system vendors. The only illegal memory type > values are those in the range EfiMaxMemoryType..0x7FFFFFFF. > > > > Since we have to be compatible with both 32-bit and 64-bit CPUs, we cannot > implement logic that depends on an enum being a 32-bit signed value. > > > > There are two ways to address this compiler error: > > > > 1) Disable this compiler warning for this one compiler in tools_def.txt > > 2) Update the sources to perform an unsigned comparison such as: > > > > if ((PoolType >= EfiMaxMemoryType && (UINTN)PoolType <= 0x7fffffff) || > > Best regards, > > > > Mike > > > > From: Sergey Isakov [mailto:isakov...@bk.ru] > Sent: Friday, January 11, 2013 2:15 AM > To: edk2-devel@lists.sourceforge.net > Subject: Re: [edk2] clang compilation error > > > > Ok, UEFI spec is wrong and as we have to follow them we should exclude the > comparison. > > > > 11.01.2013, в 11:58, Tim Lewis написал(а): > > > > Sergey – > > > > It is an enum in the UEFI specification. > > > > Why not just remove the second comparison? Since the enum is an int (for > UEFI cases), if it is more than or equal to EfiMaxMemoryType, it must be > less than 0x7fffffff (if it is an int). Otherwise it would be less than 0. > > > > Tim > > > > From: Sergey Isakov [mailto:isakov...@bk.ru] > Sent: Thursday, January 10, 2013 11:54 PM > To: edk2-devel@lists.sourceforge.net > Subject: [edk2] clang compilation error > > > > Hi, > > with clang 3.3 one has the follow > > ---------- > > /edk2/MdeModulePkg/Core/Dxe/Mem/Pool.c:188:49: error: comparison of constant > 2147483647 with expression of type 'EFI_MEMORY_TYPE' is always true > [-Werror,-Wtautological-constant-out-of-range-compare] if ((PoolType >= > EfiMaxMemoryType && PoolType <= 0x7fffffff) || > ~~~~~~~~ ^ ~~~~~~~~~~ > 1 error generated. > > ---------- > > Again, it is enum and sholud not be compared. > > I will propose to make this as UINT32 and change enum list by a set of > definitions like > > #define EfiACPIMemoryNVS 0x0A > > > > It will be better then mix enum and integer. > > ------------------------------------------------------------------------------ > Master HTML5, CSS3, ASP.NET, MVC, AJAX, Knockout.js, Web API and > much more. Get web development skills now with LearnDevNow - > 350+ hours of step-by-step video tutorials by Microsoft MVPs and experts. > SALE $99.99 this month only -- learn more at: > http://p.sf.net/sfu/learnmore_122812_______________________________________________ > edk2-devel mailing list > edk2-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/edk2-devel > > > > > ------------------------------------------------------------------------------ > Master HTML5, CSS3, ASP.NET, MVC, AJAX, Knockout.js, Web API and > much more. Get web development skills now with LearnDevNow - > 350+ hours of step-by-step video tutorials by Microsoft MVPs and experts. > SALE $99.99 this month only -- learn more at: > http://p.sf.net/sfu/learnmore_122812 > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/edk2-devel > ------------------------------------------------------------------------------ Master HTML5, CSS3, ASP.NET, MVC, AJAX, Knockout.js, Web API and much more. Get web development skills now with LearnDevNow - 350+ hours of step-by-step video tutorials by Microsoft MVPs and experts. SALE $99.99 this month only -- learn more at: http://p.sf.net/sfu/learnmore_122812 _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel ------------------------------------------------------------------------------ Master HTML5, CSS3, ASP.NET, MVC, AJAX, Knockout.js, Web API and much more. Get web development skills now with LearnDevNow - 350+ hours of step-by-step video tutorials by Microsoft MVPs and experts. SALE $99.99 this month only -- learn more at: http://p.sf.net/sfu/learnmore_122812 _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel