diff --git a/Source/Common/AssertTracer/AssertTracer.cpp b/Source/Common/AssertTracer/AssertTracer.cpp
index e9f33a4a..cfd95283 100644
--- a/Source/Common/AssertTracer/AssertTracer.cpp
+++ b/Source/Common/AssertTracer/AssertTracer.cpp
@@ -180,7 +180,7 @@ void __stdcall ReportAssertETW( const unsigned short     compId,
 #endif
 }
 
-#elif defined( __linux__ ) && defined( _RELEASE_INTERNAL ) && !defined( __ANDROID__ )
+#elif defined( _RELEASE_INTERNAL ) && !defined( _WIN32 ) && !defined( __ANDROID__ )
 #include <algorithm>
 #include <syslog.h>
 #include <execinfo.h>
diff --git a/Source/Common/AssertTracer/AssertTracer.h b/Source/Common/AssertTracer/AssertTracer.h
index 5b21afad..64727962 100644
--- a/Source/Common/AssertTracer/AssertTracer.h
+++ b/Source/Common/AssertTracer/AssertTracer.h
@@ -91,7 +91,7 @@ void __stdcall ReportAssertETW(const unsigned short compId,
     }
 #endif
 
-#elif defined( __linux__ ) && defined( _RELEASE_INTERNAL ) && !defined( __ANDROID__ )
+#elif defined( _RELEASE_INTERNAL ) && !defined( _WIN32 ) && !defined( __ANDROID__ )
 // do while() is missing ";" at the end and this is intentional
 // As invoking assert looks like this: assert(expr); So semicolon will
 // be stuck to do.. while() and that way sorting out possible
diff --git a/Source/GmmLib/CachePolicy/GmmGen8CachePolicy.h b/Source/GmmLib/CachePolicy/GmmGen8CachePolicy.h
index 112aacfe..24dbe57f 100755
--- a/Source/GmmLib/CachePolicy/GmmGen8CachePolicy.h
+++ b/Source/GmmLib/CachePolicy/GmmGen8CachePolicy.h
@@ -145,7 +145,7 @@ DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_REF_ENCODE
 DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_HME_DOWNSAMPLED_ENCODE                    , 1   , 1    , 1  , 0  , 1);
 DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_HME_DOWNSAMPLED_ENCODE_DST                , 1   , 1    , 0  , 0  , 1);
 DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_ME_DISTORTION_ENCODE                      , 1   , 1    , 1  , 0  , 1);
-#if defined(__linux__) && !defined(ANDROID)
+#if !defined(_WIN32) && !defined(ANDROID)
 DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_MV_DATA_ENCODE                            , 1   , 1    , 0  , 0  , 1);
 DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_SURFACE_BRC_ME_DISTORTION_ENCODE                  , 1   , 1    , 0  , 0  , 1);
 DEFINE_CACHE_ELEMENT(GMM_RESOURCE_USAGE_PAK_OBJECT_ENCODE                                 , 1   , 1    , 0  , 0  , 1);
diff --git a/Source/GmmLib/GlobalInfo/GmmInfo.cpp b/Source/GmmLib/GlobalInfo/GmmInfo.cpp
index 8876890d..cb7b9491 100644
--- a/Source/GmmLib/GlobalInfo/GmmInfo.cpp
+++ b/Source/GmmLib/GlobalInfo/GmmInfo.cpp
@@ -939,7 +939,7 @@ int32_t GmmLib::Context::IncrementRefCount()
 {
     int32_t *Ref = &RefCount;
 
-#if defined(__linux__)
+#if defined(__GNUC__)
     // returns 0 only when registering the first client
     return (__sync_fetch_and_add(Ref, 1));
 #endif
@@ -974,7 +974,7 @@ int32_t GmmLib::Context::DecrementRefCount()
         {
             break;
         }
-#if defined(__linux__)
+#if defined(__GNUC__)
     } while(!__sync_bool_compare_and_swap(Ref, CurrentValue, TargetValue));
 #endif
     return TargetValue;
