On Jun 23, 2014, at 11:25 AM, Sathya Prakash <sathya.prak...@avagotech.com>
wrote:
> Thanks Andrew, Does the basetools code needs similar change to return the
> destination buffer when length is 0?
I’m not sure? The BaseTools code is only used by the build system. It looks
like there is a copy of CopyMem() in the CommonLib, and there is also a
CommonLibBinderCopyMem() function? I’m not sure if CopyMem() should get
replaced with CommonLibBinderCopyMem()? We would need to get some feedback from
the maintainer.
Thanks,
Andrew Fish
> -Sathya
>
> PS: My E-mail ID changed from sathya.prak...@lsi.com to
> sathya.prak...@avagotech.com. Please update your address book.
>
> From: Andrew Fish [mailto:af...@apple.com]
> Sent: Monday, June 23, 2014 12:14 PM
> To: edk2-devel@lists.sourceforge.net
> Subject: Re: [edk2] Where can I find CopyMem implementation.
>
>
> On Jun 23, 2014, at 11:01 AM, Sathya Prakash <sathya.prak...@avagotech.com>
> wrote:
>
>
> I would like to see the CopyMem implementation. Which source file I should
> look for it. I see some implementation in commonlib.c in basetools but I
> assume it wont be taken from there and instead will be used from boot
> services table. So how can I know about the implementation. The reason I
> want to look into that is, in reallocatepool, there is a possibility that
> the CopyMem can be called with 0 length. If CopyMem implementation is
> similar to what is in commonlib.c (as mentioned below), the 0 will be
> decremented and due to the type of length (UINTN) there might be some memory
> corruption.
>
>
>
> There are multiple CopyMem() implementations, as there are multiple instances
> of the BaseMemoryLib. You will need to look in your DSC, or build log, to see
> which instance of the BaseMemoryLib you are using.
>
>
> Please correct if my understanding is wrong.
>
>
>
> https://svn.code.sf.net/p/edk2/code/trunk/edk2/MdePkg/Library/BaseMemoryLibOptDxe/CopyMemWrapper.c
> /**
> Copies a source buffer to a destination buffer, and returns the destination
> buffer.
>
> This function copies Length bytes from SourceBuffer to DestinationBuffer,
> and returns
> DestinationBuffer. The implementation must be reentrant, and it must
> handle the case
> where SourceBuffer overlaps DestinationBuffer.
>
> If Length is greater than (MAX_ADDRESS - DestinationBuffer + 1), then
> ASSERT().
> If Length is greater than (MAX_ADDRESS - SourceBuffer + 1), then ASSERT().
>
> @param DestinationBuffer The pointer to the destination buffer of the
> memory copy.
> @param SourceBuffer The pointer to the source buffer of the memory
> copy.
> @param Length The number of bytes to copy from SourceBuffer
> to DestinationBuffer.
>
> @return DestinationBuffer.
>
> **/
> VOID *
> EFIAPI
> CopyMem (
> OUT VOID *DestinationBuffer,
> IN CONST VOID *SourceBuffer,
> IN UINTN Length
> )
> {
> if (Length == 0) {
> return DestinationBuffer;
> }
> ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)DestinationBuffer));
> ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)SourceBuffer));
>
> if (DestinationBuffer == SourceBuffer) {
> return DestinationBuffer;
> }
> return InternalMemCopyMem (DestinationBuffer, SourceBuffer, Length);
> }
>
> There is a check for a length of zero, ASSERT() macros for pointer overflow
> checks, and and check to make sure the pointers are not the same. After that
> it calls the assembly language code.
>
> Thanks,
>
> Andrew Fish
>
>
>
> VOID
> PeiCopyMem (
> IN VOID *Destination,
> IN VOID *Source,
> IN UINTN Length
> )
> /*++
>
> Routine Description:
>
> Copy Length bytes from Source to Destination.
>
> Arguments:
>
> Destination - Target of copy
>
> Source - Place to copy from
>
> Length - Number of bytes to copy
>
> Returns:
>
> None
>
> --*/
> {
> CHAR8 *Destination8;
> CHAR8 *Source8;
>
> Destination8 = Destination;
> Source8 = Source;
> while (Length--) {
> *(Destination8++) = *(Source8++);
> }
> }
>
> Thanks
> Sathya
>
> PS: My E-mail ID changed from sathya.prak...@lsi.com to
> sathya.prak...@avagotech.com. Please update your address book.
>
> ------------------------------------------------------------------------------
> HPCC Systems Open Source Big Data Platform from LexisNexis Risk Solutions
> Find What Matters Most in Your Big Data with HPCC Systems
> Open Source. Fast. Scalable. Simple. Ideal for Dirty Data.
> Leverages Graph Analysis for Fast Processing & Easy Data Exploration
> http://p.sf.net/sfu/hpccsystems_______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>
> ------------------------------------------------------------------------------
> HPCC Systems Open Source Big Data Platform from LexisNexis Risk Solutions
> Find What Matters Most in Your Big Data with HPCC Systems
> Open Source. Fast. Scalable. Simple. Ideal for Dirty Data.
> Leverages Graph Analysis for Fast Processing & Easy Data Exploration
> http://p.sf.net/sfu/hpccsystems_______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/edk2-devel
------------------------------------------------------------------------------
HPCC Systems Open Source Big Data Platform from LexisNexis Risk Solutions
Find What Matters Most in Your Big Data with HPCC Systems
Open Source. Fast. Scalable. Simple. Ideal for Dirty Data.
Leverages Graph Analysis for Fast Processing & Easy Data Exploration
http://p.sf.net/sfu/hpccsystems
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel