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
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
#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
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
)\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
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
{\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
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
{\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
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
IN UINT8 Value\r
)\r
{\r
- _ReadWriteBarrier ();\r
- return *(volatile UINT8 *)Address = Value;\r
+ return *(volatile UINT8*)Address = Value;\r
}\r
\r
/**\r
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
)\r
{\r
ASSERT ((Address & 1) == 0);\r
- _ReadWriteBarrier ();\r
- return *(volatile UINT16 *)Address = Value;\r
+ return *(volatile UINT16*)Address = Value;\r
}\r
\r
/**\r
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
)\r
{\r
ASSERT ((Address & 3) == 0);\r
- _ReadWriteBarrier ();\r
- return *(volatile UINT32 *)Address = Value;\r
+ return *(volatile UINT32*)Address = Value;\r
}\r
\r
/**\r
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
)\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