diff --git a/Source/GmmLib/Resource/Linux/GmmResourceInfoLinCWrapper.cpp b/Source/GmmLib/Resource/Linux/GmmResourceInfoLinCWrapper.cpp
index 546815f8..ee41b174 100644
--- a/Source/GmmLib/Resource/Linux/GmmResourceInfoLinCWrapper.cpp
+++ b/Source/GmmLib/Resource/Linux/GmmResourceInfoLinCWrapper.cpp
@@ -22,7 +22,7 @@ OTHER DEALINGS IN THE SOFTWARE.
 
 #include "Internal/Common/GmmLibInc.h"
 
-#if defined(__linux__) && !LHDM
+#if !defined(_WIN32) && !LHDM
 #include "Internal/Linux/GmmResourceInfoLinInt.h"
 
 /////////////////////////////////////////////////////////////////////////////////////
@@ -176,4 +176,4 @@ GMM_TRANSLATIONTABLE_CALLBACKS DummyTTCB = {
 .pfWriteL3Adr             = DummyWriteL3Adr,
 };
 
-#endif /*__linux__*/
+#endif /*!_WIN32*/
diff --git a/Source/GmmLib/Texture/GmmTextureAlloc.cpp b/Source/GmmLib/Texture/GmmTextureAlloc.cpp
index b471cf81..aac150ce 100644
--- a/Source/GmmLib/Texture/GmmTextureAlloc.cpp
+++ b/Source/GmmLib/Texture/GmmTextureAlloc.cpp
@@ -826,7 +826,7 @@ GMM_STATUS GmmLib::GmmTextureCalc::FillTexPitchAndSize(GMM_TEXTURE_INFO * pTexIn
         }
         else
         {
-#if defined(__GMM_KMD__) || defined(__linux__)
+#if defined(__GMM_KMD__) || !defined(_WIN32)
             GMM_ASSERTDPF(0, "Surface too large!");
 #endif
             Status = GMM_ERROR;
diff --git a/Source/GmmLib/TranslationTable/GmmPageTableMgr.cpp b/Source/GmmLib/TranslationTable/GmmPageTableMgr.cpp
index 041b42ee..6f6129ed 100644
--- a/Source/GmmLib/TranslationTable/GmmPageTableMgr.cpp
+++ b/Source/GmmLib/TranslationTable/GmmPageTableMgr.cpp
@@ -28,7 +28,7 @@ Description: UMD-TT manager (manages both TR-TT and AUX-TT in user mode space)
 #include "../TranslationTable/GmmUmdTranslationTable.h"
 #include "External/Common/GmmClientContext.h"
 
-#if defined(__linux__)
+#if !defined(_WIN32)
 #include "Internal/Linux/GmmResourceInfoLinInt.h"
 #endif
 
@@ -44,7 +44,7 @@ Description: UMD-TT manager (manages both TR-TT and AUX-TT in user mode space)
         LeaveCriticalSection(&PoolLock); \
     }
 extern GMM_MA_LIB_CONTEXT *pGmmMALibContext;
-#if defined(__linux__)
+#if !defined(_WIN32)
 GMM_STATUS GmmLib::__GmmDeviceAlloc(GmmClientContext *        pClientContext,
                                     GMM_DEVICE_CALLBACKS_INT *pDeviceCbInt,
                                     GMM_DEVICE_ALLOC *        pAlloc)
@@ -608,7 +608,7 @@ GMM_STATUS GmmLib::GmmPageTableMgr::UpdateAuxTable(const GMM_DDI_UPDATEAUXTABLE
     return GMM_SUCCESS;
 }
 
-#if defined(__linux__) && !_WIN32
+#if !defined(_WIN32)
 /////////////////////////////////////////////////////////////////////////////////////
 /// Gets size of PageTable buffer object (BOs) list
 ///
diff --git a/Source/GmmLib/TranslationTable/GmmUmdTranslationTable.cpp b/Source/GmmLib/TranslationTable/GmmUmdTranslationTable.cpp
index 0de4dbdc..2117fbda 100644
--- a/Source/GmmLib/TranslationTable/GmmUmdTranslationTable.cpp
+++ b/Source/GmmLib/TranslationTable/GmmUmdTranslationTable.cpp
@@ -31,7 +31,7 @@ Description: Contains functions of internal classes
 
 #if !defined(__GMM_KMD)
 
