Index: BaseTools/Conf/tools_def.template
===================================================================
--- BaseTools/Conf/tools_def.template	(revision 16195)
+++ BaseTools/Conf/tools_def.template	(working copy)
@@ -4815,6 +4815,103 @@
 
 ####################################################################################
 #
+# Mingw GCC And Intel ACPI Compiler
+#
+####################################################################################
+#   MINGW        - MINGW GCC
+#   ASL           - Intel ACPI Source Language Compiler (iasl.exe)
+*_MINGW_*_*_FAMILY           = GCC
+
+DEFINE MINGW_BINIA32         = ENV(MINGW32)\bin\
+DEFINE MINGW_BINX64          = ENV(MINGW64)\bin\
+
+*_MINGW_*_MAKE_PATH          = ENV(MS_MISC_BIN)\nmake.exe
+*_MINGW_*_ASL_PATH           = DEF(DEFAULT_WIN_ASL_BIN)
+*_MINGW_IA32_DLINK_FLAGS     = DEF(GCC_IA32_X64_DLINK_COMMON) -m i386pe  --entry _$(IMAGE_ENTRY_POINT) --file-alignment 0x20 --section-alignment 0x20 -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map --image-base=0 --strip-all
+*_MINGW_X64_DLINK_FLAGS      = DEF(GCC_IA32_X64_DLINK_COMMON) -m i386pep --entry  $(IMAGE_ENTRY_POINT) --file-alignment 0x20 --section-alignment 0x20 -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map --image-base=0 --strip-all
+*_MINGW_IA32_ASLDLINK_FLAGS  = DEF(GCC_IA32_X64_DLINK_COMMON) -m i386pe  --entry _ReferenceAcpiTable -u $(IMAGE_ENTRY_POINT) --strip-all
+*_MINGW_X64_ASLDLINK_FLAGS   = DEF(GCC_IA32_X64_DLINK_COMMON) -m i386pep --entry  ReferenceAcpiTable -u $(IMAGE_ENTRY_POINT) --strip-all
+
+*_MINGW_*_MAKE_FLAGS         = /nologo
+*_MINGW_*_ASL_FLAGS          = DEF(DEFAULT_WIN_ASL_FLAGS)
+*_MINGW_*_ASL_OUTFLAGS       = DEF(DEFAULT_WIN_ASL_OUTFLAGS)
+
+##################
+# IA32 definitions
+##################
+*_MINGW_IA32_CC_PATH         = DEF(MINGW_BINIA32)gcc
+*_MINGW_IA32_SLINK_PATH      = DEF(MINGW_BINIA32)ar
+*_MINGW_IA32_DLINK_PATH      = DEF(MINGW_BINIA32)ld
+*_MINGW_IA32_ASM_PATH        = DEF(MINGW_BINIA32)gcc
+*_MINGW_IA32_PP_PATH         = DEF(MINGW_BINIA32)gcc
+*_MINGW_IA32_APP_PATH        = DEF(MINGW_BINIA32)gcc
+*_MINGW_IA32_VFRPP_PATH      = DEF(MINGW_BINIA32)gcc
+*_MINGW_IA32_ASLCC_PATH      = DEF(MINGW_BINIA32)gcc
+*_MINGW_IA32_ASLPP_PATH      = DEF(MINGW_BINIA32)gcc
+*_MINGW_IA32_ASLDLINK_PATH   = DEF(MINGW_BINIA32)ld
+*_MINGW_IA32_RC_PATH         = ENV(MS_MISC_BIN)\rc.exe
+*_MINGW_IA32_OBJCOPY_PATH    = DEF(MINGW_BINIA32)objcopy
+*_MINGW_IA32_SYMRENAME_PATH  = DEF(MINGW_BINIA32)objcopy
+
+*_MINGW_IA32_CC_FLAGS        = DEF(GCC_ALL_CC_FLAGS) -m32 -Os -malign-double -mno-stack-arg-probe -fomit-frame-pointer -Wno-error
+*_MINGW_IA32_PP_FLAGS        = DEF(GCC_PP_FLAGS) -m32
+*_MINGW_IA32_ASM_FLAGS       = DEF(GCC_ASM_FLAGS) -m32
+*_MINGW_IA32_ASLPP_FLAGS     = DEF(GCC_ASLPP_FLAGS) -m32
+*_MINGW_IA32_ASLCC_FLAGS     = DEF(GCC_ASLCC_FLAGS) -m32
+*_MINGW_IA32_VFRPP_FLAGS     = DEF(GCC_VFRPP_FLAGS) -m32
+*_MINGW_IA32_APP_FLAGS       = -m32
+*_MINGW_IA32_OBJCOPY_FLAGS   = --remove-section .idata --remove-section .edata
+*_MINGW_IA32_SYMRENAME_FLAGS = --remove-section .idata --remove-section .edata
+*_MINGW_IA32_RC_FLAGS        = DEF(GCC_IA32_RC_FLAGS)
+*_MINGW_IA32_NASM_FLAGS      = -f elf32
+
+##################
+# X64 definitions
+##################
+*_MINGW_X64_CC_PATH          = DEF(MINGW_BINX64)gcc
+*_MINGW_X64_SLINK_PATH       = DEF(MINGW_BINX64)ar
+*_MINGW_X64_DLINK_PATH       = DEF(MINGW_BINX64)ld
+*_MINGW_X64_ASM_PATH         = DEF(MINGW_BINX64)gcc
+*_MINGW_X64_PP_PATH          = DEF(MINGW_BINX64)gcc
+*_MINGW_X64_APP_PATH         = DEF(MINGW_BINX64)gcc
+*_MINGW_X64_VFRPP_PATH       = DEF(MINGW_BINX64)gcc
+*_MINGW_X64_ASLCC_PATH       = DEF(MINGW_BINX64)gcc
+*_MINGW_X64_ASLPP_PATH       = DEF(MINGW_BINX64)gcc
+*_MINGW_X64_ASLDLINK_PATH    = DEF(MINGW_BINX64)ld
+*_MINGW_IA32_RC_PATH         = ENV(MS_MISC_BIN)\rc.exe
+*_MINGW_X64_OBJCOPY_PATH     = DEF(MINGW_BINX64)objcopy
+*_MINGW_X64_SYMRENAME_PATH   = rem
+
+*_MINGW_X64_CC_FLAGS         = DEF(GCC_X64_CC_FLAGS) -m64 -Wno-error
+*_MINGW_X64_PP_FLAGS         = DEF(GCC_PP_FLAGS) -m64
+*_MINGW_X64_ASM_FLAGS        = DEF(GCC_ASM_FLAGS) -m64
+*_MINGW_X64_ASLPP_FLAGS      = DEF(GCC_ASLPP_FLAGS) -m64
+*_MINGW_X64_ASLCC_FLAGS      = DEF(GCC_ASLCC_FLAGS) -m64
+*_MINGW_X64_VFRPP_FLAGS      = DEF(GCC_VFRPP_FLAGS) -m64
+*_MINGW_X64_APP_FLAGS        = -m64
+*_MINGW_X64_OBJCOPY_FLAGS    = --remove-section .pdata --remove-section .xdata
+*_MINGW_X64_SYMRENAME_FLAGS  = Symbol renaming not needed for
+*_MINGW_X64_RC_FLAGS         = DEF(GCC_X64_RC_FLAGS)
+*_MINGW_X64_NASM_FLAGS       = -f elf64
+
+##################
+# EBC definitions
+##################
+*_MINGW_EBC_*_FAMILY      = INTEL
+
+*_MINGW_EBC_PP_PATH       = DEF(EBC_BIN)\iec.exe
+*_MINGW_EBC_CC_PATH       = DEF(EBC_BIN)\iec.exe
+*_MINGW_EBC_DLINK_PATH    = DEF(EBC_BIN)\link.exe
+*_MINGW_EBC_SLINK_PATH    = DEF(EBC_BIN)\link.exe
+*_MINGW_EBC_VFRPP_PATH    = DEF(EBC_BIN)\iec.exe
+*_MINGW_EBC_RC_PATH       = ENV(MS_MISC_BIN)\rc.exe
+
+*_MINGW_EBC_CC_FLAGS      = /nologo /c /WX /W3 /FIAutoGen.h /D$(MODULE_ENTRY_POINT)=$(ARCH_ENTRY_POINT)
+*_MINGW_EBC_SLINK_FLAGS   = /lib /NOLOGO /MACHINE:EBC
+*_MINGW_EBC_DLINK_FLAGS   = "C:\Program Files\Intel\EBC\Lib\EbcLib.lib" /NOLOGO /NODEFAULTLIB /MACHINE:EBC /OPT:REF /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /ALIGN:32 /DRIVER
+
+####################################################################################
+#
 # Elf GCC - This configuration is used to compile on Linux boxes to produce elf
 #           binaries.
 #
