[coreboot] New patch to review: c630800 libpayload: Some more compatibility (for flashrom)

Patrick Georgi (patrick@georgi-clan.de) gerrit at coreboot.org
Tue Aug 16 15:48:40 CEST 2011


Patrick Georgi (patrick at georgi-clan.de) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/154

-gerrit

commit c630800f75d9c73def4c36021af7353d4c02d978
Author: Patrick Georgi <patrick.georgi at secunet.com>
Date:   Tue Jul 26 12:51:59 2011 +0200

    libpayload: Some more compatibility (for flashrom)
    
    libpci defines an arbitrary set of PCI vendor IDs, flashrom uses the
    Intel definition. Add it.
    
    flashrom also requires inttypes.h, so add the OpenBSD version
    
    Change-Id: I9bffd8193f635c375ac4d6b6eae8d3d876b95f5f
    Signed-off-by: Patrick Georgi <patrick.georgi at secunet.com>
---
 payloads/libpayload/include/inttypes.h   |  267 ++++++++++++++++++++++++++++++
 payloads/libpayload/include/pci/pci.h    |    2 +
 payloads/libpayload/include/stdlib.h     |    1 +
 payloads/libpayload/include/sys/stdint.h |  185 +++++++++++++++++++++
 payloads/libpayload/libc/string.c        |   13 ++-
 5 files changed, 466 insertions(+), 2 deletions(-)

