X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=MdePkg%2FLibrary%2FBaseIoLibIntrinsic%2FIoLibMsc.c;h=d2bc5f527cf67084de7dd373107701dba3ca12d6;hb=38c8be123aced4cc8ad5c7e0da9121a181b94251;hp=1e903a7e254aa20aa53b95c04022b062a946ad8f;hpb=38bbd3d91c38481d18c1a7e2049473c951ee98ed;p=mirror_edk2.git diff --git a/MdePkg/Library/BaseIoLibIntrinsic/IoLibMsc.c b/MdePkg/Library/BaseIoLibIntrinsic/IoLibMsc.c index 1e903a7e25..d2bc5f527c 100644 --- a/MdePkg/Library/BaseIoLibIntrinsic/IoLibMsc.c +++ b/MdePkg/Library/BaseIoLibIntrinsic/IoLibMsc.c @@ -8,26 +8,19 @@ We don't advocate putting compiler specifics in libraries or drivers but there is no other way to make this work. - Copyright (c) 2006 - 2007, Intel Corporation
- All rights reserved. This program and the accompanying materials - are licensed and made available under the terms and conditions of the BSD License - which accompanies this distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent **/ -// -// Include common header file for this module. -// + #include "BaseIoLibIntrinsicInternal.h" // -// Microsoft Visual Studio 7.1 Function Prototypes for I/O Intrinsics +// Microsoft Visual Studio 7.1 Function Prototypes for I/O Intrinsics. // + int _inp (unsigned short port); unsigned short _inpw (unsigned short port); unsigned long _inpd (unsigned short port); @@ -63,7 +56,7 @@ void _ReadWriteBarrier (void); @param Port The I/O port to read. - @return The value read from Port. + @return The value read. **/ UINT8 @@ -73,10 +66,16 @@ IoRead8 ( ) { UINT8 Value; + BOOLEAN Flag; + + Flag = FilterBeforeIoRead (FilterWidth8, Port, &Value); + if (Flag) { + _ReadWriteBarrier (); + Value = (UINT8)_inp ((UINT16)Port); + _ReadWriteBarrier (); + } + FilterAfterIoRead (FilterWidth8, Port, &Value); - _ReadWriteBarrier (); - Value = (UINT8)_inp ((UINT16)Port); - _ReadWriteBarrier (); return Value; } @@ -92,7 +91,7 @@ IoRead8 ( @param Port The I/O port to write. @param Value The value to write to the I/O port. - @return The value written the I/O port. + @return The value written to the I/O port. **/ UINT8 @@ -102,9 +101,16 @@ IoWrite8 ( IN UINT8 Value ) { - _ReadWriteBarrier (); - (UINT8)_outp ((UINT16)Port, Value); - _ReadWriteBarrier (); + BOOLEAN Flag; + + Flag = FilterBeforeIoWrite(FilterWidth8, Port, &Value); + if (Flag) { + _ReadWriteBarrier (); + (UINT8)_outp ((UINT16)Port, Value); + _ReadWriteBarrier (); + } + FilterAfterIoWrite (FilterWidth8, Port, &Value); + return Value; } @@ -116,10 +122,11 @@ IoWrite8 ( serialized. If 16-bit I/O port operations are not supported, then ASSERT(). + If Port is not aligned on a 16-bit boundary, then ASSERT(). @param Port The I/O port to read. - @return The value read from Port. + @return The value read. **/ UINT16 @@ -129,11 +136,18 @@ IoRead16 ( ) { UINT16 Value; + BOOLEAN Flag; ASSERT ((Port & 1) == 0); - _ReadWriteBarrier (); - Value = _inpw ((UINT16)Port); - _ReadWriteBarrier (); + + Flag = FilterBeforeIoRead (FilterWidth16, Port, &Value); + if (Flag) { + _ReadWriteBarrier (); + Value = _inpw ((UINT16)Port); + _ReadWriteBarrier (); + } + FilterBeforeIoRead (FilterWidth16, Port, &Value); + return Value; } @@ -145,11 +159,12 @@ IoRead16 ( operations are serialized. If 16-bit I/O port operations are not supported, then ASSERT(). + If Port is not aligned on a 16-bit boundary, then ASSERT(). @param Port The I/O port to write. @param Value The value to write to the I/O port. - @return The value written the I/O port. + @return The value written to the I/O port. **/ UINT16 @@ -159,10 +174,18 @@ IoWrite16 ( IN UINT16 Value ) { + BOOLEAN Flag; + ASSERT ((Port & 1) == 0); - _ReadWriteBarrier (); - _outpw ((UINT16)Port, Value); - _ReadWriteBarrier (); + + Flag = FilterBeforeIoWrite(FilterWidth16, Port, &Value); + if (Flag) { + _ReadWriteBarrier (); + _outpw ((UINT16)Port, Value); + _ReadWriteBarrier (); + } + FilterAfterIoWrite (FilterWidth16, Port, &Value); + return Value; } @@ -174,10 +197,11 @@ IoWrite16 ( serialized. If 32-bit I/O port operations are not supported, then ASSERT(). + If Port is not aligned on a 32-bit boundary, then ASSERT(). @param Port The I/O port to read. - @return The value read from Port. + @return The value read. **/ UINT32 @@ -187,11 +211,18 @@ IoRead32 ( ) { UINT32 Value; + BOOLEAN Flag; ASSERT ((Port & 3) == 0); - _ReadWriteBarrier (); - Value = _inpd ((UINT16)Port); - _ReadWriteBarrier (); + + Flag = FilterBeforeIoRead(FilterWidth32, Port, &Value); + if (Flag) { + _ReadWriteBarrier (); + Value = _inpd ((UINT16)Port); + _ReadWriteBarrier (); + } + FilterAfterIoRead (FilterWidth32, Port, &Value); + return Value; } @@ -203,11 +234,12 @@ IoRead32 ( operations are serialized. If 32-bit I/O port operations are not supported, then ASSERT(). + If Port is not aligned on a 32-bit boundary, then ASSERT(). @param Port The I/O port to write. @param Value The value to write to the I/O port. - @return The value written the I/O port. + @return The value written to the I/O port. **/ UINT32 @@ -217,228 +249,17 @@ IoWrite32 ( IN UINT32 Value ) { - ASSERT ((Port & 3) == 0); - _ReadWriteBarrier (); - _outpd ((UINT16)Port, Value); - _ReadWriteBarrier (); - return Value; -} - - -/** - Reads an 8-bit MMIO register. - - Reads the 8-bit MMIO register specified by Address. The 8-bit read value is - returned. This function must guarantee that all MMIO read and write - operations are serialized. - - If 8-bit MMIO register operations are not supported, then ASSERT(). - - @param Address The MMIO register to read. - - @return The value read from Address. - -**/ -UINT8 -EFIAPI -MmioRead8 ( - IN UINTN Address - ) -{ - UINT8 Value; - - Value = *(volatile UINT8*)Address; - return Value; -} - -/** - Writes an 8-bit MMIO register. - - Writes the 8-bit MMIO register specified by Address with the value specified - by Value and returns Value. This function must guarantee that all MMIO read - and write operations are serialized. - - If 8-bit MMIO register operations are not supported, then ASSERT(). - - @param Address The MMIO register to write. - @param Value The value to write to the MMIO register. - - @return The value written to the Mmio. It equals to the input - Value instead of the actual value read back from the - Mmio. - -**/ -UINT8 -EFIAPI -MmioWrite8 ( - IN UINTN Address, - IN UINT8 Value - ) -{ - return *(volatile UINT8*)Address = Value; -} - -/** - Reads a 16-bit MMIO register. + BOOLEAN Flag; - Reads the 16-bit MMIO register specified by Address. The 16-bit read value is - returned. This function must guarantee that all MMIO read and write - operations are serialized. - - If 16-bit MMIO register operations are not supported, then ASSERT(). - - @param Address The MMIO register to read. - - @return The value read from Address. - -**/ -UINT16 -EFIAPI -MmioRead16 ( - IN UINTN Address - ) -{ - UINT16 Value; - - ASSERT ((Address & 1) == 0); - Value = *(volatile UINT16*)Address; - return Value; -} - -/** - Writes a 16-bit MMIO register. - - Writes the 16-bit MMIO register specified by Address with the value specified - by Value and returns Value. This function must guarantee that all MMIO read - and write operations are serialized. - - If 16-bit MMIO register operations are not supported, then ASSERT(). - - @param Address The MMIO register to write. - @param Value The value to write to the MMIO register. - - @return The value read from the Mmio after wrote specified - Value. - -**/ -UINT16 -EFIAPI -MmioWrite16 ( - IN UINTN Address, - IN UINT16 Value - ) -{ - ASSERT ((Address & 1) == 0); - return *(volatile UINT16*)Address = Value; -} - -/** - Reads a 32-bit MMIO register. - - Reads the 32-bit MMIO register specified by Address. The 32-bit read value is - returned. This function must guarantee that all MMIO read and write - operations are serialized. - - If 32-bit MMIO register operations are not supported, then ASSERT(). - - @param Address The MMIO register to read. - - @return The value read from Address. - -**/ -UINT32 -EFIAPI -MmioRead32 ( - IN UINTN Address - ) -{ - UINT32 Value; - - ASSERT ((Address & 3) == 0); - Value = *(volatile UINT32*)Address; - return Value; -} - -/** - Writes a 32-bit MMIO register. - - Writes the 32-bit MMIO register specified by Address with the value specified - by Value and returns Value. This function must guarantee that all MMIO read - and write operations are serialized. - - If 32-bit MMIO register operations are not supported, then ASSERT(). - - @param Address The MMIO register to write. - @param Value The value to write to the MMIO register. - - @return The value written to the Mmio. It equals to the input - Value instead of the actual value read back from the - Mmio. - -**/ -UINT32 -EFIAPI -MmioWrite32 ( - IN UINTN Address, - IN UINT32 Value - ) -{ - ASSERT ((Address & 3) == 0); - return *(volatile UINT32*)Address = Value; -} - -/** - Reads a 64-bit MMIO register. - - Reads the 64-bit MMIO register specified by Address. The 64-bit read value is - returned. This function must guarantee that all MMIO read and write - operations are serialized. - - If 64-bit MMIO register operations are not supported, then ASSERT(). - - @param Address The MMIO register to read. - - @return The value read from Address. + ASSERT ((Port & 3) == 0); -**/ -UINT64 -EFIAPI -MmioRead64 ( - IN UINTN Address - ) -{ - UINT64 Value; + Flag = FilterBeforeIoWrite(FilterWidth32, Port, &Value); + if (Flag) { + _ReadWriteBarrier (); + _outpd ((UINT16)Port, Value); + _ReadWriteBarrier (); + } + FilterAfterIoWrite (FilterWidth32, Port, &Value); - ASSERT ((Address & 7) == 0); - Value = *(volatile UINT64*)Address; return Value; } - -/** - Writes a 64-bit MMIO register. - - Writes the 64-bit MMIO register specified by Address with the value specified - by Value and returns Value. This function must guarantee that all MMIO read - and write operations are serialized. - - If 64-bit MMIO register operations are not supported, then ASSERT(). - - @param Address The MMIO register to write. - @param Value The value to write to the MMIO register. - - @return The value written to the Mmio. It equals to the input - Value instead of the actual value read back from the - Mmio. - -**/ -UINT64 -EFIAPI -MmioWrite64 ( - IN UINTN Address, - IN UINT64 Value - ) -{ - ASSERT ((Address & 7) == 0); - return *(volatile UINT64*)Address = Value; -} -