REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the DynamicTablesPkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>
		
			
				
	
	
		
			682 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			682 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   AML Stream.
 | |
| 
 | |
|   Copyright (c) 2019 - 2020, Arm Limited. All rights reserved.<BR>
 | |
| 
 | |
|   SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| **/
 | |
| 
 | |
| #include <Stream/AmlStream.h>
 | |
| 
 | |
| /** Initialize a stream.
 | |
| 
 | |
|   @param  [in, out] Stream          Pointer to the stream to initialize.
 | |
|   @param  [in]      Buffer          Buffer to initialize Stream with.
 | |
|                                     Point to the beginning of the Buffer.
 | |
|   @param  [in]      MaxBufferSize   Maximum size of Buffer.
 | |
|   @param  [in]      Direction       Direction Stream is progressing
 | |
|                                     (forward, backward).
 | |
| 
 | |
|   @retval EFI_SUCCESS             The function completed successfully.
 | |
|   @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| AmlStreamInit (
 | |
|   IN  OUT AML_STREAM             *Stream,
 | |
|   IN      UINT8                  *Buffer,
 | |
|   IN      UINT32                 MaxBufferSize,
 | |
|   IN      EAML_STREAM_DIRECTION  Direction
 | |
|   )
 | |
| {
 | |
|   if ((Stream == NULL)                            ||
 | |
|       (Buffer == NULL)                            ||
 | |
|       (MaxBufferSize == 0)                        ||
 | |
|       ((Direction != EAmlStreamDirectionForward)  &&
 | |
|        (Direction != EAmlStreamDirectionBackward)))
 | |
|   {
 | |
|     ASSERT (0);
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   Stream->Buffer        = Buffer;
 | |
|   Stream->MaxBufferSize = MaxBufferSize;
 | |
|   Stream->Index         = 0;
 | |
|   Stream->Direction     = Direction;
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| /** Clone a stream.
 | |
| 
 | |
|   Cloning a stream means copying all the values of the input Stream
 | |
|   in the ClonedStream.
 | |
| 
 | |
|   @param  [in]  Stream          Pointer to the stream to clone.
 | |
|   @param  [out] ClonedStream    Pointer to the stream to initialize.
 | |
| 
 | |
|   @retval EFI_SUCCESS             The function completed successfully.
 | |
|   @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| AmlStreamClone (
 | |
|   IN  CONST AML_STREAM   *Stream,
 | |
|   OUT        AML_STREAM  *ClonedStream
 | |
|   )
 | |
| {
 | |
|   if (!IS_STREAM (Stream)   ||
 | |
|       (ClonedStream == NULL))
 | |
|   {
 | |
|     ASSERT (0);
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   ClonedStream->Buffer        = Stream->Buffer;
 | |
|   ClonedStream->MaxBufferSize = Stream->MaxBufferSize;
 | |
|   ClonedStream->Index         = Stream->Index;
 | |
|   ClonedStream->Direction     = Stream->Direction;
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| /** Initialize a sub-stream from a stream.
 | |
| 
 | |
|   A sub-stream is a stream initialized at the current position of the input
 | |
|   stream:
 | |
|     - the Buffer field points to the current position of the input stream;
 | |
|     - the Index field is set to 0;
 | |
|     - the MaxBufferSize field is set to the remaining size of the input stream;
 | |
|     - the direction is conserved;
 | |
| 
 | |
|   E.g.: For a forward stream:
 | |
|                    +----------------+----------------+
 | |
|                    |ABCD.........XYZ|   Free Space   |
 | |
|                    +----------------+----------------+
 | |
|                    ^                ^                ^
 | |
|   Stream:        Buffer          CurrPos         EndOfBuff
 | |
|   Sub-stream:                Buffer/CurrPos      EndOfBuff
 | |
| 
 | |
|   @param  [in]  Stream      Pointer to the stream from which a sub-stream is
 | |
|                             created.
 | |
|   @param  [out] SubStream   Pointer to the stream to initialize.
 | |
| 
 | |
|   @retval EFI_SUCCESS             The function completed successfully.
 | |
|   @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| AmlStreamInitSubStream (
 | |
|   IN  CONST AML_STREAM  *Stream,
 | |
|   OUT       AML_STREAM  *SubStream
 | |
|   )
 | |
| {
 | |
|   if (!IS_STREAM (Stream) ||
 | |
|       (SubStream == NULL))
 | |
|   {
 | |
|     ASSERT (0);
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   if (IS_STREAM_FORWARD (Stream)) {
 | |
|     SubStream->Buffer = AmlStreamGetCurrPos (Stream);
 | |
|   } else if (IS_STREAM_BACKWARD (Stream)) {
 | |
|     SubStream->Buffer = Stream->Buffer;
 | |
|   } else {
 | |
|     ASSERT (0);
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   SubStream->MaxBufferSize = AmlStreamGetFreeSpace (Stream);
 | |
|   SubStream->Index         = 0;
 | |
|   SubStream->Direction     = Stream->Direction;
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| /** Get the buffer of a stream.
 | |
| 
 | |
|   @param  [in]  Stream    Pointer to a stream.
 | |
| 
 | |
|   @return The stream's Buffer.
 | |
|           NULL otherwise.
 | |
| **/
 | |