diff --git a/payloads/libpayload/include/inttypes.h b/payloads/libpayload/include/inttypes.h
new file mode 100644
index 0000000..922f08a
--- /dev/null
+++ b/payloads/libpayload/include/inttypes.h
@@ -0,0 +1,267 @@
+/*	$OpenBSD: inttypes.h,v 1.10 2009/01/13 18:13:51 kettenis Exp $	*/
+
+/*
+ * Copyright (c) 1997, 2005 Todd C. Miller <Todd.Miller at courtesan.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, 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.
+ */
+
+#ifndef	_INTTYPES_H_
+#define	_INTTYPES_H_
+
+#include <sys/stdint.h>
+
+#ifdef __cplusplus
+#define __wchar_t	wchar_t
+#endif
+
+#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS)
+/*
+ * 7.8.1 Macros for format specifiers
+ *
+ * Each of the following object-like macros expands to a string
+ * literal containing a conversion specifier, possibly modified by
+ * a prefix such as hh, h, l, or ll, suitable for use within the
+ * format argument of a formatted input/output function when
+ * converting the corresponding integer type.  These macro names
+ * have the general form of PRI (character string literals for the
+ * fprintf family) or SCN (character string literals for the fscanf
+ * family), followed by the conversion specifier, followed by a
+ * name corresponding to a similar typedef name.  For example,
+ * PRIdFAST32 can be used in a format string to print the value of
+ * an integer of type int_fast32_t.
+ */
+
+/* fprintf macros for signed integers */
+#define	PRId8			"d"		/* int8_t */
+#define	PRId16			"d"		/* int16_t */
+#define	PRId32			"d"		/* int32_t */
+#define	PRId64			"lld"		/* int64_t */
+
+#define	PRIdLEAST8		"d"		/* int_least8_t */
+#define	PRIdLEAST16		"d"		/* int_least16_t */
+#define	PRIdLEAST32		"d"		/* int_least32_t */
+#define	PRIdLEAST64		"lld"		/* int_least64_t */
+
+#define	PRIdFAST8		"d"		/* int_fast8_t */
+#define	PRIdFAST16		"d"		/* int_fast16_t */
+#define	PRIdFAST32		"d"		/* int_fast32_t */
+#define	PRIdFAST64		"lld"		/* int_fast64_t */
+
+#define	PRIdMAX			"jd"		/* intmax_t */
+#define	PRIdPTR			"ld"		/* intptr_t */
+
+#define	PRIi8			"i"		/* int8_t */
+#define	PRIi16			"i"		/* int16_t */
+#define	PRIi32			"i"		/* int32_t */
+#define	PRIi64			"lli"		/* int64_t */
+
+#define	PRIiLEAST8		"i"		/* int_least8_t */
+#define	PRIiLEAST16		"i"		/* int_least16_t */
+#define	PRIiLEAST32		"i"		/* int_least32_t */
+#define	PRIiLEAST64		"lli"		/* int_least64_t */
+
+#define	PRIiFAST8		"i"		/* int_fast8_t */
+#define	PRIiFAST16		"i"		/* int_fast16_t */
+#define	PRIiFAST32		"i"		/* int_fast32_t */
+#define	PRIiFAST64		"lli"		/* int_fast64_t */
+
+#define	PRIiMAX			"ji"		/* intmax_t */
+#define	PRIiPTR			"li"		/* intptr_t */
+
+/* fprintf macros for unsigned integers */
+#define	PRIo8			"o"		/* int8_t */
+#define	PRIo16			"o"		/* int16_t */
+#define	PRIo32			"o"		/* int32_t */
+#define	PRIo64			"llo"		/* int64_t */
+
+#define	PRIoLEAST8		"o"		/* int_least8_t */
+#define	PRIoLEAST16		"o"		/* int_least16_t */
+#define	PRIoLEAST32		"o"		/* int_least32_t */
+#define	PRIoLEAST64		"llo"		/* int_least64_t */
+
+#define	PRIoFAST8		"o"		/* int_fast8_t */
+#define	PRIoFAST16		"o"		/* int_fast16_t */
+#define	PRIoFAST32		"o"		/* int_fast32_t */
+#define	PRIoFAST64		"llo"		/* int_fast64_t */
+
+#define	PRIoMAX			"jo"		/* intmax_t */
+#define	PRIoPTR			"lo"		/* intptr_t */
+
+#define	PRIu8			"u"		/* uint8_t */
+#define	PRIu16			"u"		/* uint16_t */
+#define	PRIu32			"u"		/* uint32_t */
+#define	PRIu64			"llu"		/* uint64_t */
+
+#define	PRIuLEAST8		"u"		/* uint_least8_t */
+#define	PRIuLEAST16		"u"		/* uint_least16_t */
+#define	PRIuLEAST32		"u"		/* uint_least32_t */
+#define	PRIuLEAST64		"llu"		/* uint_least64_t */
+
+#define	PRIuFAST8		"u"		/* uint_fast8_t */
+#define	PRIuFAST16		"u"		/* uint_fast16_t */
+#define	PRIuFAST32		"u"		/* uint_fast32_t */
+#define	PRIuFAST64		"llu"		/* uint_fast64_t */
+
+#define	PRIuMAX			"ju"		/* uintmax_t */
+#define	PRIuPTR			"lu"		/* uintptr_t */
+
+#define	PRIx8			"x"		/* uint8_t */
+#define	PRIx16			"x"		/* uint16_t */
+#define	PRIx32			"x"		/* uint32_t */
+#define	PRIx64			"llx"		/* uint64_t */
+
+#define	PRIxLEAST8		"x"		/* uint_least8_t */
+#define	PRIxLEAST16		"x"		/* uint_least16_t */
+#define	PRIxLEAST32		"x"		/* uint_least32_t */
+#define	PRIxLEAST64		"llx"		/* uint_least64_t */
+
+#define	PRIxFAST8		"x"		/* uint_fast8_t */
+#define	PRIxFAST16		"x"		/* uint_fast16_t */
+#define	PRIxFAST32		"x"		/* uint_fast32_t */
+#define	PRIxFAST64		"llx"		/* uint_fast64_t */
+
+#define	PRIxMAX			"jx"		/* uintmax_t */
+#define	PRIxPTR			"lx"		/* uintptr_t */
+
+#define	PRIX8			"X"		/* uint8_t */
+#define	PRIX16			"X"		/* uint16_t */
+#define	PRIX32			"X"		/* uint32_t */
+#define	PRIX64			"llX"		/* uint64_t */
+
+#define	PRIXLEAST8		"X"		/* uint_least8_t */
+#define	PRIXLEAST16		"X"		/* uint_least16_t */
+#define	PRIXLEAST32		"X"		/* uint_least32_t */
+#define	PRIXLEAST64		"llX"		/* uint_least64_t */
+
+#define	PRIXFAST8		"X"		/* uint_fast8_t */
+#define	PRIXFAST16		"X"		/* uint_fast16_t */
+#define	PRIXFAST32		"X"		/* uint_fast32_t */
+#define	PRIXFAST64		"llX"		/* uint_fast64_t */
+
+#define	PRIXMAX			"jX"		/* uintmax_t */
+#define	PRIXPTR			"lX"		/* uintptr_t */
+
+/* fscanf macros for signed integers */
+#define	SCNd8			"hhd"		/* int8_t */
+#define	SCNd16			"hd"		/* int16_t */
+#define	SCNd32			"d"		/* int32_t */
+#define	SCNd64			"lld"		/* int64_t */
+
+#define	SCNdLEAST8		"hhd"		/* int_least8_t */
+#define	SCNdLEAST16		"hd"		/* int_least16_t */
+#define	SCNdLEAST32		"d"		/* int_least32_t */
+#define	SCNdLEAST64		"lld"		/* int_least64_t */
+
+#define	SCNdFAST8		"hhd"		/* int_fast8_t */
+#define	SCNdFAST16		"hd"		/* int_fast16_t */
+#define	SCNdFAST32		"d"		/* int_fast32_t */
+#define	SCNdFAST64		"lld"		/* int_fast64_t */
+
+#define	SCNdMAX			"jd"		/* intmax_t */
+#define	SCNdPTR			"ld"		/* intptr_t */
+
+#define	SCNi8			"hhi"		/* int8_t */
+#define	SCNi16			"hi"		/* int16_t */
+#define	SCNi32			"i"		/* int32_t */
+#define	SCNi64			"lli"		/* int64_t */
+
+#define	SCNiLEAST8		"hhi"		/* int_least8_t */
+#define	SCNiLEAST16		"hi"		/* int_least16_t */
+#define	SCNiLEAST32		"i"		/* int_least32_t */
+#define	SCNiLEAST64		"lli"		/* int_least64_t */
+
+#define	SCNiFAST8		"hhi"		/* int_fast8_t */
+#define	SCNiFAST16		"hi"		/* int_fast16_t */
+#define	SCNiFAST32		"i"		/* int_fast32_t */
+#define	SCNiFAST64		"lli"		/* int_fast64_t */
+
+#define	SCNiMAX			"ji"		/* intmax_t */
+#define	SCNiPTR			"li"		/* intptr_t */
+
+/* fscanf macros for unsigned integers */
+#define	SCNo8			"hho"		/* uint8_t */
+#define	SCNo16			"ho"		/* uint16_t */
+#define	SCNo32			"o"		/* uint32_t */
+#define	SCNo64			"llo"		/* uint64_t */
+
+#define	SCNoLEAST8		"hho"		/* uint_least8_t */
+#define	SCNoLEAST16		"ho"		/* uint_least16_t */
+#define	SCNoLEAST32		"o"		/* uint_least32_t */
+#define	SCNoLEAST64		"llo"		/* uint_least64_t */
+
+#define	SCNoFAST8		"hho"		/* uint_fast8_t */
+#define	SCNoFAST16		"ho"		/* uint_fast16_t */
+#define	SCNoFAST32		"o"		/* uint_fast32_t */
+#define	SCNoFAST64		"llo"		/* uint_fast64_t */
+
+#define	SCNoMAX			"jo"		/* uintmax_t */
+#define	SCNoPTR			"lo"		/* uintptr_t */
+
+#define	SCNu8			"hhu"		/* uint8_t */
+#define	SCNu16			"hu"		/* uint16_t */
+#define	SCNu32			"u"		/* uint32_t */
+#define	SCNu64			"llu"		/* uint64_t */
+
+#define	SCNuLEAST8		"hhu"		/* uint_least8_t */
+#define	SCNuLEAST16		"hu"		/* uint_least16_t */
+#define	SCNuLEAST32		"u"		/* uint_least32_t */
+#define	SCNuLEAST64		"llu"		/* uint_least64_t */
+
+#define	SCNuFAST8		"hhu"		/* uint_fast8_t */
+#define	SCNuFAST16		"hu"		/* uint_fast16_t */
+#define	SCNuFAST32		"u"		/* uint_fast32_t */
+#define	SCNuFAST64		"llu"		/* uint_fast64_t */
+
+#define	SCNuMAX			"ju"		/* uintmax_t */
+#define	SCNuPTR			"lu"		/* uintptr_t */
+
+#define	SCNx8			"hhx"		/* uint8_t */
+#define	SCNx16			"hx"		/* uint16_t */
+#define	SCNx32			"x"		/* uint32_t */
+#define	SCNx64			"llx"		/* uint64_t */
+
+#define	SCNxLEAST8		"hhx"		/* uint_least8_t */
+#define	SCNxLEAST16		"hx"		/* uint_least16_t */
+#define	SCNxLEAST32		"x"		/* uint_least32_t */
+#define	SCNxLEAST64		"llx"		/* uint_least64_t */
+
+#define	SCNxFAST8		"hhx"		/* uint_fast8_t */
+#define	SCNxFAST16		"hx"		/* uint_fast16_t */
+#define	SCNxFAST32		"x"		/* uint_fast32_t */
+#define	SCNxFAST64		"llx"		/* uint_fast64_t */
+
+#define	SCNxMAX			"jx"		/* uintmax_t */
+#define	SCNxPTR			"lx"		/* uintptr_t */
+
+#endif /* __cplusplus || __STDC_FORMAT_MACROS */
+
+typedef struct {
+	intmax_t quot;		/* quotient */
+	intmax_t rem;		/* remainder */
+} imaxdiv_t;
+
+//__BEGIN_DECLS
+intmax_t	imaxabs(intmax_t);
+imaxdiv_t	imaxdiv(intmax_t, intmax_t);
+intmax_t	strtoimax(const char *, char **, int);
+uintmax_t	strtoumax(const char *, char **, int);
+#if 0
+intmax_t	wcstoimax(const __wchar_t * __restrict,
+		    __wchar_t ** __restrict, int);
+uintmax_t	wcstoumax(const __wchar_t * __restrict,
+		    __wchar_t ** __restrict, int);
+#endif
+//__END_DECLS
+
+#endif /* _INTTYPES_H_ */
diff --git a/payloads/libpayload/include/pci/pci.h b/payloads/libpayload/include/pci/pci.h
index 53da0e1..565bdb5 100644
--- a/payloads/libpayload/include/pci/pci.h
+++ b/payloads/libpayload/include/pci/pci.h
@@ -65,6 +65,8 @@
 #define PCI_ROM_ADDRESS1	0x38 // on bridges
 #define PCI_ROM_ADDRESS_MASK	~0x7ff
 
