The domain of valid values for EFI_MEMORY_TYPE (per UEFI specification) is (list of values AND range of values). Problem is not in the list, rather in range. IMHO, UINT32 is better choice.
On Sat, Jan 12, 2013 at 7:54 AM, Isakov Sergey <isakov...@bk.ru> wrote: > OK, > quick test with clang shows that it considers enum as INT32. > --------- > int A = sizeof(EFI_MEMORY_TYPE); > printf("Hello World!\n sizeof(EFI_MEMORY_TYPE) = %d\n", A); > --------- > result = 4 even it compiled as x86_64 > > On 12.01.2013, at 1:08, Kinney, Michael D wrote: > > 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 > > > > ------------------------------------------------------------------------------ > Master Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS, > MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current > with LearnDevNow - 3,200 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_122912 > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/edk2-devel > ------------------------------------------------------------------------------ Master Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS, MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current with LearnDevNow - 3,200 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_122912 _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel