]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/BaseIoLibIntrinsic/IoLibMsc.c
1) Add _MSC_VER judgment for usage of #pragma intrinsic
[mirror_edk2.git] / MdePkg / Library / BaseIoLibIntrinsic / IoLibMsc.c
index cfe5ddff4394b4a6305825f049b56bba0ae413d0..6f076f7578de96ca9cb8faf3b39524b52929796e 100644 (file)
@@ -8,7 +8,7 @@
   We don't advocate putting compiler specifics in libraries or drivers but there\r
   is no other way to make this work.\r
 \r
-  Copyright (c) 2006, Intel Corporation<BR>\r
+  Copyright (c) 2006 - 2007, Intel Corporation<BR>\r
   All rights reserved. This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 \r
-  Module Name:  IoLibMsc.c\r
-\r
 **/\r
 \r
 \r
-#if _MSC_EXTENSIONS\r
+//\r
+// Include common header file for this module.\r
+//\r
+#include "BaseIoLibIntrinsicInternal.h"\r
 \r
 //\r
 // Microsoft Visual Studio 7.1 Function Prototypes for I/O Intrinsics\r
@@ -35,6 +36,7 @@ unsigned short _outpw (unsigned short port, unsigned short dataword );
 unsigned long  _outpd (unsigned short port, unsigned long dataword );\r
 void          _ReadWriteBarrier (void);\r
 \r
+#ifdef _MSC_VER\r
 #pragma intrinsic(_inp)\r
 #pragma intrinsic(_inpw)\r
 #pragma intrinsic(_inpd)\r
@@ -42,12 +44,12 @@ void          _ReadWriteBarrier (void);
 #pragma intrinsic(_outpw)\r
 #pragma intrinsic(_outpd)\r
 #pragma intrinsic(_ReadWriteBarrier)\r
-\r
+#endif \r
 //\r
 // _ReadWriteBarrier() forces memory reads and writes to complete at the point\r
 // in the call. This is only a hint to the compiler and does emit code.\r
-// In past versions of the compiler, _ReadWriteBarrier was enforced only \r
-// locally and did not affect functions up the call tree. In Visual C++ \r
+// In past versions of the compiler, _ReadWriteBarrier was enforced only\r
+// locally and did not affect functions up the call tree. In Visual C++\r
 // 2005, _ReadWriteBarrier is enforced all the way up the call tree.\r
 //\r
 \r