+#define PCI_VENDOR_ID_INTEL 0x8086
+
 struct pci_dev {
 	u16 domain;
 	u8 bus, dev, func;
diff --git a/payloads/libpayload/include/stdlib.h b/payloads/libpayload/include/stdlib.h
index 47b666a..cf37c80 100644
--- a/payloads/libpayload/include/stdlib.h
+++ b/payloads/libpayload/include/stdlib.h
@@ -120,6 +120,7 @@ void *memalign(size_t align, size_t size);
  */
 long int strtol(const char *s, char **nptr, int base);
 unsigned long int strtoul(const char *s, char **nptr, int base);
+unsigned long long int strtoull(const char *s, char **nptr, int base);
 long atol(const char *nptr);
 
 /** @} */
diff --git a/payloads/libpayload/include/sys/stdint.h b/payloads/libpayload/include/sys/stdint.h
new file mode 100644
index 0000000..c1b1044
--- /dev/null
+++ b/payloads/libpayload/include/sys/stdint.h
@@ -0,0 +1,185 @@
+/*	$OpenBSD: stdint.h,v 1.4 2006/12/10 22:17:55 deraadt Exp $	*/
+
+/*
+ * Copyright (c) 1997, 2005 Todd C. Miller <Todd.Miller at courtesan.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, 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.
+ */
+
+#ifndef	_SYS_STDINT_H_
+#define _SYS_STDINT_H_
+
+#include <arch/types.h>
+//#include <sys/cdefs.h>
+//#include <machine/_types.h>
+
+#ifndef	__BIT_TYPES_DEFINED__
+#define	__BIT_TYPES_DEFINED__
+#endif
+
+/* 7.18.1.2 Minimum-width integer types */
+typedef	int8_t		int_least8_t;
+typedef	uint8_t		uint_least8_t;
+typedef	int16_t		int_least16_t;
+typedef	uint16_t	uint_least16_t;
+typedef	int32_t		int_least32_t;
+typedef	uint32_t	uint_least32_t;
+typedef	int64_t		int_least64_t;
+typedef	uint64_t	uint_least64_t;
+
+/* 7.18.1.3 Fastest minimum-width integer types */
+typedef	int8_t		int_fast8_t;
+typedef	uint8_t		uint_fast8_t;
+typedef	int16_t		int_fast16_t;
+typedef	uint16_t	uint_fast16_t;
+typedef	int32_t		int_fast32_t;
+typedef	uint32_t	uint_fast32_t;
+typedef	int64_t		int_fast64_t;
+typedef	uint64_t	uint_fast64_t;
+
+/* 7.18.1.5 Greatest-width integer types */
+typedef	int64_t		intmax_t;
+typedef	uint64_t	uintmax_t;
+
+#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS)
+/*
+ * 7.18.2 Limits of specified-width integer types.
+ *
+ * The following object-like macros specify the minimum and maximum limits
+ * of integer types corresponding to the typedef names defined above.
+ */
+
+/* 7.18.2.1 Limits of exact-width integer types */
+#define	INT8_MIN		(-0x7f - 1)
+#define	INT16_MIN		(-0x7fff - 1)
+#define	INT32_MIN		(-0x7fffffff - 1)
+#define	INT64_MIN		(-0x7fffffffffffffffLL - 1)
+
+#define	INT8_MAX		0x7f
+#define	INT16_MAX		0x7fff
+#define	INT32_MAX		0x7fffffff
+#define	INT64_MAX		0x7fffffffffffffffLL
+
+#define	UINT8_MAX		0xff
+#define	UINT16_MAX		0xffff
+#define	UINT32_MAX		0xffffffffU
+#define	UINT64_MAX		0xffffffffffffffffULL
+
+/* 7.18.2.2 Limits of minimum-width integer types */
+#define	INT_LEAST8_MIN		INT8_MIN
+#define	INT_LEAST16_MIN		INT16_MIN
+#define	INT_LEAST32_MIN		INT32_MIN
+#define	INT_LEAST64_MIN		INT64_MIN
+
+#define	INT_LEAST8_MAX		INT8_MAX
+#define	INT_LEAST16_MAX		INT16_MAX
+#define	INT_LEAST32_MAX		INT32_MAX
+#define	INT_LEAST64_MAX		INT64_MAX
+
+#define	UINT_LEAST8_MAX		UINT8_MAX
+#define	UINT_LEAST16_MAX	UINT16_MAX
+#define	UINT_LEAST32_MAX	UINT32_MAX
+#define	UINT_LEAST64_MAX	UINT64_MAX
+
+/* 7.18.2.3 Limits of fastest minimum-width integer types */
+#define	INT_FAST8_MIN		INT8_MIN
+#define	INT_FAST16_MIN		INT16_MIN
+#define	INT_FAST32_MIN		INT32_MIN
+#define	INT_FAST64_MIN		INT64_MIN
+
+#define	INT_FAST8_MAX		INT8_MAX
+#define	INT_FAST16_MAX		INT16_MAX
+#define	INT_FAST32_MAX		INT32_MAX
+#define	INT_FAST64_MAX		INT64_MAX
+
+#define	UINT_FAST8_MAX		UINT8_MAX
+#define	UINT_FAST16_MAX		UINT16_MAX
+#define	UINT_FAST32_MAX		UINT32_MAX
+#define	UINT_FAST64_MAX		UINT64_MAX
+
+/* 7.18.2.4 Limits of integer types capable of holding object pointers */
+#ifdef __LP64__
+#define	INTPTR_MIN		INT64_MIN
+#define	INTPTR_MAX		INT64_MAX
+#define	UINTPTR_MAX		UINT64_MAX
+#else
+#define	INTPTR_MIN		INT32_MIN
+#define	INTPTR_MAX		INT32_MAX
+#define	UINTPTR_MAX		UINT32_MAX
+#endif
+
+/* 7.18.2.5 Limits of greatest-width integer types */
+#define	INTMAX_MIN		INT64_MIN
+#define	INTMAX_MAX		INT64_MAX
+#define	UINTMAX_MAX		UINT64_MAX
+
+/*
+ * 7.18.3 Limits of other integer types.
+ *
+ * The following object-like macros specify the minimum and maximum limits
+ * of integer types corresponding to types specified in other standard
+ * header files.
+ */
+
+/* Limits of ptrdiff_t */
+#define	PTRDIFF_MIN		INTPTR_MIN
+#define	PTRDIFF_MAX		INTPTR_MAX
+
+/* Limits of sig_atomic_t */
+#define	SIG_ATOMIC_MIN		INT32_MIN
+#define	SIG_ATOMIC_MAX		INT32_MAX
+
+/* Limits of size_t (also in limits.h) */
+#ifndef	SIZE_MAX
+#define	SIZE_MAX		UINTPTR_MAX
+#endif
+
+/* Limits of wchar_t */
+#define	WCHAR_MIN		INT32_MIN
+#define	WCHAR_MAX		INT32_MAX
+
+/* Limits of wint_t */
+#define	WINT_MIN		INT32_MIN
+#define	WINT_MAX		INT32_MAX
+
+#endif /* __cplusplus || __STDC_LIMIT_MACROS */
+
+#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS)
+/*
+ * 7.18.4 Macros for integer constants.
+ *
+ * The following function-like macros expand to integer constants
+ * suitable for initializing objects that have integer types corresponding
+ * to types defined in <stdint.h>.  The argument in any instance of
+ * these macros shall be a decimal, octal, or hexadecimal constant with
+ * a value that does not exceed the limits for the corresponding type.
+ */
+
+/* 7.18.4.1 Macros for minimum-width integer constants. */
+#define	INT8_C(_c)		(_c)
+#define	INT16_C(_c)		(_c)
+#define	INT32_C(_c)		(_c)
+#define	INT64_C(_c)		__CONCAT(_c, LL)
+
+#define	UINT8_C(_c)		(_c)
+#define	UINT16_C(_c)		(_c)
+#define	UINT32_C(_c)		__CONCAT(_c, U)
+#define	UINT64_C(_c)		__CONCAT(_c, ULL)
+
+/* 7.18.4.2 Macros for greatest-width integer constants. */
+#define	INTMAX_C(_c)		__CONCAT(_c, LL)
+#define	UINTMAX_C(_c)		__CONCAT(_c, ULL)
+
+#endif /* __cplusplus || __STDC_CONSTANT_MACROS */
+
+#endif /* _SYS_STDINT_H_ */
diff --git a/payloads/libpayload/libc/string.c b/payloads/libpayload/libc/string.c
index 8c6ea99..cfa0b4a 100644
--- a/payloads/libpayload/libc/string.c
+++ b/payloads/libpayload/libc/string.c
@@ -32,6 +32,7 @@
 #include <libpayload.h>
 #include <string.h>
 #include <ctype.h>
+#include <inttypes.h>
 #include <errno.h>
 
 /**
@@ -486,9 +487,9 @@ long atol(const char *nptr)
  * @return An unsigned integer representation of the string
  */
 
-unsigned long int strtoul(const char *ptr, char **endptr, int base)
+unsigned long long int strtoull(const char *ptr, char **endptr, int base)
 {
-        int ret = 0;
+        unsigned long long int ret = 0;
 
 	if (endptr != NULL)
 		*endptr = (char *) ptr;
@@ -535,6 +536,14 @@ unsigned long int strtoul(const char *ptr, char **endptr, int base)
         return ret;
 }
 
+unsigned long int strtoul(const char *ptr, char **endptr, int base)
+{
+	unsigned long long val = strtoull(ptr, endptr, base);
+	if (val > UINT32_MAX) return UINT32_MAX;
+	return val;
+}
+
+
 /**
  * Determine the number of leading characters in s that match characters in a
  * @param s A pointer to the string to analyse




More information about the coreboot mailing list