-#if defined(__linux__)
+#if !defined(_WIN32)
 #include "Internal/Linux/GmmResourceInfoLinInt.h"
 
 #define _aligned_free(ptr) free(ptr)
diff --git a/Source/GmmLib/TranslationTable/GmmUmdTranslationTable.h b/Source/GmmLib/TranslationTable/GmmUmdTranslationTable.h
index 76ee4554..170ceeff 100644
--- a/Source/GmmLib/TranslationTable/GmmUmdTranslationTable.h
+++ b/Source/GmmLib/TranslationTable/GmmUmdTranslationTable.h
@@ -27,7 +27,7 @@ Description: This file contains the class definitions for GmmPageTablePool
 #pragma once
 #include "External/Common/GmmPageTableMgr.h"
 
-#ifdef __linux__
+#ifndef _WIN32
 #include <pthread.h>
 #include <string.h>
 
@@ -60,12 +60,7 @@ static inline int _BitScanForward(uint32_t *index, uint32_t mask)
 {
     int i;
 
-#ifdef __ANDROID__
-    i = ffs(mask);
-#else
-    i = ffsl(mask);
-#endif
-
+    i = __builtin_ffsl(mask);
     if(i > 0)
     {
         *index = (uint32_t)(i - 1);
@@ -448,7 +443,7 @@ namespace GmmLib
     public:
 #ifdef _WIN32
         CRITICAL_SECTION    TTLock;                  //synchronized access of PageTable obj
-#elif defined __linux__
+#else
         pthread_mutex_t TTLock;
 #endif
 
diff --git a/Source/GmmLib/ULT/CMakeLists.txt b/Source/GmmLib/ULT/CMakeLists.txt
index 6ddd802d..317d3f62 100644
--- a/Source/GmmLib/ULT/CMakeLists.txt
+++ b/Source/GmmLib/ULT/CMakeLists.txt
@@ -164,7 +164,7 @@ target_link_libraries(${EXE_NAME} igfx_gmmumd_dll)
 
 target_link_libraries(${EXE_NAME}
     pthread
-    dl
+    ${CMAKE_DL_LIBS}
 )
 
 add_custom_target(Run_ULT ALL DEPENDS GMMULT)
diff --git a/Source/GmmLib/ULT/GmmAuxTableULT.cpp b/Source/GmmLib/ULT/GmmAuxTableULT.cpp
index c6a9b537..567f1f35 100644
--- a/Source/GmmLib/ULT/GmmAuxTableULT.cpp
+++ b/Source/GmmLib/ULT/GmmAuxTableULT.cpp
@@ -20,7 +20,7 @@ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 OTHER DEALINGS IN THE SOFTWARE.
 ============================================================================*/
 
-#if defined (__linux__) && !defined(__i386__)
+#if !defined (_WIN32) && !defined(__i386__)
 
 #include "GmmAuxTableULT.h"
 
@@ -262,4 +262,4 @@ TEST_F(CTestAuxTable, TestAuxTableContent)
     pGmmULTClientContext->DestroyPageTblMgrObject(mgr);
 }
 
-#endif /* __linux__ */
+#endif /* !_WIN32 */
diff --git a/Source/GmmLib/ULT/GmmAuxTableULT.h b/Source/GmmLib/ULT/GmmAuxTableULT.h
index 3b8c1a18..ea6ca03e 100644
--- a/Source/GmmLib/ULT/GmmAuxTableULT.h
+++ b/Source/GmmLib/ULT/GmmAuxTableULT.h
@@ -22,7 +22,7 @@ OTHER DEALINGS IN THE SOFTWARE.
 
 #pragma once
 
-#if defined (__linux__) && !defined(__i386__)
+#if !defined (_WIN32) && !defined(__i386__)
 
 #ifndef _ISOC11_SOURCE
 #define _ISOC11_SOURCE 1
@@ -30,7 +30,6 @@ OTHER DEALINGS IN THE SOFTWARE.
 
 #include "GmmGen10ResourceULT.h"
 #include <stdlib.h>
-#include <malloc.h>
 
 #ifndef ALIGN
 #define ALIGN(v, a) (((v) + ((a)-1)) & ~((a)-1))
@@ -249,4 +248,4 @@ class CTestAuxTable : public CTestGen10Resource
     };
 };
 
-#endif /* __linux__ */
+#endif /* !_WIN32 */
diff --git a/Source/GmmLib/Utility/GmmLog/GmmLog.cpp b/Source/GmmLib/Utility/GmmLog/GmmLog.cpp
index 6628c9f1..45067438 100644
--- a/Source/GmmLib/Utility/GmmLog/GmmLog.cpp
+++ b/Source/GmmLib/Utility/GmmLog/GmmLog.cpp
@@ -34,7 +34,6 @@ OTHER DEALINGS IN THE SOFTWARE.
 #include <sys/stat.h>
 #include <unistd.h>
 #include <fstream>
-#include <linux/limits.h>
 #endif
 
 /// Logger instance shared by all of GmmLib within a process
@@ -197,12 +196,9 @@ bool GmmLib::Logger::GmmLogInit()
 #elif defined(__ANDROID__)
             // Log to logcat
             SpdLogger   = spdlog::android_logger(GMM_LOGGER_NAME, GMM_LOG_TAG);
-#elif defined(__linux__)
+#else
             // Log to syslog
             SpdLogger = spdlog::syslog_logger(GMM_LOGGER_NAME, GMM_LOG_TAG, 1 /*Log Pid*/);
-#else
-            __GMM_ASSERT(0);
-            return false;
 #endif
         }
     }
diff --git a/Source/GmmLib/Utility/GmmLog/spdlog/details/os.h b/Source/GmmLib/Utility/GmmLog/spdlog/details/os.h
index 3f9d3867..35223ff1 100644
--- a/Source/GmmLib/Utility/GmmLog/spdlog/details/os.h
+++ b/Source/GmmLib/Utility/GmmLog/spdlog/details/os.h
@@ -39,8 +39,20 @@
 #include <unistd.h>
 #include <chrono>
 
-#elif __FreeBSD__
-#include <sys/thr.h> //Use thr_self() syscall under FreeBSD to get thread id
+#elif defined(_AIX)
+#include <pthread.h>     // for pthread_getthreadid_np
+
+#elif defined(__DragonFly__) || defined(__FreeBSD__)
+#include <pthread_np.h>  // for pthread_getthreadid_np
+
+#elif defined(__NetBSD__)
+#include <lwp.h>         // for _lwp_self
+
+#elif defined(__OpenBSD__)
+#include <unistd.h>      // for getthrid
+
+#elif defined(__sun)
+#include <thread.h>      // for thr_self
 
 #else
 #include <thread>
@@ -213,7 +225,7 @@ inline size_t filesize(FILE *f)
 #else // unix
     int fd = fileno(f);
     //64 bits(but not in osx, where fstat64 is deprecated)
-#if !defined(__FreeBSD__) && !defined(__APPLE__) && (defined(__x86_64__) || defined(__ppc64__))
+#if (defined(__linux__) || defined(__sun) || defined(_AIX)) && (defined(__LP64__) || defined(_LP64))
     struct stat64 st;
     if (fstat64(fd, &st) == 0)
         return static_cast<size_t>(st.st_size);
@@ -302,10 +314,14 @@ inline size_t thread_id()
 #  define SYS_gettid __NR_gettid
 # endif
     return  static_cast<size_t>(syscall(SYS_gettid));
-#elif __FreeBSD__
-    long tid;
-    thr_self(&tid);
-    return static_cast<size_t>(tid);
+#elif defined(_AIX) || defined(__DragonFly__) || defined(__FreeBSD__)
+    return static_cast<size_t>(pthread_getthreadid_np());
+#elif defined(__NetBSD__)
+    return static_cast<size_t>(_lwp_self());
+#elif defined(__OpenBSD__)
+    return static_cast<size_t>(getthrid());
+#elif defined(__sun)
+    return static_cast<size_t>(thr_self());
 #else //Default to standard C++11 (OSX and other Unix)
     return static_cast<size_t>(std::hash<std::thread::id>()(std::this_thread::get_id()));
 #endif
diff --git a/Source/GmmLib/Utility/GmmLog/spdlog/tweakme.h b/Source/GmmLib/Utility/GmmLog/spdlog/tweakme.h
index 5518ce10..cafb7835 100644
--- a/Source/GmmLib/Utility/GmmLog/spdlog/tweakme.h
+++ b/Source/GmmLib/Utility/GmmLog/spdlog/tweakme.h
@@ -97,7 +97,7 @@
 ///////////////////////////////////////////////////////////////////////////////
 // Uncomment to enable syslog (disabled by default)
 //
-#if __linux__
+#ifndef _WIN32
 #define SPDLOG_ENABLE_SYSLOG
 #endif
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/Source/GmmLib/inc/External/Common/GmmCommonExt.h b/Source/GmmLib/inc/External/Common/GmmCommonExt.h
index a59a43cb..43385a1f 100644
--- a/Source/GmmLib/inc/External/Common/GmmCommonExt.h
+++ b/Source/GmmLib/inc/External/Common/GmmCommonExt.h
@@ -85,7 +85,7 @@ extern const SWIZZLE_DESCRIPTOR INTEL_64KB_UNDEFINED_64_128bpp;
 #define GMM_NO_FENCE_REG        0xDEADBEEF
 #define GMM_MAX_DISPLAYS        3
 
-#if defined __linux__
+#ifndef _WIN32
 typedef void* HANDLE;
 #endif
 
diff --git a/Source/GmmLib/inc/External/Common/GmmInfo.h b/Source/GmmLib/inc/External/Common/GmmInfo.h
index 55a26f8a..12a60a66 100644
--- a/Source/GmmLib/inc/External/Common/GmmInfo.h
+++ b/Source/GmmLib/inc/External/Common/GmmInfo.h
@@ -141,7 +141,7 @@ namespace GmmLib
         {
 #if defined(_WIN32)
             return(InterlockedIncrement((LONG *)&RefCount) - 1);  //InterLockedIncrement() returns incremented value
-#elif defined(__linux__)
+#elif defined(__GNUC__)
             return(__sync_fetch_and_add(&RefCount, 1));
 #endif
         }
@@ -163,7 +163,7 @@ namespace GmmLib
                 }
 #if defined(_WIN32)
             } while (!(InterlockedCompareExchange((LONG *)&RefCount, TargetValue, CurrentValue) == CurrentValue));
-#elif defined(__linux__)
+#elif defined(__GNUC__)
             } while (!__sync_bool_compare_and_swap(&RefCount, CurrentValue, TargetValue));
 #endif
 
diff --git a/Source/GmmLib/inc/External/Common/GmmPageTableMgr.h b/Source/GmmLib/inc/External/Common/GmmPageTableMgr.h
index 55008a07..ddcc420e 100644
--- a/Source/GmmLib/inc/External/Common/GmmPageTableMgr.h
+++ b/Source/GmmLib/inc/External/Common/GmmPageTableMgr.h
@@ -28,7 +28,7 @@ Description: This file contains the class definitions for GmmPageTableMgr
 #pragma once
 #include "GmmHw.h"
 
-#ifdef __linux__
+#ifndef _WIN32
 #include <pthread.h>
 #endif
 
@@ -108,7 +108,7 @@ namespace GmmLib
         GmmClientContext    *pClientContext;    ///< ClientContext of the client creating this Object
 
          //OS-specific defn
-#if defined  __linux__
+#ifndef _WIN32
 	pthread_mutex_t PoolLock;
 #endif
     public:
@@ -134,7 +134,7 @@ namespace GmmLib
         GMM_VIRTUAL GMM_PAGETABLEPool * __GetFreePoolNode(uint32_t * FreePoolNodeIdx, POOL_TYPE PoolType);
 
 