Index: BaseTools/Source/Python/AutoGen/GenMake.py
===================================================================
--- BaseTools/Source/Python/AutoGen/GenMake.py	(revision 16195)
+++ BaseTools/Source/Python/AutoGen/GenMake.py	(working copy)
@@ -679,7 +679,11 @@
                     NewFile = self.PlaceMacro(str(F), self.Macros)
                     # In order to use file list macro as dependency
                     if T.GenListFile:
-                        self.ListFileMacros[T.ListFileMacro].append(str(F))
+                        # gnu tools need forward slash path separater, even on Windows
+                        if self.PlatformInfo.ToolChainFamily in ('GCC'):
+                            self.ListFileMacros[T.ListFileMacro].append(str(F).replace ('\\', '/'))
+                        else:
+                            self.ListFileMacros[T.ListFileMacro].append(str(F))
                         self.FileListMacros[T.FileListMacro].append(NewFile)
                     elif T.GenFileListMacro:
                         self.FileListMacros[T.FileListMacro].append(NewFile)
Index: MdePkg/Library/BaseLib/BaseLib.inf
===================================================================
--- MdePkg/Library/BaseLib/BaseLib.inf	(revision 16195)
+++ MdePkg/Library/BaseLib/BaseLib.inf	(working copy)
@@ -252,7 +252,7 @@
   Ia32/DisableCache.asm | INTEL
 
   Ia32/GccInline.c | GCC
