When running Enquire.efi, several errors similar to the following are produced:
Maximum exponent = 128
Maximum number = 3.40282347e+38
*** WARNING: Possibly bad output from printf above
    expected value around 3.40282347e38, bit pattern:
    11111111 11111111 01111111 01111111
    sscanf gave           -inf, bit pattern:
    00000000 00000000 10000000 11111111
    difference= inf
Overflow doesn’t seem to generate a trap
The memory allocation tests will also fail, sometimes leaving all available memory consumed.
The correct output in the above example is:
Maximum exponent = 128
Maximum number = 3.40282347e+38
Overflow doesn't seem to generate a trap
The root cause is that all operations on values of Long or ULong type, within the gdtoa library, must be 32-bit operations.  A previous change replaced the Long and ULong definitions with INTN and UINTN, respectively.  While this is correct for a lot of Linux and NetBSD code, it was not correct for this library.
This fix reverts the definitions of ULong and Long back to 32-bit types.
A descriptive comment has also been added to the U union.
Additional white-space has been added to tidy up the definitions of the word0 and word1 macros.
Verified with Enquire.efi and the ISO/IEC C Library compliance Validation Suite.
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Daryl McDaniel <daryl.mcdaniel@intel.com>
Reviewed-by: Jaben Carsey <Jaben.carsey@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15765 6f19259b-4bc3-4df7-8a09-765794883524
		
	
		
			
				
	
	
		
			169 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
| 
 | |
|   Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
 | |
|   This program and the accompanying materials are licensed and made available under
 | |
|   the terms and conditions of the BSD License that accompanies this distribution.
 | |
|   The full text of the license may be found at
 | |
|   http://opensource.org/licenses/bsd-license.
 | |
| 
 | |
|   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | |
|   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | |
| 
 | |
| The author of this software is David M. Gay.
 | |
| 
 | |
| Copyright (C) 1998 by Lucent Technologies
 | |
| All Rights Reserved
 | |
| 
 | |
| Permission to use, copy, modify, and distribute this software and
 | |
| its documentation for any purpose and without fee is hereby
 | |
| granted, provided that the above copyright notice appear in all
 | |
| copies and that both that the copyright notice and this
 | |
| permission notice and warranty disclaimer appear in supporting
 | |
| documentation, and that the name of Lucent or any of its entities
 | |
| not be used in advertising or publicity pertaining to
 | |
| distribution of the software without specific, written prior
 | |
| permission.
 | |
| 
 | |
| LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 | |
| INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
 | |
| IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
 | |
| SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 | |
| WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
 | |
| IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
 | |
| ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
 | |
| THIS SOFTWARE.
 | |
| 
 | |
|   $NetBSD: gdtoa.h,v 1.6.4.1.4.1 2008/04/08 21:10:55 jdc Exp
 | |
| 
 | |
| ****************************************************************/
 | |
| 
 | |
| /* Please send bug reports to David M. Gay (dmg at acm dot org,
 | |
|  * with " at " changed at "@" and " dot " changed to ".").  */
 | |
| 
 | |
| #ifndef GDTOA_H_INCLUDED
 | |
| #define GDTOA_H_INCLUDED
 | |
| #include  <LibConfig.h>
 | |
| 
 | |
| #include "arith.h"
 | |
| 
 | |
| #ifndef Long
 | |
| #define Long int32_t
 | |
| #endif
 | |
| #ifndef ULong
 | |
| #define ULong uint32_t
 | |
| #endif
 | |
| #ifndef UShort
 | |
| #define UShort uint16_t
 | |
| #endif
 | |
| 
 | |
| #ifndef ANSI
 | |
| #define ANSI(x) x
 | |
| #define Void void
 | |
| #endif /* ANSI */
 | |
| 
 | |
| #ifndef CONST
 | |
| #define CONST const
 | |
| #endif /* CONST */
 | |
| 
 | |
| enum {  /* return values from strtodg */
 | |
|   STRTOG_Zero = 0,
 | |
|   STRTOG_Normal = 1,
 | |
|   STRTOG_Denormal = 2,
 | |
|   STRTOG_Infinite = 3,
 | |
|   STRTOG_NaN  = 4,
 | |
|   STRTOG_NaNbits  = 5,
 | |
|   STRTOG_NoNumber = 6,
 | |
|   STRTOG_Retmask  = 7,
 | |
| 
 | |
|   /* The following may be or-ed into one of the above values. */
 | |
| 
 | |
|   STRTOG_Neg  = 0x08,
 | |
|   STRTOG_Inexlo = 0x10,
 | |
|   STRTOG_Inexhi = 0x20,
 | |
|   STRTOG_Inexact  = 0x30,
 | |
|   STRTOG_Underflow= 0x40,
 | |
|   STRTOG_Overflow = 0x80,
 | |
|   STRTOG_NoMemory = 0x100
 | |
| };
 | |