@@ -71,8 +73,12 @@ IoRead8 (
   IN      UINTN                     Port\r
   )\r
 {\r
+  UINT8                             Value;\r
+\r
+  _ReadWriteBarrier ();\r
+  Value = (UINT8)_inp ((UINT16)Port);\r
   _ReadWriteBarrier ();\r
-  return (UINT8)_inp ((UINT16)Port);\r
+  return Value;\r
 }\r
 \r
 /**\r
@@ -98,7 +104,9 @@ IoWrite8 (
   )\r
 {\r
   _ReadWriteBarrier ();\r
-  return (UINT8)_outp ((UINT16)Port, Value);\r
+  (UINT8)_outp ((UINT16)Port, Value);\r
+  _ReadWriteBarrier ();\r
+  return Value;\r
 }\r
 \r
 /**\r
@@ -121,9 +129,13 @@ IoRead16 (
   IN      UINTN                     Port\r
   )\r
 {\r
+  UINT16                            Value;\r
+\r
   ASSERT ((Port & 1) == 0);\r
   _ReadWriteBarrier ();\r
-  return _inpw((UINT16)Port);\r
+  Value = _inpw ((UINT16)Port);\r
+  _ReadWriteBarrier ();\r
+  return Value;\r
 }\r
 \r
 /**\r
@@ -150,7 +162,9 @@ IoWrite16 (
 {\r
   ASSERT ((Port & 1) == 0);\r
   _ReadWriteBarrier ();\r
-  return _outpw ((UINT16)Port, Value);\r
+  _outpw ((UINT16)Port, Value);\r
+  _ReadWriteBarrier ();\r
+  return Value;\r
 }\r
 \r
 /**\r
@@ -173,9 +187,13 @@ IoRead32 (
   IN      UINTN                     Port\r
   )\r
 {\r
+  UINT32                            Value;\r
+\r
   ASSERT ((Port & 3) == 0);\r
   _ReadWriteBarrier ();\r
-  return _inpd((UINT16)Port);\r
+  Value = _inpd ((UINT16)Port);\r
+  _ReadWriteBarrier ();\r
+  return Value;\r
 }\r
 \r
 /**\r
@@ -202,7 +220,9 @@ IoWrite32 (
 {\r
   ASSERT ((Port & 3) == 0);\r
   _ReadWriteBarrier ();\r
-  return _outpd ((UINT16)Port, Value);\r
+  _outpd ((UINT16)Port, Value);\r
+  _ReadWriteBarrier ();\r
+  return Value;\r
 }\r
 \r
 \r
@@ -226,8 +246,10 @@ MmioRead8 (
   IN      UINTN                     Address\r
   )\r
 {\r
-  _ReadWriteBarrier ();\r
-  return *(volatile UINT8 *)Address;\r
+  UINT8                             Value;\r
+\r
+  Value = *(volatile UINT8*)Address;\r
+  return Value;\r
 }\r
 \r
 /**\r
@@ -250,8 +272,7 @@ MmioWrite8 (
   IN      UINT8                     Value\r
   )\r
 {\r
-  _ReadWriteBarrier ();\r
-  return *(volatile UINT8 *)Address = Value;\r
+  return *(volatile UINT8*)Address = Value;\r
 }\r
 \r
 /**\r
@@ -274,9 +295,11 @@ MmioRead16 (
   IN      UINTN                     Address\r
   )\r
 {\r
+  UINT16                            Value;\r
+\r
   ASSERT ((Address & 1) == 0);\r
-  _ReadWriteBarrier ();\r
-  return *(volatile UINT16 *)Address;\r
+  Value = *(volatile UINT16*)Address;\r
+  return Value;\r
 }\r
 \r
 /**\r
@@ -300,8 +323,7 @@ MmioWrite16 (
   )\r
 {\r
   ASSERT ((Address & 1) == 0);\r
-  _ReadWriteBarrier ();\r
-  return *(volatile UINT16 *)Address = Value;\r
+  return *(volatile UINT16*)Address = Value;\r
 }\r
 \r
 /**\r
@@ -324,9 +346,11 @@ MmioRead32 (
   IN      UINTN                     Address\r
   )\r
 {\r
+  UINT32                            Value;\r
+\r
   ASSERT ((Address & 3) == 0);\r
-  _ReadWriteBarrier ();\r
-  return *(volatile UINT32 *)Address;\r
+  Value = *(volatile UINT32*)Address;\r
+  return Value;\r
 }\r
 \r
 /**\r
@@ -350,8 +374,7 @@ MmioWrite32 (
   )\r
 {\r
   ASSERT ((Address & 3) == 0);\r
-  _ReadWriteBarrier ();\r
-  return *(volatile UINT32 *)Address = Value;\r
+  return *(volatile UINT32*)Address = Value;\r
 }\r
 \r
 /**\r
@@ -374,9 +397,11 @@ MmioRead64 (
   IN      UINTN                     Address\r
   )\r
 {\r
+  UINT64                            Value;\r
+\r
   ASSERT ((Address & 7) == 0);\r
-  _ReadWriteBarrier ();\r
-  return *(volatile UINT64 *)Address;\r
+  Value = *(volatile UINT64*)Address;\r
+  return Value;\r
 }\r
 \r
 /**\r
@@ -400,8 +425,6 @@ MmioWrite64 (
   )\r
 {\r
   ASSERT ((Address & 7) == 0);\r
-  _ReadWriteBarrier ();\r
-  return *(volatile UINT64 *)Address = Value;\r
+  return *(volatile UINT64*)Address = Value;\r
 }\r
 \r
-#endif\r