-  Ia32/Thunk16.nasm | GCC 
+  Ia32/Thunk16.S | GCC 
   Ia32/EnableDisableInterrupts.S | GCC 
   Ia32/EnablePaging64.S | GCC 
   Ia32/DisablePaging32.S | GCC 
@@ -405,7 +405,7 @@
   X86DisablePaging64.c
   X86DisablePaging32.c
   X64/GccInline.c | GCC
-  X64/Thunk16.nasm | GCC 
+  X64/Thunk16.S | GCC 
   X64/SwitchStack.S | GCC 
   X64/SetJump.S | GCC 
   X64/LongJump.S | GCC 
Index: StdLib/EfiSocketLib/EfiSocketLib.inf
===================================================================
--- StdLib/EfiSocketLib/EfiSocketLib.inf	(revision 16195)
+++ StdLib/EfiSocketLib/EfiSocketLib.inf	(working copy)
@@ -68,3 +68,6 @@
   gEfiUdp6ServiceBindingProtocolGuid
   gEfiSocketProtocolGuid
   gEfiSocketServiceBindingProtocolGuid
+
+[BuildOptions]
+  GCC:*_MINGW_*_CC_FLAGS = -D__attribute__(weak)=
Index: StdLib/Include/X64/machine/limits.h
===================================================================
--- StdLib/Include/X64/machine/limits.h	(revision 16195)
+++ StdLib/Include/X64/machine/limits.h	(working copy)
@@ -2,7 +2,7 @@
 
 #define __POINTER_BIT   64
 
-#if defined(__GNUC__)
+#if defined(__GNUC__) && !defined(_WIN32)
 #if __GNUC_PREREQ__(4,4)
   #define __LONG_BIT      64
 
