]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Include/Library/PciSegmentLib.h
MdePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdePkg / Include / Library / PciSegmentLib.h
index 9eaab0c2e77ef45dfb7f9f4dc4210a92f15467a4..bd31f05a23fe2894918a494c4132c9b1260a0b0b 100644 (file)
@@ -1,11 +1,11 @@
 /** @file\r
   Provides services to access PCI Configuration Space on a platform with multiple PCI segments.\r
-  \r
+\r
   The PCI Segment Library function provide services to read, write, and modify the PCI configuration\r
-  registers on PCI root bridges on any supported PCI segment.  These library services take a single \r
-  address parameter that encodes the PCI Segment, PCI Bus, PCI Device, PCI Function, and PCI Register.  \r
+  registers on PCI root bridges on any supported PCI segment.  These library services take a single\r
+  address parameter that encodes the PCI Segment, PCI Bus, PCI Device, PCI Function, and PCI Register.\r
   The layout of this address parameter is as follows:\r
-  \r
+\r
             PCI Register: Bits 0..11\r
             PCI Function  Bits 12..14\r
             PCI Device  Bits 15..19\r
             Reserved  Bits 28..31.  Must be 0.\r
             PCI Segment Bits 32..47\r
             Reserved  Bits 48..63.  Must be 0.\r
-            \r
+\r
   | Reserved (MBZ) | Segment | Reserved (MBZ) |     Bus     | Device | Function | Register |\r
   63             48  47    32  31           28 27         20 19    15 14      12 11         0\r
 \r
-  These functions perform PCI configuration cycles using the default PCI configuration access \r
-  method.  This may use I/O ports 0xCF8 and 0xCFC to perform PCI configuration accesses, or it \r
-  may use MMIO registers relative to the PcdPciExpressBaseAddress, or it may use some alternate \r
-  access method.  Modules will typically use the PCI Segment Library for its PCI configuration \r
-  accesses when PCI Segments other than Segment #0 must be accessed.  \r
+  These functions perform PCI configuration cycles using the default PCI configuration access\r
+  method.  This may use I/O ports 0xCF8 and 0xCFC to perform PCI configuration accesses, or it\r
+  may use MMIO registers relative to the PcdPciExpressBaseAddress, or it may use some alternate\r
+  access method.  Modules will typically use the PCI Segment Library for its PCI configuration\r
+  accesses when PCI Segments other than Segment #0 must be accessed.\r
 \r
-Copyright (c) 2006 - 2008, Intel Corporation\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
-http://opensource.org/licenses/bsd-license.php\r
-\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
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -56,24 +50,31 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 **/\r
 #define PCI_SEGMENT_LIB_ADDRESS(Segment,Bus,Device,Function,Register) \\r