| 
 | |
|  typedef struct
 | |
| FPI {
 | |
|   int nbits;
 | |
|   int emin;
 | |
|   int emax;
 | |
|   int rounding;
 | |
|   int sudden_underflow;
 | |
| } FPI;
 | |
| 
 | |
| enum {  /* FPI.rounding values: same as FLT_ROUNDS */
 | |
|   FPI_Round_zero = 0,
 | |
|   FPI_Round_near = 1,
 | |
|   FPI_Round_up = 2,
 | |
|   FPI_Round_down = 3
 | |
| };
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| #define dtoa    __dtoa
 | |
| #define gdtoa   __gdtoa
 | |
| #define ldtoa   __ldtoa
 | |
| #define hldtoa    __hldtoa
 | |
| #define hdtoa   __hdtoa
 | |
| #define freedtoa  __freedtoa
 | |
| #define strtodg   __strtodg_D2A
 | |
| #define strtopQ   __strtopQ_D2A
 | |
| #define strtopx   __strtopx_D2A
 | |
| #define strtopxL  __strtopxL_D2A
 | |
| #define strtord   __strtord_D2A
 | |
| 
 | |
| extern char* dtoa  ANSI((double d, int mode, int ndigits, int *decpt,
 | |
|       int *sign, char **rve));
 | |
| extern char* hdtoa ANSI((double d, const char *xdigs, int ndigits, int *decpt,
 | |
|       int *sign, char **rve));
 | |
| extern char* ldtoa ANSI((long double *ld, int mode, int ndigits, int *decpt,
 | |
|       int *sign, char **rve));
 | |
| extern char* hldtoa ANSI((long double e, const char *xdigs, int ndigits,
 | |
|       int *decpt, int *sign, char **rve));
 | |
| 
 | |
| extern char* gdtoa ANSI((FPI *fpi, int be, ULong *bits, int *kindp,
 | |
|       int mode, int ndigits, int *decpt, char **rve));
 | |
| extern void freedtoa ANSI((char*));
 | |
| extern float  strtof ANSI((CONST char *, char **));
 | |
| extern double strtod ANSI((CONST char *, char **));
 | |
| extern int strtodg ANSI((CONST char*, char**, CONST FPI*, Long*, ULong*));
 | |
| 
 | |
| extern char*  g_ddfmt  ANSI((char*, double*, int, unsigned));
 | |
| extern char*  g_dfmt   ANSI((char*, double*, int, unsigned));
 | |
| extern char*  g_ffmt   ANSI((char*, float*,  int, unsigned));
 | |
| extern char*  g_Qfmt   ANSI((char*, void*,   int, unsigned));
 | |
| extern char*  g_xfmt   ANSI((char*, void*,   int, unsigned));
 | |
| extern char*  g_xLfmt  ANSI((char*, void*,   int, unsigned));
 | |
| 
 | |
| extern int  strtoId  ANSI((CONST char*, char**, double*, double*));
 | |
| extern int  strtoIdd ANSI((CONST char*, char**, double*, double*));
 | |
| extern int  strtoIf  ANSI((CONST char*, char**, float*, float*));
 | |
| extern int  strtoIQ  ANSI((CONST char*, char**, void*, void*));
 | |
| extern int  strtoIx  ANSI((CONST char*, char**, void*, void*));
 | |
| extern int  strtoIxL ANSI((CONST char*, char**, void*, void*));
 | |
| extern int  strtord  ANSI((CONST char*, char**, int, double*));
 | |
| extern int  strtordd ANSI((CONST char*, char**, int, double*));
 | |
| extern int  strtorf  ANSI((CONST char*, char**, int, float*));
 | |
| extern int  strtorQ  ANSI((CONST char*, char**, int, void*));
 | |
| extern int  strtorx  ANSI((CONST char*, char**, int, void*));
 | |
| extern int  strtorxL ANSI((CONST char*, char**, int, void*));
 | |
| 
 | |
| extern int  strtodI  ANSI((CONST char*, char**, double*));
 | |
| extern int  strtopd  ANSI((CONST char*, char**, double*));
 | |
| extern int  strtopdd ANSI((CONST char*, char**, double*));
 | |
| extern int  strtopf  ANSI((CONST char*, char**, float*));
 | |
| extern int  strtopQ  ANSI((CONST char*, char**, void*));
 | |
| extern int  strtopx  ANSI((CONST char*, char**, void*));
 | |
| extern int  strtopxL ANSI((CONST char*, char**, void*));
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| #endif /* GDTOA_H_INCLUDED */
 |