| UINT8 *
 | |
| EFIAPI
 | |
| AmlStreamGetBuffer (
 | |
|   IN  CONST AML_STREAM  *Stream
 | |
|   )
 | |
| {
 | |
|   if (!IS_STREAM (Stream)) {
 | |
|     ASSERT (0);
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   return Stream->Buffer;
 | |
| }
 | |
| 
 | |
| /** Get the size of Stream's Buffer.
 | |
| 
 | |
|   @param  [in]  Stream    Pointer to a stream.
 | |
| 
 | |
|   @return The Size of Stream's Buffer.
 | |
|           Return 0 if Stream is invalid.
 | |
| **/
 | |
| UINT32
 | |
| EFIAPI
 | |
| AmlStreamGetMaxBufferSize (
 | |
|   IN  CONST AML_STREAM  *Stream
 | |
|   )
 | |
| {
 | |
|   if (!IS_STREAM (Stream)) {
 | |
|     ASSERT (0);
 | |
|     return 0;
 | |
|   }
 | |
| 
 | |
|   return Stream->MaxBufferSize;
 | |
| }
 | |
| 
 | |
| /** Reduce the maximal size of Stream's Buffer (MaxBufferSize field).
 | |
| 
 | |
|   @param  [in]  Stream    Pointer to a stream.
 | |
|   @param  [in]  Diff      Value to subtract to the Stream's MaxBufferSize.
 | |
|                           0 < x < MaxBufferSize - Index.
 | |
| 
 | |
|   @retval EFI_SUCCESS             The function completed successfully.
 | |
|   @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| AmlStreamReduceMaxBufferSize (
 | |
|   IN  AML_STREAM  *Stream,
 | |
|   IN  UINT32      Diff
 | |
|   )
 | |
| {
 | |
|   if (!IS_STREAM (Stream)       ||
 | |
|       (Diff == 0)               ||
 | |
|       ((Stream->MaxBufferSize - Diff) <= Stream->Index))
 | |
|   {
 | |
|     ASSERT (0);
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   Stream->MaxBufferSize -= Diff;
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| /** Get Stream's Index.
 | |
| 
 | |
|   Stream's Index is incremented when writing data, reading data,
 | |
|   or moving the position in the Stream.
 | |
|   It can be seen as an index:
 | |
|    - starting at the beginning of Stream's Buffer if the stream goes forward;
 | |
|    - starting at the end of Stream's Buffer if the stream goes backward.
 | |
| 
 | |
|   @param  [in]  Stream    Pointer to a stream.
 | |
| 
 | |
|   @return Stream's Index.
 | |
|           Return 0 if Stream is invalid.
 | |
| **/
 | |
| UINT32
 | |
| EFIAPI
 | |
| AmlStreamGetIndex (
 | |
|   IN  CONST AML_STREAM  *Stream
 | |
|   )
 | |
| {
 | |
|   if (!IS_STREAM (Stream)) {
 | |
|     ASSERT (0);
 | |
|     return 0;
 | |
|   }
 | |
| 
 | |
|   return Stream->Index;
 | |
| }
 | |
| 
 | |
| /** Get Stream's Direction.
 | |
| 
 | |
|   @param  [in]  Stream    Pointer to a stream.
 | |
| 
 | |
|   @return Stream's Direction.
 | |
|           Return EAmlStreamDirectionUnknown if Stream is invalid.
 | |
| **/
 | |
| EAML_STREAM_DIRECTION
 | |
| EFIAPI
 | |
| AmlStreamGetDirection (
 | |
|   IN  CONST AML_STREAM  *Stream
 | |
|   )
 | |
| {
 | |
|   if (!IS_STREAM (Stream)) {
 | |
|     ASSERT (0);
 | |
|     return EAmlStreamDirectionInvalid;
 | |
|   }
 | |
| 
 | |
|   return Stream->Direction;
 | |
| }
 | |
| 
 | |
| /** Return a pointer to the current position in the stream.
 | |
| 
 | |
|   @param  [in]  Stream    Pointer to a stream.
 | |
| 
 | |
|   @return The current position in the stream.
 | |
|           Return NULL if error.
 | |
| **/
 | |
| UINT8 *
 | |
| EFIAPI
 | |
| AmlStreamGetCurrPos (
 | |
|   IN  CONST AML_STREAM  *Stream
 | |
|   )
 | |
| {
 | |
|   if (!IS_STREAM (Stream)) {
 | |
|     ASSERT (0);
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   if (IS_STREAM_FORWARD (Stream)) {
 | |
|     return Stream->Buffer + Stream->Index;
 | |
|   } else if (IS_STREAM_BACKWARD (Stream)) {
 | |
|     return Stream->Buffer + (Stream->MaxBufferSize - 1) - Stream->Index;
 | |
|   } else {
 | |
|     ASSERT (0);
 | |
|     return NULL;
 | |
|   }
 | |
| }
 | |
| 
 | |
| /** Get the space available in the stream.
 | |
| 
 | |
|   @param  [in]  Stream    Pointer to a stream.
 | |
| 
 | |
|   @return Remaining space available in the stream.
 | |
|           Zero in case of error or if the stream is at its end.
 | |
| **/
 | |
| UINT32
 | |
| EFIAPI
 | |
| AmlStreamGetFreeSpace (
 | |
|   IN  CONST AML_STREAM  *Stream
 | |
|   )
 | |
| {
 | |
|   if (!IS_STREAM (Stream)) {
 | |
|     ASSERT (0);
 | |
|     return 0;
 | |
|   }
 | |
| 
 | |
|   if (Stream->Index > Stream->MaxBufferSize) {
 | |
|     ASSERT (0);
 | |
|     return 0;
 | |
|   }
 | |
| 
 | |
|   return Stream->MaxBufferSize - Stream->Index;
 | |
| }
 | |
| 
 | |
| /** Move Stream by Offset bytes.
 | |
| 
 | |
|   The stream current position is moved according to the stream direction
 | |
|   (forward, backward).
 | |
| 
 | |
|   @param  [in]  Stream  Pointer to a stream.
 | |
|                         The stream must not be at its end.
 | |
|   @param  [in]  Offset  Offset to move the stream of.
 | |
| 
 | |
|   @retval EFI_SUCCESS             The function completed successfully.
 | |
|   @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | |
|   @retval EFI_BUFFER_TOO_SMALL    No space left in the buffer.
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| AmlStreamProgress (
 | |
|   IN  AML_STREAM  *Stream,
 | |
|   IN  UINT32      Offset
 | |
|   )
 | |
| {
 | |
|   if (!IS_STREAM (Stream)         ||
 | |
|       IS_END_OF_STREAM (Stream)  ||
 | |
|       (Offset == 0))
 | |
|   {
 | |
|     ASSERT (0);
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   if (AmlStreamGetFreeSpace (Stream) < Offset) {
 | |
|     ASSERT (0);
 | |
|     return EFI_BUFFER_TOO_SMALL;
 | |
|   }
 | |
| 
 | |
|   Stream->Index += Offset;
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| /** Rewind Stream of Offset bytes.
 | |
| 
 | |
|   The stream current position is rewound according to the stream direction
 | |
|   (forward, backward). A stream going forward will be rewound backward.
 | |
| 
 | |
|   @param  [in]  Stream  Pointer to a stream.
 | |
|   @param  [in]  Offset  Offset to rewind the stream of.
 | |
| 
 | |
|   @retval EFI_SUCCESS             The function completed successfully.
 | |
|   @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | |
|   @retval EFI_BUFFER_TOO_SMALL    No space left in the buffer.
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| AmlStreamRewind (
 | |
|   IN  AML_STREAM  *Stream,
 | |
|   IN  UINT32      Offset
 | |
|   )
 | |
| {
 | |
|   if (!IS_STREAM (Stream) ||
 | |
|       (Offset == 0))
 | |
|   {
 | |
|     ASSERT (0);
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   if (AmlStreamGetIndex (Stream) < Offset) {
 | |
|     ASSERT (0);
 | |
|     return EFI_BUFFER_TOO_SMALL;
 | |
|   }
 | |
| 
 | |
|   Stream->Index -= Offset;
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| /** Reset the Stream (move the current position to the initial position).
 | |
| 
 | |
|   @param  [in]  Stream  Pointer to a stream.
 | |
| 
 | |
|   @retval EFI_SUCCESS             The function completed successfully.
 | |
|   @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| AmlStreamReset (
 | |
|   IN  AML_STREAM  *Stream
 | |
|   )
 | |
| {
 | |
|   if (!IS_STREAM (Stream)) {
 | |
|     ASSERT (0);
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   Stream->Index = 0;
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| /** Peek one byte at Stream's current position.
 | |
| 
 | |
|   Stream's position is not moved when peeking.
 | |
| 
 | |
|   @param  [in]  Stream    Pointer to a stream.
 | |
|                           The stream must not be at its end.
 | |
|   @param  [out] OutByte   Pointer holding the byte value of
 | |
|                           the stream current position.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The function completed successfully.
 | |
|   @retval EFI_INVALID_PARAMETER Invalid parameter.
 | |
|   @retval EFI_BUFFER_TOO_SMALL  No space left in the buffer.
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| AmlStreamPeekByte (
 | |
|   IN  AML_STREAM  *Stream,
 | |
|   OUT UINT8       *OutByte
 | |
|   )
 | |
| {
 | |
|   UINT8  *CurPos;
 | |
| 
 | |
|   if (!IS_STREAM (Stream)       ||
 | |
|       IS_END_OF_STREAM (Stream) ||
 | |
|       (OutByte == NULL))
 | |
|   {
 | |
|     ASSERT (0);
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   CurPos = AmlStreamGetCurrPos (Stream);
 | |
|   if (CurPos == NULL) {
 | |
|     ASSERT (0);
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   *OutByte = *CurPos;
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| /** Read one byte at Stream's current position.
 | |
| 
 | |
|   The stream current position is moved when reading.
 | |
| 
 | |
|   @param  [in]  Stream    Pointer to a stream.
 | |
|                           The stream must not be at its end.
 | |
|   @param  [out] OutByte   Pointer holding the byte value of
 | |
|                           the stream current position.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The function completed successfully.
 | |
|   @retval EFI_INVALID_PARAMETER Invalid parameter.
 | |
|   @retval EFI_BUFFER_TOO_SMALL  No space left in the buffer.
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| AmlStreamReadByte (
 | |
|   IN  AML_STREAM  *Stream,
 | |
|   OUT UINT8       *OutByte
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS  Status;
 | |
| 
 | |
|   if (!IS_STREAM (Stream)       ||
 | |
|       IS_END_OF_STREAM (Stream) ||
 | |
|       (OutByte == NULL))
 | |
|   {
 | |
|     ASSERT (0);
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   // Stream is checked in the function call.
 | |
|   Status = AmlStreamPeekByte (Stream, OutByte);
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     ASSERT (0);
 | |
|     return Status;
 | |
|   }
 | |
| 
 | |
|   Status = AmlStreamProgress (Stream, 1);
 | |
|   ASSERT_EFI_ERROR (Status);
 | |
|   return Status;
 | |
| }
 | |
| 
 | |
| /** Write Size bytes in the stream.
 | |
| 
 | |
|   If the stream goes backward (toward lower addresses), the bytes written
 | |
|   to the stream are not reverted.
 | |
|   In the example below, writing "Hello" to the stream will not revert
 | |
|   the string. The end of the stream buffer will contain "Hello world!".
 | |
|   Stream buffer:
 | |
|      +---------------+-----+-----+-----+-----+-----+-----+---- +------+
 | |
|      |         ..... | ' ' | 'w' | 'o' | 'r' | 'l' | 'd' | '!' | '\0' |
 | |
|      +---------------+-----+-----+-----+-----+-----+-----+---- +------+
 | |
|                         ^
 | |
|                  Current position.
 | |
| 
 | |
|   @param  [in]  Stream  Pointer to a stream.
 | |
|                         The stream must not be at its end.
 | |
|   @param  [in]  Buffer  Pointer to the data to write.
 | |
|   @param  [in]  Size    Number of bytes to write.
 | |
| 
 | |
|   @retval EFI_SUCCESS             The function completed successfully.
 | |
|   @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | |
|   @retval EFI_BUFFER_TOO_SMALL    No space left in the buffer.
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| AmlStreamWrite (
 | |
|   IN        AML_STREAM  *Stream,
 | |
|   IN  CONST UINT8       *Buffer,
 | |
|   IN        UINT32      Size
 | |
|   )
 | |
| {
 | |
|   UINT8  *CurrPos;
 | |
| 
 | |
|   if (!IS_STREAM (Stream)       ||
 | |
|       IS_END_OF_STREAM (Stream) ||
 | |
|       (Buffer == NULL)          ||
 | |
|       (Size == 0))
 | |
|   {
 | |
|     ASSERT (0);
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   if (AmlStreamGetFreeSpace (Stream) < Size) {
 | |
|     ASSERT (0);
 | |
|     return EFI_BUFFER_TOO_SMALL;
 | |
|   }
 | |
| 
 | |
|   CurrPos = AmlStreamGetCurrPos (Stream);
 | |
| 
 | |
|   // If the Stream goes backward, prepare some space to copy the data.
 | |
|   if (IS_STREAM_BACKWARD (Stream)) {
 | |
|     CurrPos -= Size;
 | |
|   }
 | |
| 
 | |
|   CopyMem (CurrPos, Buffer, Size);
 | |
|   Stream->Index += Size;
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| /** Compare Size bytes between Stream1 and Stream2 from their
 | |
|     respective current position.
 | |
| 
 | |
|   Stream1 and Stream2 must go in the same direction.
 | |
|   Stream1 and Stream2 are left unchanged.
 | |
| 
 | |
|   @param  [in]  Stream1   First stream to compare.
 | |
|                           The stream must not be at its end.
 | |
|   @param  [in]  Stream2   Second stream to compare.
 | |
|                           The stream must not be at its end.
 | |
|   @param  [in]  Size      Number of bytes to compare.
 | |
|                           Must be lower than the minimum remaining space of
 | |
|                           Stream1 and Stream2.
 | |
|                           Must be non-zero.
 | |
| 
 | |
|   @retval TRUE  If Stream1 and Stream2 have Size bytes equal,
 | |
|                 from their respective current position.
 | |
|                 The function completed successfully.
 | |
|   @retval FALSE Otherwise.
 | |
| **/
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| AmlStreamCmp (
 | |
|   IN  CONST AML_STREAM  *Stream1,
 | |
|   IN  CONST AML_STREAM  *Stream2,
 | |
|   IN        UINT32      Size
 | |
|   )
 | |
| {
 | |
|   UINT32  MinSize;
 | |
|   UINT8   *CurrPosStream1;
 | |
|   UINT8   *CurrPosStream2;
 | |
| 
 | |
|   if (!IS_STREAM (Stream1)                        ||
 | |
|       IS_END_OF_STREAM (Stream1)                  ||
 | |
|       !IS_STREAM (Stream2)                        ||
 | |
|       IS_END_OF_STREAM (Stream2)                  ||
 | |
|       (Stream1->Direction != Stream2->Direction)  ||
 | |
|       (Size == 0))
 | |
|   {
 | |
|     ASSERT (0);
 | |
|     return FALSE;
 | |
|   }
 | |
| 
 | |
|   // Check the Size is not longer than the remaining size of
 | |
|   // Stream1 and Stream2.
 | |
|   MinSize = MIN (
 | |
|               AmlStreamGetFreeSpace (Stream1),
 | |
|               AmlStreamGetFreeSpace (Stream2)
 | |
|               );
 | |
|   if (MinSize < Size) {
 | |
|     ASSERT (0);
 | |
|     return FALSE;
 | |
|   }
 | |
| 
 | |
|   CurrPosStream1 = AmlStreamGetCurrPos (Stream1);
 | |
|   if (CurrPosStream1 == NULL) {
 | |
|     ASSERT (0);
 | |
|     return FALSE;
 | |
|   }
 | |
| 
 | |
|   CurrPosStream2 = AmlStreamGetCurrPos (Stream2);
 | |
|   if (CurrPosStream2 == NULL) {
 | |
|     ASSERT (0);
 | |
|     return FALSE;
 | |
|   }
 | |
| 
 | |
|   if (Stream1->Direction == EAmlStreamDirectionForward) {
 | |
|     return (0 == CompareMem (CurrPosStream1, CurrPosStream2, MinSize));
 | |
|   }
 | |
| 
 | |
|   // The stream is already pointing on the last byte, thus the (-1).
 | |
|   //          +---------------------+
 | |
|   // BStream  | | | | | | | |M|E|T|0|
 | |
|   //          +---------------------+
 | |
|   //                               ^
 | |
|   //                             CurrPos
 | |
|   return (0 == CompareMem (
 | |
|                  CurrPosStream1 - (MinSize - 1),
 | |
|                  CurrPosStream2 - (MinSize - 1),
 | |
|                  MinSize
 | |
|                  ));
 | |
| }
 | |
| 
 | |
| /** Copy Size bytes of the stream's data to DstBuffer.
 | |
| 
 | |
|   For a backward stream, the bytes are copied starting from the
 | |
|   current stream position.
 | |
| 
 | |
|   @param  [out] DstBuffer         Destination Buffer to copy the data to.
 | |
|   @param  [in]  MaxDstBufferSize  Maximum size of DstBuffer.
 | |
|                                   Must be non-zero.
 | |
|   @param  [in]  Stream            Pointer to the stream to copy the data from.
 | |
|   @param  [in]  Size              Number of bytes to copy from the stream
 | |
|                                   buffer.
 | |
|                                   Must be lower than MaxDstBufferSize.
 | |
|                                   Must be lower than Stream's MaxBufferSize.
 | |
|                                   Return success if zero.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The function completed successfully.
 | |
|   @retval EFI_INVALID_PARAMETER Invalid parameter.
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| AmlStreamCpyS (
 | |
|   OUT CHAR8       *DstBuffer,
 | |
|   IN  UINT32      MaxDstBufferSize,
 | |
|   IN  AML_STREAM  *Stream,
 | |
|   IN  UINT32      Size
 | |
|   )
 | |
| {
 | |
|   CHAR8  *StreamBufferStart;
 | |
| 
 | |
|   // Stream is checked in the function call.
 | |
|   if ((DstBuffer == NULL)       ||
 | |
|       (MaxDstBufferSize == 0)   ||
 | |
|       (Size > MaxDstBufferSize) ||
 | |
|       (Size > AmlStreamGetMaxBufferSize (Stream)))
 | |
|   {
 | |
|     ASSERT (0);
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   if (Size == 0) {
 | |
|     return EFI_SUCCESS;
 | |
|   }
 | |
| 
 | |
|   // Find the address at which the data is starting.
 | |
|   StreamBufferStart = (CHAR8 *)(IS_STREAM_FORWARD (Stream) ?
 | |
|                                 Stream->Buffer :
 | |
|                                 AmlStreamGetCurrPos (Stream));
 | |
| 
 | |
|   CopyMem (DstBuffer, StreamBufferStart, Size);
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 |