1dd51a993419cb90cc954aa4d9ae53fb012991d21yshang/** @file
2dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  Architecture Independent Base Memory Library Implementation.
3dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
41fef058f4b8fefc455bb171e4908c3e835b1b492qhuang  The following BaseMemoryLib instances contain the same copy of this file:
51fef058f4b8fefc455bb171e4908c3e835b1b492qhuang    BaseMemoryLib
61fef058f4b8fefc455bb171e4908c3e835b1b492qhuang    PeiMemoryLib
71fef058f4b8fefc455bb171e4908c3e835b1b492qhuang    UefiMemoryLib
81fef058f4b8fefc455bb171e4908c3e835b1b492qhuang
958380e9c6174f23df78f777b4209c0fd75245cdamyronporter  Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
1019388d2960b2fe0347da23799e93ccc52f540214hhtian  This program and the accompanying materials
11dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  are licensed and made available under the terms and conditions of the BSD License
12dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  which accompanies this distribution.  The full text of the license may be found at
132fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  http://opensource.org/licenses/bsd-license.php.
14dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
15dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
16dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
18dd51a993419cb90cc954aa4d9ae53fb012991d21yshang**/
19dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
20dd51a993419cb90cc954aa4d9ae53fb012991d21yshang#include "MemLibInternals.h"
21dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
22dd51a993419cb90cc954aa4d9ae53fb012991d21yshang/**
23dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  Fills a target buffer with a 16-bit value, and returns the target buffer.
24dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
252fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @param  Buffer  The pointer to the target buffer to fill.
262fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @param  Length  The count of 16-bit value to fill.
272fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @param  Value   The value with which to fill Length bytes of Buffer.
28dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
29dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  @return Buffer
30dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
31dd51a993419cb90cc954aa4d9ae53fb012991d21yshang**/
32dd51a993419cb90cc954aa4d9ae53fb012991d21yshangVOID *
33dd51a993419cb90cc954aa4d9ae53fb012991d21yshangEFIAPI
34dd51a993419cb90cc954aa4d9ae53fb012991d21yshangInternalMemSetMem16 (
35dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  OUT     VOID                      *Buffer,
36dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  IN      UINTN                     Length,
37dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  IN      UINT16                    Value
38dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  )
39dd51a993419cb90cc954aa4d9ae53fb012991d21yshang{
40dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  do {
41dd51a993419cb90cc954aa4d9ae53fb012991d21yshang    ((UINT16*)Buffer)[--Length] = Value;
42dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  } while (Length != 0);
43dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  return Buffer;
44dd51a993419cb90cc954aa4d9ae53fb012991d21yshang}
45dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
46dd51a993419cb90cc954aa4d9ae53fb012991d21yshang/**
47dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  Fills a target buffer with a 32-bit value, and returns the target buffer.
48dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
492fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @param  Buffer  The pointer to the target buffer to fill.
502fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @param  Length  The count of 32-bit value to fill.
512fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @param  Value   The value with which to fill Length bytes of Buffer.
52dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
53dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  @return Buffer
54dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
55dd51a993419cb90cc954aa4d9ae53fb012991d21yshang**/
56dd51a993419cb90cc954aa4d9ae53fb012991d21yshangVOID *
57dd51a993419cb90cc954aa4d9ae53fb012991d21yshangEFIAPI
58dd51a993419cb90cc954aa4d9ae53fb012991d21yshangInternalMemSetMem32 (
59dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  OUT     VOID                      *Buffer,
60dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  IN      UINTN                     Length,
61dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  IN      UINT32                    Value
62dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  )
63dd51a993419cb90cc954aa4d9ae53fb012991d21yshang{
64dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  do {
65dd51a993419cb90cc954aa4d9ae53fb012991d21yshang    ((UINT32*)Buffer)[--Length] = Value;
66dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  } while (Length != 0);
67dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  return Buffer;
68dd51a993419cb90cc954aa4d9ae53fb012991d21yshang}
69dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
70dd51a993419cb90cc954aa4d9ae53fb012991d21yshang/**
71dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  Fills a target buffer with a 64-bit value, and returns the target buffer.
72dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
732fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @param  Buffer  The pointer to the target buffer to fill.
742fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @param  Length  The count of 64-bit value to fill.
752fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @param  Value   The value with which to fill Length bytes of Buffer.
76dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
77dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  @return Buffer
78dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
79dd51a993419cb90cc954aa4d9ae53fb012991d21yshang**/
80dd51a993419cb90cc954aa4d9ae53fb012991d21yshangVOID *
81dd51a993419cb90cc954aa4d9ae53fb012991d21yshangEFIAPI
82dd51a993419cb90cc954aa4d9ae53fb012991d21yshangInternalMemSetMem64 (
83dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  OUT     VOID                      *Buffer,
84dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  IN      UINTN                     Length,
85dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  IN      UINT64                    Value
86dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  )
87dd51a993419cb90cc954aa4d9ae53fb012991d21yshang{
88dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  do {
89dd51a993419cb90cc954aa4d9ae53fb012991d21yshang    ((UINT64*)Buffer)[--Length] = Value;
90dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  } while (Length != 0);
91dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  return Buffer;
92dd51a993419cb90cc954aa4d9ae53fb012991d21yshang}
93dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
94dd51a993419cb90cc954aa4d9ae53fb012991d21yshang/**
95dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  Set Buffer to 0 for Size bytes.
96dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
97dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  @param  Buffer Memory to set.
982fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @param  Length The number of bytes to set
99dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
100dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  @return Buffer
101dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
102dd51a993419cb90cc954aa4d9ae53fb012991d21yshang**/
103dd51a993419cb90cc954aa4d9ae53fb012991d21yshangVOID *
104dd51a993419cb90cc954aa4d9ae53fb012991d21yshangEFIAPI
105dd51a993419cb90cc954aa4d9ae53fb012991d21yshangInternalMemZeroMem (
106dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  OUT     VOID                      *Buffer,
107dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  IN      UINTN                     Length
108dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  )
109dd51a993419cb90cc954aa4d9ae53fb012991d21yshang{
110dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  return InternalMemSetMem (Buffer, Length, 0);
111dd51a993419cb90cc954aa4d9ae53fb012991d21yshang}
112dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
113dd51a993419cb90cc954aa4d9ae53fb012991d21yshang/**
114dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  Compares two memory buffers of a given length.
115dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
11658380e9c6174f23df78f777b4209c0fd75245cdamyronporter  @param  DestinationBuffer The first memory buffer
11758380e9c6174f23df78f777b4209c0fd75245cdamyronporter  @param  SourceBuffer      The second memory buffer
11858380e9c6174f23df78f777b4209c0fd75245cdamyronporter  @param  Length            The length of DestinationBuffer and SourceBuffer memory
119dd51a993419cb90cc954aa4d9ae53fb012991d21yshang                            regions to compare. Must be non-zero.
120dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
121d531bfee01a957038d7ac1a16748558a62165fb2eric_tian  @return 0                 All Length bytes of the two buffers are identical.
122d531bfee01a957038d7ac1a16748558a62165fb2eric_tian  @retval Non-zero          The first mismatched byte in SourceBuffer subtracted from the first
123d531bfee01a957038d7ac1a16748558a62165fb2eric_tian                            mismatched byte in DestinationBuffer.
124dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
125dd51a993419cb90cc954aa4d9ae53fb012991d21yshang**/
126dd51a993419cb90cc954aa4d9ae53fb012991d21yshangINTN
127dd51a993419cb90cc954aa4d9ae53fb012991d21yshangEFIAPI
128dd51a993419cb90cc954aa4d9ae53fb012991d21yshangInternalMemCompareMem (
129dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  IN      CONST VOID                *DestinationBuffer,
130dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  IN      CONST VOID                *SourceBuffer,
131dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  IN      UINTN                     Length
132dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  )
133dd51a993419cb90cc954aa4d9ae53fb012991d21yshang{
134dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  while ((--Length != 0) &&
135dd51a993419cb90cc954aa4d9ae53fb012991d21yshang         (*(INT8*)DestinationBuffer == *(INT8*)SourceBuffer)) {
136dd51a993419cb90cc954aa4d9ae53fb012991d21yshang    DestinationBuffer = (INT8*)DestinationBuffer + 1;
137dd51a993419cb90cc954aa4d9ae53fb012991d21yshang    SourceBuffer = (INT8*)SourceBuffer + 1;
138dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  }
139dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  return (INTN)*(UINT8*)DestinationBuffer - (INTN)*(UINT8*)SourceBuffer;
140dd51a993419cb90cc954aa4d9ae53fb012991d21yshang}
141dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
142dd51a993419cb90cc954aa4d9ae53fb012991d21yshang/**
143dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  Scans a target buffer for an 8-bit value, and returns a pointer to the
144dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  matching 8-bit value in the target buffer.
145dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
1462fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @param  Buffer  The pointer to the target buffer to scan.
1472fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @param  Length  The count of 8-bit value to scan. Must be non-zero.
1482fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @param  Value   The value to search for in the target buffer.
149dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
1502fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @return The pointer to the first occurrence or NULL if not found.
151dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
152dd51a993419cb90cc954aa4d9ae53fb012991d21yshang**/
153dd51a993419cb90cc954aa4d9ae53fb012991d21yshangCONST VOID *
154dd51a993419cb90cc954aa4d9ae53fb012991d21yshangEFIAPI
155dd51a993419cb90cc954aa4d9ae53fb012991d21yshangInternalMemScanMem8 (
156dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  IN      CONST VOID                *Buffer,
157dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  IN      UINTN                     Length,
158dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  IN      UINT8                     Value
159dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  )
160dd51a993419cb90cc954aa4d9ae53fb012991d21yshang{
161dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  CONST UINT8                       *Pointer;
162dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
163dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  Pointer = (CONST UINT8*)Buffer;
164dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  do {
165dd51a993419cb90cc954aa4d9ae53fb012991d21yshang    if (*(Pointer++) == Value) {
16600dbccf2d5121545a89d88b04b408ebbb75aad0fqhuang      return --Pointer;
167dd51a993419cb90cc954aa4d9ae53fb012991d21yshang    }
168dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  } while (--Length != 0);
169dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  return NULL;
170dd51a993419cb90cc954aa4d9ae53fb012991d21yshang}
171dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
172dd51a993419cb90cc954aa4d9ae53fb012991d21yshang/**
173dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  Scans a target buffer for a 16-bit value, and returns a pointer to the
174dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  matching 16-bit value in the target buffer.
175dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
1762fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @param  Buffer  The pointer to the target buffer to scan.
1772fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @param  Length  The count of 16-bit value to scan. Must be non-zero.
1782fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @param  Value   The value to search for in the target buffer.
179dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
1802fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @return The pointer to the first occurrence or NULL if not found.
181dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
182dd51a993419cb90cc954aa4d9ae53fb012991d21yshang**/
183dd51a993419cb90cc954aa4d9ae53fb012991d21yshangCONST VOID *
184dd51a993419cb90cc954aa4d9ae53fb012991d21yshangEFIAPI
185dd51a993419cb90cc954aa4d9ae53fb012991d21yshangInternalMemScanMem16 (
186dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  IN      CONST VOID                *Buffer,
187dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  IN      UINTN                     Length,
188dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  IN      UINT16                    Value
189dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  )
190dd51a993419cb90cc954aa4d9ae53fb012991d21yshang{
191dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  CONST UINT16                      *Pointer;
192dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
193dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  Pointer = (CONST UINT16*)Buffer;
194dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  do {
195dd51a993419cb90cc954aa4d9ae53fb012991d21yshang    if (*(Pointer++) == Value) {
19600dbccf2d5121545a89d88b04b408ebbb75aad0fqhuang      return --Pointer;
197dd51a993419cb90cc954aa4d9ae53fb012991d21yshang    }
198dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  } while (--Length != 0);
199dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  return NULL;
200dd51a993419cb90cc954aa4d9ae53fb012991d21yshang}
201dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
202dd51a993419cb90cc954aa4d9ae53fb012991d21yshang/**
203dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  Scans a target buffer for a 32-bit value, and returns a pointer to the
204dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  matching 32-bit value in the target buffer.
205dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
2062fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @param  Buffer  The pointer to the target buffer to scan.
2072fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @param  Length  The count of 32-bit value to scan. Must be non-zero.
2082fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @param  Value   The value to search for in the target buffer.
209dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
2102fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @return The pointer to the first occurrence or NULL if not found.
211dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
212dd51a993419cb90cc954aa4d9ae53fb012991d21yshang**/
213dd51a993419cb90cc954aa4d9ae53fb012991d21yshangCONST VOID *
214dd51a993419cb90cc954aa4d9ae53fb012991d21yshangEFIAPI
215dd51a993419cb90cc954aa4d9ae53fb012991d21yshangInternalMemScanMem32 (
216dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  IN      CONST VOID                *Buffer,
217dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  IN      UINTN                     Length,
218dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  IN      UINT32                    Value
219dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  )
220dd51a993419cb90cc954aa4d9ae53fb012991d21yshang{
221dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  CONST UINT32                      *Pointer;
222dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
223dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  Pointer = (CONST UINT32*)Buffer;
224dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  do {
225dd51a993419cb90cc954aa4d9ae53fb012991d21yshang    if (*(Pointer++) == Value) {
22600dbccf2d5121545a89d88b04b408ebbb75aad0fqhuang      return --Pointer;
227dd51a993419cb90cc954aa4d9ae53fb012991d21yshang    }
228dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  } while (--Length != 0);
229dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  return NULL;
230dd51a993419cb90cc954aa4d9ae53fb012991d21yshang}
231dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
232dd51a993419cb90cc954aa4d9ae53fb012991d21yshang/**
233dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  Scans a target buffer for a 64-bit value, and returns a pointer to the
234dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  matching 64-bit value in the target buffer.
235dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
2362fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @param  Buffer  The pointer to the target buffer to scan.
2372fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @param  Length  The count of 64-bit value to scan. Must be non-zero.
2382fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @param  Value   The value to search for in the target buffer.
239dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
2402fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @return The pointer to the first occurrence or NULL if not found.
241dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
242dd51a993419cb90cc954aa4d9ae53fb012991d21yshang**/
243dd51a993419cb90cc954aa4d9ae53fb012991d21yshangCONST VOID *
244dd51a993419cb90cc954aa4d9ae53fb012991d21yshangEFIAPI
245dd51a993419cb90cc954aa4d9ae53fb012991d21yshangInternalMemScanMem64 (
246dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  IN      CONST VOID                *Buffer,
247dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  IN      UINTN                     Length,
248dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  IN      UINT64                    Value
249dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  )
250dd51a993419cb90cc954aa4d9ae53fb012991d21yshang{
251dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  CONST UINT64                      *Pointer;
252dd51a993419cb90cc954aa4d9ae53fb012991d21yshang
253dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  Pointer = (CONST UINT64*)Buffer;
254dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  do {
255dd51a993419cb90cc954aa4d9ae53fb012991d21yshang    if (*(Pointer++) == Value) {
25600dbccf2d5121545a89d88b04b408ebbb75aad0fqhuang      return --Pointer;
257dd51a993419cb90cc954aa4d9ae53fb012991d21yshang    }
258dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  } while (--Length != 0);
259dd51a993419cb90cc954aa4d9ae53fb012991d21yshang  return NULL;
260dd51a993419cb90cc954aa4d9ae53fb012991d21yshang}
261