Various cross-platform fixes

Improve compilation with libpayload (compiling flashrom.c and
linking is still broken):
 - disable Ponyprog (which enforced serial.c compilation)
 - make errno available where it is needed

Fix internal.c for non-x86 and enable cb parsing on ARM.

Fix mingw builds by using its __USE_MINGW_ANSI_STDIO macro
and gnu_printf definition for printf format style checking.
See http://sourceforge.net/apps/trac/mingw-w64/wiki/gnu%20printf
This requires inclusion of stdio.h in flash.h.

Fix order of libraries in the Makefile:
FEATURE_LIBS needs to come *after* PCILIBS in case ZLIB is needed by it.

Corresponding to flashrom svn r1697.

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
Signed-off-by: Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at>
Acked-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
diff --git a/Makefile b/Makefile
index 805290c..0cd4e75 100644
--- a/Makefile
+++ b/Makefile
@@ -140,6 +140,9 @@
 EXEC_SUFFIX := .exe
 # MinGW doesn't have the ffs() function, but we can use gcc's __builtin_ffs().
 FLASHROM_CFLAGS += -Dffs=__builtin_ffs
+# Some functions provided by Microsoft do not work as described in C99 specifications. This macro fixes that
+# for MinGW. See http://sourceforge.net/apps/trac/mingw-w64/wiki/printf%20and%20scanf%20family */
+FLASHROM_CFLAGS += -D__USE_MINGW_ANSI_STDIO=1
 # libusb-win32/libftdi stuff is usually installed in /usr/local.
 CPPFLAGS += -I/usr/local/include
 LDFLAGS += -L/usr/local/lib
@@ -218,6 +221,7 @@
 else
 override CONFIG_DUMMY = no
 endif
+# Bus Pirate, Serprog and PonyProg are not supported with libpayload (missing serial support).
 ifeq ($(CONFIG_BUSPIRATE_SPI), yes)
 UNSUPPORTED_FEATURES += CONFIG_BUSPIRATE_SPI=yes
 else
@@ -228,6 +232,11 @@
 else
 override CONFIG_SERPROG = no
 endif
+ifeq ($(CONFIG_PONY_SPI), yes)
+UNSUPPORTED_FEATURES += CONFIG_PONY_SPI=yes
+else
+override CONFIG_PONY_SPI = no
+endif
 # Dediprog and FT2232 are not supported with libpayload (missing libusb support)
 ifeq ($(CONFIG_DEDIPROG), yes)
 UNSUPPORTED_FEATURES += CONFIG_DEDIPROG=yes
@@ -632,7 +641,7 @@
 endif
 
 $(PROGRAM)$(EXEC_SUFFIX): $(OBJS)
-	$(CC) $(LDFLAGS) -o $(PROGRAM)$(EXEC_SUFFIX) $(OBJS) $(FEATURE_LIBS) $(LIBS) $(PCILIBS) $(USBLIBS)
+	$(CC) $(LDFLAGS) -o $(PROGRAM)$(EXEC_SUFFIX) $(OBJS) $(LIBS) $(PCILIBS) $(FEATURE_LIBS) $(USBLIBS)
 
 libflashrom.a: $(LIBFLASHROM_OBJS)
 	$(AR) rcs $@ $^
diff --git a/flash.h b/flash.h
index 7e50ae5..ba93245 100644
--- a/flash.h
+++ b/flash.h
@@ -25,6 +25,7 @@
 #define __FLASH_H__ 1
 
 #include <inttypes.h>
+#include <stdio.h>
 #include <stdint.h>
 #include <stddef.h>
 #include <stdbool.h>
@@ -286,7 +287,12 @@
 	MSG_SPEW	= 5,
 };
 /* Let gcc and clang check for correct printf-style format strings. */
-int print(enum msglevel level, const char *fmt, ...) __attribute__((format(printf, 2, 3)));
+int print(enum msglevel level, const char *fmt, ...)
+#ifdef __MINGW32__
+__attribute__((format(gnu_printf, 2, 3)));
+#else
+__attribute__((format(printf, 2, 3)));
+#endif
 #define msg_gerr(...)	print(MSG_ERROR, __VA_ARGS__)	/* general errors */
 #define msg_perr(...)	print(MSG_ERROR, __VA_ARGS__)	/* programmer errors */
 #define msg_cerr(...)	print(MSG_ERROR, __VA_ARGS__)	/* chip errors */