-#if defined __linux__
+#ifndef _WIN32
         //returns number of BOs for indicated TTs = NumNodePoolElements+1 BOs for root table and pools
         GMM_VIRTUAL int GetNumOfPageTableBOs(uint8_t TTFlags);
         //returns BO* list for indicated TT in client allocated memory
diff --git a/Source/GmmLib/inc/External/Common/GmmResourceInfoExt.h b/Source/GmmLib/inc/External/Common/GmmResourceInfoExt.h
index 5dd38ec5..add15bb8 100644
--- a/Source/GmmLib/inc/External/Common/GmmResourceInfoExt.h
+++ b/Source/GmmLib/inc/External/Common/GmmResourceInfoExt.h
@@ -189,7 +189,7 @@ typedef struct GmmLibContext GMM_LIB_CONTEXT;
 // Place holder for GMM_RESOURCE_FLAG definition.
 //---------------------------------------------------------------------------
 #include "GmmResourceFlags.h"
-#if defined __linux__
+#ifndef _WIN32
     #include "External/Linux/GmmResourceInfoLinExt.h"
 #endif
 
diff --git a/Source/GmmLib/inc/External/Linux/GmmResourceInfoLinExt.h b/Source/GmmLib/inc/External/Linux/GmmResourceInfoLinExt.h
index 20d3b95a..527e52bd 100644
--- a/Source/GmmLib/inc/External/Linux/GmmResourceInfoLinExt.h
+++ b/Source/GmmLib/inc/External/Linux/GmmResourceInfoLinExt.h
@@ -21,7 +21,7 @@ OTHER DEALINGS IN THE SOFTWARE.
 ============================================================================*/
 #pragma once
 
-#ifdef __linux__
+#ifndef _WIN32
 
 #ifdef __cplusplus
 extern "C" {
@@ -93,4 +93,4 @@ typedef struct GMM_UMD_SYNCCONTEXT_REC
 }
 #endif /*__cplusplus*/
 
-#endif /*__linux__*/
+#endif /*!_WIN32*/
diff --git a/Source/GmmLib/inc/Internal/Linux/GmmResourceInfoLinInt.h b/Source/GmmLib/inc/Internal/Linux/GmmResourceInfoLinInt.h
index 750d5375..0eedde35 100644
--- a/Source/GmmLib/inc/Internal/Linux/GmmResourceInfoLinInt.h
+++ b/Source/GmmLib/inc/Internal/Linux/GmmResourceInfoLinInt.h
@@ -22,7 +22,7 @@ OTHER DEALINGS IN THE SOFTWARE.
 
 #pragma once
 
-#if defined(__linux__) && !LHDM
+#if !defined(_WIN32) && !LHDM
 
 // GMM Lib Client Exports
 #include "External/Common/GmmCommonExt.h"
@@ -68,4 +68,4 @@ int GmmCheckForNullDevCbPfn(GMM_CLIENT ClientType, GMM_DEVICE_CALLBACKS_INT *pDe
 
 extern GMM_TRANSLATIONTABLE_CALLBACKS DummyTTCB;
 
-#endif /*__linux__*/
+#endif /*!_WIN32*/
diff --git a/Source/inc/portable_compiler.h b/Source/inc/portable_compiler.h
index db68312f..45c18a11 100644
--- a/Source/inc/portable_compiler.h
+++ b/Source/inc/portable_compiler.h
@@ -30,6 +30,9 @@ OTHER DEALINGS IN THE SOFTWARE.
     #endif
 
     #define __noop
+    #ifdef __fastcall
+        #undef __fastcall
+    #endif
     #define __fastcall
     #if defined __x86_64__
         #define __stdcall       // deprecated for x86-64
diff --git a/Source/util/gfxDebug.h b/Source/util/gfxDebug.h
index 69646f6b..773c3438 100644
--- a/Source/util/gfxDebug.h
+++ b/Source/util/gfxDebug.h
@@ -124,7 +124,7 @@ OTHER DEALINGS IN THE SOFTWARE.
 
 #else
 
-#ifndef __linux__
+#ifdef _WIN32
     #include "igdKrnlEtwMacros.h"
 #endif