-  ( ((Register) & 0xfff)              | \\r
-    (((Function) & 0x07) << 12)       | \\r
-    (((Device) & 0x1f) << 15)         | \\r
-    (((Bus) & 0xff) << 20)            | \\r
-    (LShiftU64((Segment) & 0xffff, 32)) \\r
+  ((Segment != 0) ? \\r
+    ( ((Register) & 0xfff)                 | \\r
+      (((Function) & 0x07) << 12)          | \\r
+      (((Device) & 0x1f) << 15)            | \\r
+      (((Bus) & 0xff) << 20)               | \\r
+      (LShiftU64 ((Segment) & 0xffff, 32))   \\r
+    ) :                                      \\r
+    ( ((Register) & 0xfff)                 | \\r
+      (((Function) & 0x07) << 12)          | \\r
+      (((Device) & 0x1f) << 15)            | \\r
+      (((Bus) & 0xff) << 20)                 \\r
+    )                                        \\r
   )\r
 \r
 /**\r
-  Register a PCI device so PCI configuration registers may be accessed after \r
+  Register a PCI device so PCI configuration registers may be accessed after\r
   SetVirtualAddressMap().\r
-  \r
-  If Address > 0x0FFFFFFF, then ASSERT().\r
+\r
+  If any reserved bits in Address are set, then ASSERT().\r
 \r
   @param  Address Address that encodes the PCI Bus, Device, Function and\r
                   Register.\r
-  \r
+\r
   @retval RETURN_SUCCESS           The PCI device was registered for runtime access.\r
-  @retval RETURN_UNSUPPORTED       An attempt was made to call this function \r
+  @retval RETURN_UNSUPPORTED       An attempt was made to call this function\r
                                    after ExitBootServices().\r
   @retval RETURN_UNSUPPORTED       The resources required to access the PCI device\r
                                    at runtime could not be mapped.\r
@@ -92,9 +93,9 @@ PciSegmentRegisterForRuntimeAccess (
 \r
   Reads and returns the 8-bit PCI configuration register specified by Address.\r
   This function must guarantee that all PCI read and write operations are serialized.\r
-  \r
+\r
   If any reserved bits in Address are set, then ASSERT().\r
-  \r
+\r
   @param  Address   Address that encodes the PCI Segment, Bus, Device, Function, and Register.\r
 \r
   @return The 8-bit PCI configuration register specified by Address.\r
@@ -111,8 +112,8 @@ PciSegmentRead8 (
 \r
   Writes the 8-bit PCI configuration register specified by Address with the value specified by Value.\r
   Value is returned.  This function must guarantee that all PCI read and write operations are serialized.\r
-  \r
-  If Address > 0x0FFFFFFF, then ASSERT().\r
+\r
+  If any reserved bits in Address are set, then ASSERT().\r
 \r
   @param  Address     Address that encodes the PCI Segment, Bus, Device, Function, and Register.\r
   @param  Value       The value to write.\r
@@ -135,7 +136,7 @@ PciSegmentWrite8 (
   and writes the result to the 8-bit PCI configuration register specified by Address.\r
   The value written to the PCI configuration register is returned.\r
   This function must guarantee that all PCI read and write operations are serialized.\r
-  \r
+\r
   If any reserved bits in Address are set, then ASSERT().\r
 \r
   @param  Address   Address that encodes the PCI Segment, Bus, Device, Function, and Register.\r
@@ -177,18 +178,18 @@ PciSegmentAnd8 (
 /**\r
   Performs a bitwise AND of an 8-bit PCI configuration register with an 8-bit value,\r
   followed a  bitwise OR with another 8-bit value.\r
-  \r
+\r
   Reads the 8-bit PCI configuration register specified by Address,\r
   performs a bitwise AND between the read result and the value specified by AndData,\r
   performs a bitwise OR between the result of the AND operation and the value specified by OrData,\r
   and writes the result to the 8-bit PCI configuration register specified by Address.\r
   The value written to the PCI configuration register is returned.\r
   This function must guarantee that all PCI read and write operations are serialized.\r
-  \r
+\r
   If any reserved bits in Address are set, then ASSERT().\r
 \r
   @param  Address   Address that encodes the PCI Segment, Bus, Device, Function, and Register.\r
-  @param  AndData    The value to AND with the PCI configuration register.\r
+  @param  AndData   The value to AND with the PCI configuration register.\r
   @param  OrData    The value to OR with the PCI configuration register.\r
 \r
   @return The value written to the PCI configuration register.\r
@@ -243,6 +244,7 @@ PciSegmentBitFieldRead8 (
   If StartBit is greater than 7, then ASSERT().\r
   If EndBit is greater than 7, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
+  If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
 \r
   @param  Address   PCI configuration register to write.\r
   @param  StartBit  The ordinal of the least significant bit in the bit field.\r
@@ -278,6 +280,7 @@ PciSegmentBitFieldWrite8 (
   If StartBit is greater than 7, then ASSERT().\r
   If EndBit is greater than 7, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
+  If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
 \r
   @param  Address   PCI configuration register to write.\r
   @param  StartBit  The ordinal of the least significant bit in the bit field.\r
@@ -313,6 +316,7 @@ PciSegmentBitFieldOr8 (
   If StartBit is greater than 7, then ASSERT().\r
   If EndBit is greater than 7, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
+  If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
 \r
   @param  Address   PCI configuration register to write.\r
   @param  StartBit  The ordinal of the least significant bit in the bit field.\r
@@ -335,8 +339,7 @@ PciSegmentBitFieldAnd8 (
 \r
 /**\r
   Reads a bit field in an 8-bit port, performs a bitwise AND followed by a\r
-  bitwise OR, and writes the result back to the bit field in the\r
-  8-bit port.\r
+  bitwise OR, and writes the result back to the bit field in the 8-bit port.\r
 \r
   Reads the 8-bit PCI configuration register specified by Address, performs a\r
   bitwise AND followed by a bitwise OR between the read result and\r
@@ -350,6 +353,8 @@ PciSegmentBitFieldAnd8 (
   If StartBit is greater than 7, then ASSERT().\r
   If EndBit is greater than 7, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
+  If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+  If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
 \r
   @param  Address   PCI configuration register to write.\r
   @param  StartBit  The ordinal of the least significant bit in the bit field.\r
@@ -377,10 +382,10 @@ PciSegmentBitFieldAndThenOr8 (
 \r
   Reads and returns the 16-bit PCI configuration register specified by Address.\r
   This function must guarantee that all PCI read and write operations are serialized.\r
-  \r
+\r
   If any reserved bits in Address are set, then ASSERT().\r
   If Address is not aligned on a 16-bit boundary, then ASSERT().\r
-  \r
+\r
   @param  Address   Address that encodes the PCI Segment, Bus, Device, Function, and Register.\r
 \r
   @return The 16-bit PCI configuration register specified by Address.\r
@@ -397,7 +402,7 @@ PciSegmentRead16 (
 \r
   Writes the 16-bit PCI configuration register specified by Address with the value specified by Value.\r
   Value is returned.  This function must guarantee that all PCI read and write operations are serialized.\r
-  \r
+\r
   If any reserved bits in Address are set, then ASSERT().\r
   If Address is not aligned on a 16-bit boundary, then ASSERT().\r
 \r
@@ -419,11 +424,10 @@ PciSegmentWrite16 (
   a 16-bit value.\r
 \r
   Reads the 16-bit PCI configuration register specified by Address, performs a\r
-  bitwise OR between the read result and the value specified by\r
-  OrData, and writes the result to the 16-bit PCI configuration register\r
-  specified by Address. The value written to the PCI configuration register is\r
-  returned. This function must guarantee that all PCI read and write operations\r
-  are serialized.\r
+  bitwise OR between the read result and the value specified by OrData, and\r
+  writes the result to the 16-bit PCI configuration register specified by Address.\r
+  The value written to the PCI configuration register is returned. This function\r
+  must guarantee that all PCI read and write operations are serialized.\r
 \r
   If any reserved bits in Address are set, then ASSERT().\r
   If Address is not aligned on a 16-bit boundary, then ASSERT().\r
@@ -450,10 +454,10 @@ PciSegmentOr16 (
   and writes the result to the 16-bit PCI configuration register specified by Address.\r
   The value written to the PCI configuration register is returned.\r
   This function must guarantee that all PCI read and write operations are serialized.\r
-  \r
+\r
   If any reserved bits in Address are set, then ASSERT().\r
   If Address is not aligned on a 16-bit boundary, then ASSERT().\r
-  \r
+\r
   @param  Address   Address that encodes the PCI Segment, Bus, Device, Function, and Register.\r
   @param  AndData   The value to AND with the PCI configuration register.\r
 \r
@@ -470,19 +474,19 @@ PciSegmentAnd16 (
 /**\r
   Performs a bitwise AND of a 16-bit PCI configuration register with a 16-bit value,\r
   followed a  bitwise OR with another 16-bit value.\r
-  \r
+\r
   Reads the 16-bit PCI configuration register specified by Address,\r
   performs a bitwise AND between the read result and the value specified by AndData,\r
   performs a bitwise OR between the result of the AND operation and the value specified by OrData,\r
   and writes the result to the 16-bit PCI configuration register specified by Address.\r
   The value written to the PCI configuration register is returned.\r
   This function must guarantee that all PCI read and write operations are serialized.\r
-  \r
+\r
   If any reserved bits in Address are set, then ASSERT().\r
   If Address is not aligned on a 16-bit boundary, then ASSERT().\r
 \r
   @param  Address   Address that encodes the PCI Segment, Bus, Device, Function, and Register.\r
-  @param  AndData    The value to AND with the PCI configuration register.\r
+  @param  AndData   The value to AND with the PCI configuration register.\r
   @param  OrData    The value to OR with the PCI configuration register.\r
 \r
   @return The value written to the PCI configuration register.\r
@@ -539,6 +543,7 @@ PciSegmentBitFieldRead16 (
   If StartBit is greater than 15, then ASSERT().\r
   If EndBit is greater than 15, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
+  If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
 \r
   @param  Address   PCI configuration register to write.\r
   @param  StartBit  The ordinal of the least significant bit in the bit field.\r
@@ -560,15 +565,22 @@ PciSegmentBitFieldWrite16 (
   );\r
 \r
 /**\r
-  Reads the 16-bit PCI configuration register specified by Address,\r
-  performs a bitwise OR between the read result and the value specified by OrData,\r
-  and writes the result to the 16-bit PCI configuration register specified by Address. \r
+  Reads a bit field in a 16-bit PCI configuration, performs a bitwise OR, writes\r
+  the result back to the bit field in the 16-bit port.\r
+\r
+  Reads the 16-bit PCI configuration register specified by Address, performs a\r
+  bitwise OR between the read result and the value specified by\r
+  OrData, and writes the result to the 16-bit PCI configuration register\r
+  specified by Address. The value written to the PCI configuration register is\r
+  returned. This function must guarantee that all PCI read and write operations\r
+  are serialized. Extra left bits in OrData are stripped.\r
 \r
   If any reserved bits in Address are set, then ASSERT().\r
   If Address is not aligned on a 16-bit boundary, then ASSERT().\r
   If StartBit is greater than 15, then ASSERT().\r
   If EndBit is greater than 15, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
+  If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
 \r
   @param  Address   PCI configuration register to write.\r
   @param  StartBit  The ordinal of the least significant bit in the bit field.\r
@@ -590,30 +602,31 @@ PciSegmentBitFieldOr16 (
   );\r
 \r
 /**\r
-  Reads a bit field in a 16-bit PCI configuration, performs a bitwise OR,\r
-  and writes the result back to the bit field in the 16-bit port.\r
+  Reads a bit field in a 16-bit PCI configuration register, performs a bitwise\r
+  AND, writes the result back to the bit field in the 16-bit register.\r
+\r
+  Reads the 16-bit PCI configuration register specified by Address, performs a\r
+  bitwise AND between the read result and the value specified by AndData, and\r
+  writes the result to the 16-bit PCI configuration register specified by\r
+  Address. The value written to the PCI configuration register is returned.\r
+  This function must guarantee that all PCI read and write operations are\r
+  serialized. Extra left bits in AndData are stripped.\r
 \r
-  Reads the 16-bit PCI configuration register specified by Address,\r
-  performs a bitwise OR between the read result and the value specified by OrData,\r
-  and writes the result to the 16-bit PCI configuration register specified by Address.\r
-  The value written to the PCI configuration register is returned.\r
-  This function must guarantee that all PCI read and write operations are serialized.\r
-  Extra left bits in OrData are stripped.\r
-  \r
   If any reserved bits in Address are set, then ASSERT().\r
   If Address is not aligned on a 16-bit boundary, then ASSERT().\r
-  If StartBit is greater than 7, then ASSERT().\r
-  If EndBit is greater than 7, then ASSERT().\r
+  If StartBit is greater than 15, then ASSERT().\r
+  If EndBit is greater than 15, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
+  If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
 \r
   @param  Address   Address that encodes the PCI Segment, Bus, Device, Function, and Register.\r
   @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    The ordinal of the least significant bit in a byte is bit 0.\r
+                    Range 0..15.\r
   @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    The ordinal of the most significant bit in a byte is bit 7.\r
-  @param  AndData   The value to AND with the read value from the PCI configuration register.\r
+                    Range 0..15.\r
+  @param  AndData   The value to AND with the PCI configuration register.\r
 \r
-  @return The value written to the PCI configuration register.\r
+  @return The value written back to the PCI configuration register.\r
 \r
 **/\r
 UINT16\r
@@ -642,6 +655,8 @@ PciSegmentBitFieldAnd16 (
   If StartBit is greater than 15, then ASSERT().\r
   If EndBit is greater than 15, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
+  If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+  If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
 \r
   @param  Address   PCI configuration register to write.\r
   @param  StartBit  The ordinal of the least significant bit in the bit field.\r
@@ -669,7 +684,7 @@ PciSegmentBitFieldAndThenOr16 (
 \r
   Reads and returns the 32-bit PCI configuration register specified by Address.\r
   This function must guarantee that all PCI read and write operations are serialized.\r
-  \r
+\r
   If any reserved bits in Address are set, then ASSERT().\r
   If Address is not aligned on a 32-bit boundary, then ASSERT().\r
 \r
@@ -689,7 +704,7 @@ PciSegmentRead32 (
 \r
   Writes the 32-bit PCI configuration register specified by Address with the value specified by Value.\r
   Value is returned.  This function must guarantee that all PCI read and write operations are serialized.\r
-  \r
+\r
   If any reserved bits in Address are set, then ASSERT().\r
   If Address is not aligned on a 32-bit boundary, then ASSERT().\r
 \r
@@ -714,7 +729,7 @@ PciSegmentWrite32 (
   and writes the result to the 32-bit PCI configuration register specified by Address.\r
   The value written to the PCI configuration register is returned.\r
   This function must guarantee that all PCI read and write operations are serialized.\r
-  \r
+\r
   If any reserved bits in Address are set, then ASSERT().\r
   If Address is not aligned on a 32-bit boundary, then ASSERT().\r
 \r
@@ -739,7 +754,7 @@ PciSegmentOr32 (
   and writes the result to the 32-bit PCI configuration register specified by Address.\r
   The value written to the PCI configuration register is returned.\r
   This function must guarantee that all PCI read and write operations are serialized.\r
-  \r
+\r
   If any reserved bits in Address are set, then ASSERT().\r
   If Address is not aligned on a 32-bit boundary, then ASSERT().\r
 \r
@@ -759,14 +774,14 @@ PciSegmentAnd32 (
 /**\r
   Performs a bitwise AND of a 32-bit PCI configuration register with a 32-bit value,\r
   followed a  bitwise OR with another 32-bit value.\r
-  \r
+\r
   Reads the 32-bit PCI configuration register specified by Address,\r
   performs a bitwise AND between the read result and the value specified by AndData,\r
   performs a bitwise OR between the result of the AND operation and the value specified by OrData,\r
   and writes the result to the 32-bit PCI configuration register specified by Address.\r
   The value written to the PCI configuration register is returned.\r
   This function must guarantee that all PCI read and write operations are serialized.\r
-  \r
+\r
   If any reserved bits in Address are set, then ASSERT().\r
   If Address is not aligned on a 32-bit boundary, then ASSERT().\r
 \r
@@ -828,6 +843,7 @@ PciSegmentBitFieldRead32 (
   If StartBit is greater than 31, then ASSERT().\r
   If EndBit is greater than 31, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
+  If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
 \r
   @param  Address   PCI configuration register to write.\r
   @param  StartBit  The ordinal of the least significant bit in the bit field.\r
@@ -863,6 +879,7 @@ PciSegmentBitFieldWrite32 (
   If StartBit is greater than 31, then ASSERT().\r
   If EndBit is greater than 31, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
+  If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
 \r
   @param  Address   PCI configuration register to write.\r
   @param  StartBit  The ordinal of the least significant bit in the bit field.\r
@@ -887,7 +904,7 @@ PciSegmentBitFieldOr32 (
   Reads a bit field in a 32-bit PCI configuration register, performs a bitwise\r
   AND, and writes the result back to the bit field in the 32-bit register.\r
 \r
-  \r
+\r
   Reads the 32-bit PCI configuration register specified by Address, performs a bitwise\r
   AND between the read result and the value specified by AndData, and writes the result\r
   to the 32-bit PCI configuration register specified by Address. The value written to\r
@@ -898,9 +915,9 @@ PciSegmentBitFieldOr32 (
   If StartBit is greater than 31, then ASSERT().\r
   If EndBit is greater than 31, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
-  \r
+  If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
 \r
-  @param  Address   PCI configuration register to write.\r
+  @param  Address   Address that encodes the PCI Segment, Bus, Device, Function, and Register.\r
   @param  StartBit  The ordinal of the least significant bit in the bit field.\r
                     Range 0..31.\r
   @param  EndBit    The ordinal of the most significant bit in the bit field.\r
@@ -936,6 +953,8 @@ PciSegmentBitFieldAnd32 (
   If StartBit is greater than 31, then ASSERT().\r
   If EndBit is greater than 31, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
+  If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+  If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
 \r
   @param  Address   PCI configuration register to write.\r
   @param  StartBit  The ordinal of the least significant bit in the bit field.\r
@@ -969,7 +988,7 @@ PciSegmentBitFieldAndThenOr32 (
   and 16-bit PCI configuration read cycles may be used at the beginning and the\r
   end of the range.\r
 \r
-  If StartAddress > 0x0FFFFFFF, then ASSERT().\r
+  If any reserved bits in StartAddress are set, then ASSERT().\r
   If ((StartAddress & 0xFFF) + Size) > 0x1000, then ASSERT().\r
   If Size > 0 and Buffer is NULL, then ASSERT().\r
 \r
@@ -1001,7 +1020,7 @@ PciSegmentReadBuffer (
   8-bit and 16-bit PCI configuration write cycles may be used at the beginning\r
   and the end of the range.\r
 \r
-  If StartAddress > 0x0FFFFFFF, then ASSERT().\r
+  If any reserved bits in StartAddress are set, then ASSERT().\r
   If ((StartAddress & 0xFFF) + Size) > 0x1000, then ASSERT().\r
   If Size > 0 and Buffer is NULL, then ASSERT().\r
 \r