//\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