diff --git a/flashrom.c b/flashrom.c
index 6ab72a0..c298748 100644
--- a/flashrom.c
+++ b/flashrom.c
@@ -1168,7 +1168,7 @@
 		return 1;
 	}
 	if (image_stat.st_size != size) {
-		msg_gerr("Error: Image size (%jd B) doesn't match the flash chip's size (%ld B)!\n",
+		msg_gerr("Error: Image size (%jd B) doesn't match the flash chip's size (%lu B)!\n",
 			 (intmax_t)image_stat.st_size, size);
 		fclose(image);
 		return 1;
diff --git a/hwaccess.c b/hwaccess.c
index 8a4a50a..5b18c32 100644
--- a/hwaccess.c
+++ b/hwaccess.c
@@ -35,14 +35,13 @@
 #include <stdint.h>
 #include <string.h>
 #include <stdlib.h>
+#include <errno.h>
 #include <sys/types.h>
 #if !defined (__DJGPP__) && !defined(__LIBPAYLOAD__)
+/* No file access needed/possible to get hardware access permissions. */
 #include <unistd.h>
 #include <fcntl.h>
 #endif
-#if !defined (__DJGPP__)
-#include <errno.h>
-#endif
 #include "flash.h"
 #include "hwaccess.h"
 
diff --git a/internal.c b/internal.c
index 5af74cd..ab3c81f 100644
--- a/internal.c
+++ b/internal.c
@@ -172,8 +172,10 @@
 	int not_a_laptop = 0;
 	const char *board_vendor = NULL;
 	const char *board_model = NULL;
+#if defined (__i386__) || defined (__x86_64__) || defined (__arm__)
 	const char *cb_vendor = NULL;
 	const char *cb_model = NULL;
+#endif
 	char *arg;
 
 	arg = extract_programmer_param("boardenable");
@@ -254,7 +256,7 @@
 		return 1;
 	}
 
-#if defined(__i386__) || defined(__x86_64__)
+#if defined(__i386__) || defined(__x86_64__) || defined (__arm__)
 	if ((cb_parse_table(&cb_vendor, &cb_model) == 0) && (board_vendor != NULL) && (board_model != NULL)) {
 		if (strcasecmp(board_vendor, cb_vendor) || strcasecmp(board_model, cb_model)) {
 			msg_pwarn("Warning: The mainboard IDs set by -p internal:mainboard (%s:%s) do not\n"
@@ -265,7 +267,9 @@
 			msg_pinfo("Continuing anyway.\n");
 		}
 	}
+#endif
 
+#if defined(__i386__) || defined(__x86_64__)
 	dmi_init();
 
 	/* In case Super I/O probing would cause pretty explosions. */
diff --git a/physmap.c b/physmap.c
index 3c3f27b..6e3d646 100644
--- a/physmap.c
+++ b/physmap.c
@@ -24,14 +24,14 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <errno.h>
 #include "flash.h"
 #include "hwaccess.h"
 
-/* Do we need any file access or ioctl for physmap or MSR? */
 #if !defined(__DJGPP__) && !defined(__LIBPAYLOAD__)
+/* No file access needed/possible to get mmap access permissions or access MSR. */
 #include <sys/stat.h>
 #include <fcntl.h>
-#include <errno.h>
 #endif
 
 #ifdef __DJGPP__
@@ -120,15 +120,6 @@
 void physunmap(void *virt_addr, size_t len)
 {
 }
-
-int setup_cpu_msr(int cpu)
-{
-	return 0;
-}
-
-void cleanup_cpu_msr(void)
-{
-}
 #elif defined(__MACH__) && defined(__APPLE__)
 
 #define MEM_DEV "DirectHW"
@@ -569,6 +560,15 @@
 	_wrmsr(addr, msr.lo | ((unsigned long long)msr.hi << 32));
 	return 0;
 }
+
+int setup_cpu_msr(int cpu)
+{
+	return 0;
+}
+
+void cleanup_cpu_msr(void)
+{
+}
 #else
 /* default MSR implementation */
 msr_t rdmsr(int addr)