Add BaseMemoryLib optimized for PEI

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4035 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
mdkinney 2007-10-06 23:23:13 +00:00
parent 18be21dc5e
commit 7b3b4b2992
48 changed files with 2982 additions and 0 deletions

View File

@ -0,0 +1,104 @@
#/** @file
# Component description file for RepStr Base Memory Library
#
# Base Memory Library that uses REP string instructions for
# high performance and small size. Optimized for use in PEI.
# Copyright (c) 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.
#
#
#**/
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = BaseMemoryLibOptPei
FILE_GUID = D6F43B1B-0F21-462b-B8B7-A033C3EB4261
MODULE_TYPE = BASE
VERSION_STRING = 1.0
LIBRARY_CLASS = BaseMemoryLib
EDK_RELEASE_VERSION = 0x00020000
EFI_SPECIFICATION_VERSION = 0x00020000
#
# VALID_ARCHITECTURES = IA32 X64
#
[Sources.common]
MemLibInternals.h
[Sources.Ia32]
Ia32/ScanMem64.S
Ia32/ScanMem32.S
Ia32/ScanMem16.S
Ia32/ScanMem8.S
Ia32/CompareMem.S
Ia32/ZeroMem.S
Ia32/SetMem64.S
Ia32/SetMem32.S
Ia32/SetMem16.S
Ia32/SetMem.S
Ia32/CopyMem.S
Ia32/ScanMem64.asm
Ia32/ScanMem32.asm
Ia32/ScanMem16.asm
Ia32/ScanMem8.asm
Ia32/CompareMem.asm
Ia32/ZeroMem.asm
Ia32/SetMem64.asm
Ia32/SetMem32.asm
Ia32/SetMem16.asm
Ia32/SetMem.asm
Ia32/CopyMem.asm
ScanMem64Wrapper.c
ScanMem32Wrapper.c
ScanMem16Wrapper.c
ScanMem8Wrapper.c
ZeroMemWrapper.c
CompareMemWrapper.c
SetMem64Wrapper.c
SetMem32Wrapper.c
SetMem16Wrapper.c
SetMemWrapper.c
CopyMemWrapper.c
MemLibGuid.c
[Sources.X64]
x64/ScanMem64.asm
x64/ScanMem32.asm
x64/ScanMem16.asm
x64/ScanMem8.asm
x64/CompareMem.asm
x64/ZeroMem.asm
x64/SetMem64.asm
x64/SetMem32.asm
x64/SetMem16.asm
x64/SetMem.asm
x64/CopyMem.asm
ScanMem64Wrapper.c
ScanMem32Wrapper.c
ScanMem16Wrapper.c
ScanMem8Wrapper.c
ZeroMemWrapper.c
CompareMemWrapper.c
SetMem64Wrapper.c
SetMem32Wrapper.c
SetMem16Wrapper.c
SetMemWrapper.c
CopyMemWrapper.c
MemLibGuid.c
[Packages]
MdePkg/MdePkg.dec
[LibraryClasses]
DebugLib
BaseLib

View File

@ -0,0 +1,103 @@
<?xml version="1.0" encoding="UTF-8"?>
<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<MsaHeader>
<ModuleName>BaseMemoryLibOptPei</ModuleName>
<ModuleType>BASE</ModuleType>
<GuidValue>D6F43B1B-0F21-462b-B8B7-A033C3EB4261</GuidValue>
<Version>1.0</Version>
<Abstract>Component description file for RepStr Base Memory Library</Abstract>
<Description>Base Memory Library that uses REP string instructions for
high performance and small size. Optimized for use in PEI.</Description>
<Copyright>Copyright (c) 2006, Intel Corporation</Copyright>
<License>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.</License>
<Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052</Specification>
</MsaHeader>
<ModuleDefinitions>
<SupportedArchitectures>IA32 X64</SupportedArchitectures>
<BinaryModule>false</BinaryModule>
<OutputFileBasename>BaseMemoryLibRepStr</OutputFileBasename>
</ModuleDefinitions>
<LibraryClassDefinitions>
<LibraryClass Usage="ALWAYS_PRODUCED">
<Keyword>BaseMemoryLib</Keyword>
</LibraryClass>
<LibraryClass Usage="ALWAYS_CONSUMED">
<Keyword>BaseLib</Keyword>
</LibraryClass>
<LibraryClass Usage="ALWAYS_CONSUMED">
<Keyword>DebugLib</Keyword>
</LibraryClass>
</LibraryClassDefinitions>
<SourceFiles>
<Filename>MemLibInternals.h</Filename>
<Filename SupArchList="IA32">MemLibGuid.c</Filename>
<Filename SupArchList="IA32">CopyMemWrapper.c</Filename>
<Filename SupArchList="IA32">SetMemWrapper.c</Filename>
<Filename SupArchList="IA32">SetMem16Wrapper.c</Filename>
<Filename SupArchList="IA32">SetMem32Wrapper.c</Filename>
<Filename SupArchList="IA32">SetMem64Wrapper.c</Filename>
<Filename SupArchList="IA32">CompareMemWrapper.c</Filename>
<Filename SupArchList="IA32">ZeroMemWrapper.c</Filename>
<Filename SupArchList="IA32">ScanMem8Wrapper.c</Filename>
<Filename SupArchList="IA32">ScanMem16Wrapper.c</Filename>
<Filename SupArchList="IA32">ScanMem32Wrapper.c</Filename>
<Filename SupArchList="IA32">ScanMem64Wrapper.c</Filename>
<Filename SupArchList="IA32">Ia32/CopyMem.asm</Filename>
<Filename SupArchList="IA32">Ia32/SetMem.asm</Filename>
<Filename SupArchList="IA32">Ia32/SetMem16.asm</Filename>
<Filename SupArchList="IA32">Ia32/SetMem32.asm</Filename>
<Filename SupArchList="IA32">Ia32/SetMem64.asm</Filename>
<Filename SupArchList="IA32">Ia32/ZeroMem.asm</Filename>
<Filename SupArchList="IA32">Ia32/CompareMem.asm</Filename>
<Filename SupArchList="IA32">Ia32/ScanMem8.asm</Filename>
<Filename SupArchList="IA32">Ia32/ScanMem16.asm</Filename>
<Filename SupArchList="IA32">Ia32/ScanMem32.asm</Filename>
<Filename SupArchList="IA32">Ia32/ScanMem64.asm</Filename>
<Filename SupArchList="IA32">Ia32/CopyMem.S</Filename>
<Filename SupArchList="IA32">Ia32/SetMem.S</Filename>
<Filename SupArchList="IA32">Ia32/SetMem16.S</Filename>
<Filename SupArchList="IA32">Ia32/SetMem32.S</Filename>
<Filename SupArchList="IA32">Ia32/SetMem64.S</Filename>
<Filename SupArchList="IA32">Ia32/ZeroMem.S</Filename>
<Filename SupArchList="IA32">Ia32/CompareMem.S</Filename>
<Filename SupArchList="IA32">Ia32/ScanMem8.S</Filename>
<Filename SupArchList="IA32">Ia32/ScanMem16.S</Filename>
<Filename SupArchList="IA32">Ia32/ScanMem32.S</Filename>
<Filename SupArchList="IA32">Ia32/ScanMem64.S</Filename>
<Filename SupArchList="X64">MemLibGuid.c</Filename>
<Filename SupArchList="X64">CopyMemWrapper.c</Filename>
<Filename SupArchList="X64">SetMemWrapper.c</Filename>
<Filename SupArchList="X64">SetMem16Wrapper.c</Filename>
<Filename SupArchList="X64">SetMem32Wrapper.c</Filename>
<Filename SupArchList="X64">SetMem64Wrapper.c</Filename>
<Filename SupArchList="X64">CompareMemWrapper.c</Filename>
<Filename SupArchList="X64">ZeroMemWrapper.c</Filename>
<Filename SupArchList="X64">ScanMem8Wrapper.c</Filename>
<Filename SupArchList="X64">ScanMem16Wrapper.c</Filename>
<Filename SupArchList="X64">ScanMem32Wrapper.c</Filename>
<Filename SupArchList="X64">ScanMem64Wrapper.c</Filename>
<Filename SupArchList="X64">x64/CopyMem.asm</Filename>
<Filename SupArchList="X64">x64/SetMem.asm</Filename>
<Filename SupArchList="X64">x64/SetMem16.asm</Filename>
<Filename SupArchList="X64">x64/SetMem32.asm</Filename>
<Filename SupArchList="X64">x64/SetMem64.asm</Filename>
<Filename SupArchList="X64">x64/ZeroMem.asm</Filename>
<Filename SupArchList="X64">x64/CompareMem.asm</Filename>
<Filename SupArchList="X64">x64/ScanMem8.asm</Filename>
<Filename SupArchList="X64">x64/ScanMem16.asm</Filename>
<Filename SupArchList="X64">x64/ScanMem32.asm</Filename>
<Filename SupArchList="X64">x64/ScanMem64.asm</Filename>
</SourceFiles>
<PackageDependencies>
<Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
</PackageDependencies>
<Externs>
<Specification>EFI_SPECIFICATION_VERSION 0x00020000</Specification>
<Specification>EDK_RELEASE_VERSION 0x00020000</Specification>
</Externs>
</ModuleSurfaceArea>

View File

@ -0,0 +1,70 @@
/** @file
CompareMem() implementation.
Copyright (c) 2006, Intel Corporation<BR>
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.
The following BaseMemoryLib instances share the same version of this file:
BaseMemoryLib
BaseMemoryLibMmx
BaseMemoryLibSse2
BaseMemoryLibRepStr
PeiMemoryLib
DxeMemoryLib
**/
//
// Include common header file for this module.
//
#include "MemLibInternals.h"
/**
Compares the contents of two buffers.
This function compares Length bytes of SourceBuffer to Length bytes of DestinationBuffer.
If all Length bytes of the two buffers are identical, then 0 is returned. Otherwise, the
value returned is the first mismatched byte in SourceBuffer subtracted from the first
mismatched byte in DestinationBuffer.
If Length > 0 and DestinationBuffer is NULL and Length > 0, then ASSERT().
If Length > 0 and SourceBuffer is NULL and Length > 0, then ASSERT().
If Length is greater than (MAX_ADDRESS - DestinationBuffer + 1), then ASSERT().
If Length is greater than (MAX_ADDRESS - SourceBuffer + 1), then ASSERT().
@param DestinationBuffer Pointer to the destination buffer to compare.
@param SourceBuffer Pointer to the source buffer to compare.
@param Length Number of bytes to compare.
@return 0 All Length bytes of the two buffers are identical.
@retval Non-zero The first mismatched byte in SourceBuffer subtracted from the first
mismatched byte in DestinationBuffer.
**/
INTN
EFIAPI
CompareMem (
IN CONST VOID *DestinationBuffer,
IN CONST VOID *SourceBuffer,
IN UINTN Length
)
{
if (Length == 0) {
return 0;
}
ASSERT (DestinationBuffer != NULL);
ASSERT (SourceBuffer != NULL);
ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)DestinationBuffer));
ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)SourceBuffer));
return InternalMemCompareMem (DestinationBuffer, SourceBuffer, Length);
}

View File

@ -0,0 +1,65 @@
/** @file
CopyMem() implementation.
Copyright (c) 2006, Intel Corporation<BR>
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.
The following BaseMemoryLib instances share the same version of this file:
BaseMemoryLib
BaseMemoryLibMmx
BaseMemoryLibSse2
BaseMemoryLibRepStr
PeiMemoryLib
DxeMemoryLib
**/
//
// Include common header file for this module.
//
#include "MemLibInternals.h"
/**
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 Pointer to the destination buffer of the memory copy.
@param SourceBuffer Pointer to the source buffer of the memory copy.
@param Length 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);
}

View File

@ -0,0 +1,53 @@
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, 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.
#
# Module Name:
#
# CompareMem.Asm
#
# Abstract:
#
# CompareMem function
#
# Notes:
#
# The following BaseMemoryLib instances share the same version of this file:
#
# BaseMemoryLibRepStr
# BaseMemoryLibMmx
# BaseMemoryLibSse2
#
#------------------------------------------------------------------------------
.globl _InternalMemCompareMem
#------------------------------------------------------------------------------
# INTN
# EFIAPI
# InternalMemCompareMem (
# IN CONST VOID *DestinationBuffer,
# IN CONST VOID *SourceBuffer,
# IN UINTN Length
# );
#------------------------------------------------------------------------------
_InternalMemCompareMem:
push %esi
push %edi
movl 12(%esp), %esi
movl 16(%esp), %edi
movl 20(%esp), %ecx
repe cmpsb
movzbl -1(%esi), %eax
movzbl -1(%edi), %edx
subl %edx, %eax
pop %edi
pop %esi
ret

View File

@ -0,0 +1,54 @@
;------------------------------------------------------------------------------
;
; Copyright (c) 2006, 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.
;
; Module Name:
;
; CompareMem.Asm
;
; Abstract:
;
; CompareMem function
;
; Notes:
;
; The following BaseMemoryLib instances share the same version of this file:
;
; BaseMemoryLibRepStr
; BaseMemoryLibMmx
; BaseMemoryLibSse2
;
;------------------------------------------------------------------------------
.686
.model flat,C
.code
;------------------------------------------------------------------------------
; INTN
; EFIAPI
; InternalMemCompareMem (
; IN CONST VOID *DestinationBuffer,
; IN CONST VOID *SourceBuffer,
; IN UINTN Length
; );
;------------------------------------------------------------------------------
InternalMemCompareMem PROC USES esi edi
mov esi, [esp + 12]
mov edi, [esp + 16]
mov ecx, [esp + 20]
repe cmpsb
movzx eax, byte ptr [esi - 1]
movzx edx, byte ptr [edi - 1]
sub eax, edx
ret
InternalMemCompareMem ENDP
END

View File

@ -0,0 +1,62 @@
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, 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.
#
# Module Name:
#
# CopyMem.Asm
#
# Abstract:
#
# CopyMem function
#
# Notes:
#
#------------------------------------------------------------------------------
.globl _InternalMemCopyMem
#------------------------------------------------------------------------------
# VOID *
# EFIAPI
# InternalMemCopyMem (
# IN VOID *Destination,
# IN VOID *Source,
# IN UINTN Count
# );
#------------------------------------------------------------------------------
_InternalMemCopyMem:
push %esi
push %edi
movl 16(%esp), %esi # esi <- Source
movl 12(%esp), %edi # edi <- Destination
movl 20(%esp), %edx # edx <- Count
cmpl %esi, %edi
je L_CopyDone
cmpl %edx, $0
je L_CopyDone
leal -1(%esi, %edx), %eax # eax <- End of Source
cmpl %esi, %edi
jae L_CopyBytes
cmpl %eax, %edi
jb L_CopyBytes # Copy backward if overlapped
movl %esi, %eax # esi <- End of Source
leal -1(%edi, %edx), %edi # edi <- End of Destination
std
L_CopyBytes:
movl %ecx, %edx
rep
movsb # Copy bytes backward
cld
L_CopyDone:
movl 12(%esp), %eax # eax <- Destination as return value
pop %edi
pop %esi
ret

View File

@ -0,0 +1,61 @@
;------------------------------------------------------------------------------
;
; Copyright (c) 2006, 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.
;
; Module Name:
;
; CopyMem.Asm
;
; Abstract:
;
; CopyMem function
;
; Notes:
;
;------------------------------------------------------------------------------
.386
.model flat,C
.code
;------------------------------------------------------------------------------
; VOID *
; InternalMemCopyMem (
; IN VOID *Destination,
; IN VOID *Source,
; IN UINTN Count
; )
;------------------------------------------------------------------------------
InternalMemCopyMem PROC USES esi edi
mov esi, [esp+16] ; esi <- Source
mov edi, [esp+12] ; edi <- Destination
mov edx, [esp+20] ; edx <- Count
cmp esi, edi
je @CopyDone
cmp edx, 0
je @CopyDone
lea eax, [esi + edx - 1] ; eax <- End of Source
cmp esi, edi
jae @CopyBytes
cmp eax, edi
jb @CopyBytes ; Copy backward if overlapped
mov esi, eax ; esi <- End of Source
lea edi, [edi + edx - 1] ; edi <- End of Destination
std
@CopyBytes:
mov ecx, edx
rep movsb ; Copy bytes backward
cld
@CopyDone:
mov eax, [esp + 12] ; eax <- Destination as return value
ret
InternalMemCopyMem ENDP
END

View File

@ -0,0 +1,50 @@
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, 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.
#
# Module Name:
#
# ScanMem16.Asm
#
# Abstract:
#
# ScanMem16 function
#
# Notes:
#
# The following BaseMemoryLib instances share the same version of this file:
#
# BaseMemoryLibRepStr
# BaseMemoryLibMmx
# BaseMemoryLibSse2
#
#------------------------------------------------------------------------------
.globl _InternalMemScanMem16
#------------------------------------------------------------------------------
# CONST VOID *
# EFIAPI
# InternalMemScanMem16 (
# IN CONST VOID *Buffer,
# IN UINTN Length,
# IN UINT16 Value
# );
#------------------------------------------------------------------------------
_InternalMemScanMem16:
push %edi
movl 12(%esp), %ecx
movl 8(%esp), %edi
movl 16(%esp), %eax
repne scasw
leal -2(%edi), %eax
cmovnz %ecx, %eax
pop %edi
ret

View File

@ -0,0 +1,53 @@
;------------------------------------------------------------------------------
;
; Copyright (c) 2006, 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.
;
; Module Name:
;
; ScanMem16.Asm
;
; Abstract:
;
; ScanMem16 function
;
; Notes:
;
; The following BaseMemoryLib instances share the same version of this file:
;
; BaseMemoryLibRepStr
; BaseMemoryLibMmx
; BaseMemoryLibSse2
;
;------------------------------------------------------------------------------
.686
.model flat,C
.code
;------------------------------------------------------------------------------
; CONST VOID *
; EFIAPI
; InternalMemScanMem16 (
; IN CONST VOID *Buffer,
; IN UINTN Length,
; IN UINT16 Value
; );
;------------------------------------------------------------------------------
InternalMemScanMem16 PROC USES edi
mov ecx, [esp + 12]
mov edi, [esp + 8]
mov eax, [esp + 16]
repne scasw
lea eax, [edi - 2]
cmovnz eax, ecx
ret
InternalMemScanMem16 ENDP
END

View File

@ -0,0 +1,50 @@
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, 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.
#
# Module Name:
#
# ScanMem32.Asm
#
# Abstract:
#
# ScanMem32 function
#
# Notes:
#
# The following BaseMemoryLib instances share the same version of this file:
#
# BaseMemoryLibRepStr
# BaseMemoryLibMmx
# BaseMemoryLibSse2
#
#------------------------------------------------------------------------------
.globl _InternalMemScanMem32
#------------------------------------------------------------------------------
# CONST VOID *
# EFIAPI
# InternalMemScanMem32 (
# IN CONST VOID *Buffer,
# IN UINTN Length,
# IN UINT32 Value
# );
#------------------------------------------------------------------------------
_InternalMemScanMem32:
push %edi
movl 12(%esp), %ecx
movl 8(%esp), %edi
movl 16(%esp), %eax
repne scasl
leal -4(%edi), %eax
cmovnz %ecx, %eax
pop %edi
ret

View File

@ -0,0 +1,53 @@
;------------------------------------------------------------------------------
;
; Copyright (c) 2006, 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.
;
; Module Name:
;
; ScanMem32.Asm
;
; Abstract:
;
; ScanMem32 function
;
; Notes:
;
; The following BaseMemoryLib instances share the same version of this file:
;
; BaseMemoryLibRepStr
; BaseMemoryLibMmx
; BaseMemoryLibSse2
;
;------------------------------------------------------------------------------
.686
.model flat,C
.code
;------------------------------------------------------------------------------
; CONST VOID *
; EFIAPI
; InternalMemScanMem32 (
; IN CONST VOID *Buffer,
; IN UINTN Length,
; IN UINT32 Value
; );
;------------------------------------------------------------------------------
InternalMemScanMem32 PROC USES edi
mov ecx, [esp + 12]
mov edi, [esp + 8]
mov eax, [esp + 16]
repne scasd
lea eax, [edi - 4]
cmovnz eax, ecx
ret
InternalMemScanMem32 ENDP
END

View File

@ -0,0 +1,59 @@
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, 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.
#
# Module Name:
#
# ScanMem64.Asm
#
# Abstract:
#
# ScanMem64 function
#
# Notes:
#
# The following BaseMemoryLib instances share the same version of this file:
#
# BaseMemoryLibRepStr
# BaseMemoryLibMmx
# BaseMemoryLibSse2
#
#------------------------------------------------------------------------------
.globl _InternalMemScanMem64
#------------------------------------------------------------------------------
# CONST VOID *
# EFIAPI
# InternalMemScanMem64 (
# IN CONST VOID *Buffer,
# IN UINTN Length,
# IN UINT64 Value
# );
#------------------------------------------------------------------------------
_InternalMemScanMem64:
push %edi
movl 12(%esp), %ecx
movl 16(%esp), %eax
movl 20(%esp), %edx
movl 8(%esp), %edi
L0:
cmpl (%edi), %eax
leal 8(%edi), %edi
loopne L0
jne L1
cmpl -4(%edi), %edx
jecxz L1
jne L0
L1:
leal -8(%edi), %eax
cmovne %ecx, %eax
pop %edi
ret

View File

@ -0,0 +1,62 @@
;------------------------------------------------------------------------------
;
; Copyright (c) 2006, 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.
;
; Module Name:
;
; ScanMem64.Asm
;
; Abstract:
;
; ScanMem64 function
;
; Notes:
;
; The following BaseMemoryLib instances share the same version of this file:
;
; BaseMemoryLibRepStr
; BaseMemoryLibMmx
; BaseMemoryLibSse2
;
;------------------------------------------------------------------------------
.686
.model flat,C
.code
;------------------------------------------------------------------------------
; CONST VOID *
; EFIAPI
; InternalMemScanMem64 (
; IN CONST VOID *Buffer,
; IN UINTN Length,
; IN UINT64 Value
; );
;------------------------------------------------------------------------------
InternalMemScanMem64 PROC USES edi
mov ecx, [esp + 12]
mov eax, [esp + 16]
mov edx, [esp + 20]
mov edi, [esp + 8]
@@:
cmp eax, [edi]
lea edi, [edi + 8]
loopne @B
jne @F
cmp edx, [edi - 4]
jecxz @F
jne @B
@@:
lea eax, [edi - 8]
cmovne eax, ecx
ret
InternalMemScanMem64 ENDP
END

View File

@ -0,0 +1,50 @@
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, 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.
#
# Module Name:
#
# ScanMem8.Asm
#
# Abstract:
#
# ScanMem8 function
#
# Notes:
#
# The following BaseMemoryLib instances share the same version of this file:
#
# BaseMemoryLibRepStr
# BaseMemoryLibMmx
# BaseMemoryLibSse2
#
#------------------------------------------------------------------------------
.globl _InternalMemScanMem8
#------------------------------------------------------------------------------
# CONST VOID *
# EFIAPI
# InternalMemScanMem8 (
# IN CONST VOID *Buffer,
# IN UINTN Length,
# IN UINT8 Value
# );
#------------------------------------------------------------------------------
_InternalMemScanMem8:
push %edi
movl 12(%esp), %ecx
movl 8(%esp), %edi
movb 16(%esp), %al
repne scasb
leal -1(%edi), %eax
cmovnz %ecx, %eax
pop %edi
ret

View File

@ -0,0 +1,53 @@
;------------------------------------------------------------------------------
;
; Copyright (c) 2006, 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.
;
; Module Name:
;
; ScanMem8.Asm
;
; Abstract:
;
; ScanMem8 function
;
; Notes:
;
; The following BaseMemoryLib instances share the same version of this file:
;
; BaseMemoryLibRepStr
; BaseMemoryLibMmx
; BaseMemoryLibSse2
;
;------------------------------------------------------------------------------
.686
.model flat,C
.code
;------------------------------------------------------------------------------
; CONST VOID *
; EFIAPI
; InternalMemScanMem8 (
; IN CONST VOID *Buffer,
; IN UINTN Length,
; IN UINT8 Value
; );
;------------------------------------------------------------------------------
InternalMemScanMem8 PROC USES edi
mov ecx, [esp + 12]
mov edi, [esp + 8]
mov al, [esp + 16]
repne scasb
lea eax, [edi - 1]
cmovnz eax, ecx
ret
InternalMemScanMem8 ENDP
END

View File

@ -0,0 +1,55 @@
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, 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.
#
# Module Name:
#
# SetMem.Asm
#
# Abstract:
#
# SetMem function
#
# Notes:
#
#------------------------------------------------------------------------------
.386:
.code:
.globl _InternalMemSetMem
#------------------------------------------------------------------------------
# VOID *
# InternalMemSetMem (
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT8 Value
# )
#------------------------------------------------------------------------------
_InternalMemSetMem:
push %edi
movl 12(%esp),%ecx
movl 16(%esp),%al
movb %ah, %al
shrd %edx, %eax, $16
shld %eax, %edx, $16
movl %edx, %ecx
movl 8(%esp),%edi
shr $2, %ecx
rep
stosd
movl %ecx, %edx
andl $3, %ecx
rep
stosb
movl 8(%esp),%eax
pop %edi
ret

View File

@ -0,0 +1,53 @@
;------------------------------------------------------------------------------
;
; Copyright (c) 2006, 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.
;
; Module Name:
;
; SetMem.Asm
;
; Abstract:
;
; SetMem function
;
; Notes:
;
;------------------------------------------------------------------------------
.386
.model flat,C
.code
;------------------------------------------------------------------------------
; VOID *
; InternalMemSetMem (
; IN VOID *Buffer,
; IN UINTN Count,
; IN UINT8 Value
; )
;------------------------------------------------------------------------------
InternalMemSetMem PROC USES edi
mov ecx, [esp + 12]
mov al, [esp + 16]
mov ah, al
shrd edx, eax, 16
shld eax, edx, 16
mov edx, ecx
mov edi, [esp + 8]
shr ecx, 2
rep stosd
mov ecx, edx
and ecx, 3
rep stosb
mov eax, [esp + 8]
ret
InternalMemSetMem ENDP
END

View File

@ -0,0 +1,43 @@
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, 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.
#
# Module Name:
#
# SetMem16.Asm
#
# Abstract:
#
# SetMem16 function
#
# Notes:
#
#------------------------------------------------------------------------------
.globl _InternalMemSetMem16
#------------------------------------------------------------------------------
# VOID *
# InternalMemSetMem16 (
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT16 Value
# )
#------------------------------------------------------------------------------
_InternalMemSetMem16:
push %edi
movl 16(%esp), %eax
movl 8(%esp), %edi
movl 12(%esp), %ecx
rep
stosw
movl 8(%esp), %eax
pop %edi
ret

View File

@ -0,0 +1,45 @@
;------------------------------------------------------------------------------
;
; Copyright (c) 2006, 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.
;
; Module Name:
;
; SetMem16.Asm
;
; Abstract:
;
; SetMem16 function
;
; Notes:
;
;------------------------------------------------------------------------------
.386
.model flat,C
.code
;------------------------------------------------------------------------------
; VOID *
; InternalMemSetMem16 (
; IN VOID *Buffer,
; IN UINTN Count,
; IN UINT16 Value
; )
;------------------------------------------------------------------------------
InternalMemSetMem16 PROC USES edi
mov eax, [esp + 16]
mov edi, [esp + 8]
mov ecx, [esp + 12]
rep stosw
mov eax, [esp + 8]
ret
InternalMemSetMem16 ENDP
END

View File

@ -0,0 +1,43 @@
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, 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.
#
# Module Name:
#
# SetMem32.Asm
#
# Abstract:
#
# SetMem32 function
#
# Notes:
#
#------------------------------------------------------------------------------
.globl _InternalMemSetMem32
#------------------------------------------------------------------------------
# VOID *
# InternalMemSetMem32 (
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT32 Value
# )
#------------------------------------------------------------------------------
_InternalMemSetMem32:
push %edi
movl 16(%esp),%eax
movl 8(%esp),%edi
movl 12(%esp),%ecx
rep
stosl
movl 8(%esp),%eax
pop %edi
ret

View File

@ -0,0 +1,45 @@
;------------------------------------------------------------------------------
;
; Copyright (c) 2006, 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.
;
; Module Name:
;
; SetMem32.Asm
;
; Abstract:
;
; SetMem32 function
;
; Notes:
;
;------------------------------------------------------------------------------
.386
.model flat,C
.code
;------------------------------------------------------------------------------
; VOID *
; InternalMemSetMem32 (
; IN VOID *Buffer,
; IN UINTN Count,
; IN UINT32 Value
; )
;------------------------------------------------------------------------------
InternalMemSetMem32 PROC USES edi
mov eax, [esp + 16]
mov edi, [esp + 8]
mov ecx, [esp + 12]
rep stosd
mov eax, [esp + 8]
ret
InternalMemSetMem32 ENDP
END

View File

@ -0,0 +1,46 @@
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, 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.
#
# Module Name:
#
# SetMem64.Asm
#
# Abstract:
#
# SetMem64 function
#
# Notes:
#
#------------------------------------------------------------------------------
.globl _InternalMemSetMem64
#------------------------------------------------------------------------------
# VOID *
# InternalMemSetMem64 (
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT64 Value
# )
#------------------------------------------------------------------------------
_InternalMemSetMem64:
push %edi
movl 12(%esp), %ecx
movl 16(%esp), %eax
movl 20(%esp), %edx
movl 8(%esp), %edi
L0:
mov %eax, -8(%edi, %ecx, 8)
mov %edx, -4(%edi, %ecx, 8)
loop L0
movl %edi, %eax
pop %edi
ret

View File

@ -0,0 +1,49 @@
;------------------------------------------------------------------------------
;
; Copyright (c) 2006, 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.
;
; Module Name:
;
; SetMem64.Asm
;
; Abstract:
;
; SetMem64 function
;
; Notes:
;
;------------------------------------------------------------------------------
.386
.model flat,C
.code
;------------------------------------------------------------------------------
; VOID *
; InternalMemSetMem64 (
; IN VOID *Buffer,
; IN UINTN Count,
; IN UINT64 Value
; )
;------------------------------------------------------------------------------
InternalMemSetMem64 PROC USES edi
mov ecx, [esp + 12]
mov eax, [esp + 16]
mov edx, [esp + 20]
mov edi, [esp + 8]
@@:
mov [edi + ecx*8 - 8], eax
mov [edi + ecx*8 - 4], edx
loop @B
mov eax, edi
ret
InternalMemSetMem64 ENDP
END

View File

@ -0,0 +1,49 @@
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, 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.
#
# Module Name:
#
# ZeroMem.Asm
#
# Abstract:
#
# ZeroMem function
#
# Notes:
#
#------------------------------------------------------------------------------
.globl _InternalMemZeroMem
#------------------------------------------------------------------------------
# VOID *
# InternalMemZeroMem (
# IN VOID *Buffer,
# IN UINTN Count
# );
#------------------------------------------------------------------------------
_InternalMemZeroMem:
push %edi
xorl %eax,%eax
movl 8(%esp),%edi
movl 12(%esp),%ecx
movl %ecx,%edx
shrl $2,%ecx
andl $3,%edx
pushl %edi
rep
stosl
movl %edx,%ecx
rep
stosb
popl %eax
pop %edi
ret

View File

@ -0,0 +1,50 @@
;------------------------------------------------------------------------------
;
; Copyright (c) 2006, 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.
;
; Module Name:
;
; ZeroMem.Asm
;
; Abstract:
;
; ZeroMem function
;
; Notes:
;
;------------------------------------------------------------------------------
.386
.model flat,C
.code
;------------------------------------------------------------------------------
; VOID *
; InternalMemZeroMem (
; IN VOID *Buffer,
; IN UINTN Count
; );
;------------------------------------------------------------------------------
InternalMemZeroMem PROC USES edi
xor eax, eax
mov edi, [esp + 8]
mov ecx, [esp + 12]
mov edx, ecx
shr ecx, 2
and edx, 3
push edi
rep stosd
mov ecx, edx
rep stosb
pop eax
ret
InternalMemZeroMem ENDP
END

View File

@ -0,0 +1,141 @@
/** @file
Implementation of GUID functions.
Copyright (c) 2006, Intel Corporation<BR>
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.
The following BaseMemoryLib instances share the same version of this file:
BaseMemoryLib
BaseMemoryLibMmx
BaseMemoryLibSse2
BaseMemoryLibRepStr
PeiMemoryLib
DxeMemoryLib
**/
//
// Include common header file for this module.
//
#include <MemLibInternals.h>
/**
Copies a source GUID to a destination GUID.
This function copies the contents of the 128-bit GUID specified by SourceGuid to
DestinationGuid, and returns DestinationGuid.
If DestinationGuid is NULL, then ASSERT().
If SourceGuid is NULL, then ASSERT().
@param DestinationGuid Pointer to the destination GUID.
@param SourceGuid Pointer to the source GUID.
@return DestinationGuid.
**/
GUID *
EFIAPI
CopyGuid (
OUT GUID *DestinationGuid,
IN CONST GUID *SourceGuid
)
{
WriteUnaligned64 (
(UINT64*)DestinationGuid,
ReadUnaligned64 ((CONST UINT64*)SourceGuid)
);
WriteUnaligned64 (
(UINT64*)DestinationGuid + 1,
ReadUnaligned64 ((CONST UINT64*)SourceGuid + 1)
);
return DestinationGuid;
}
/**
Compares two GUIDs.
This function compares Guid1 to Guid2. If the GUIDs are identical then TRUE is returned.
If there are any bit differences in the two GUIDs, then FALSE is returned.
If Guid1 is NULL, then ASSERT().
If Guid2 is NULL, then ASSERT().
@param Guid1 A pointer to a 128 bit GUID.
@param Guid2 A pointer to a 128 bit GUID.
@retval TRUE Guid1 and Guid2 are identical.
@retval FALSE Guid1 and Guid2 are not identical.
**/
BOOLEAN
EFIAPI
CompareGuid (
IN CONST GUID *Guid1,
IN CONST GUID *Guid2
)
{
UINT64 LowPartOfGuid1;
UINT64 LowPartOfGuid2;
UINT64 HighPartOfGuid1;
UINT64 HighPartOfGuid2;
LowPartOfGuid1 = ReadUnaligned64 ((CONST UINT64*) Guid1);
LowPartOfGuid2 = ReadUnaligned64 ((CONST UINT64*) Guid2);
HighPartOfGuid1 = ReadUnaligned64 ((CONST UINT64*) Guid1 + 1);
HighPartOfGuid2 = ReadUnaligned64 ((CONST UINT64*) Guid2 + 1);
return (BOOLEAN) (LowPartOfGuid1 == LowPartOfGuid2 && HighPartOfGuid1 == HighPartOfGuid2);
}
/**
Scans a target buffer for a GUID, and returns a pointer to the matching GUID
in the target buffer.
This function searches target the buffer specified by Buffer and Length from
the lowest address to the highest address at 128-bit increments for the 128-bit
GUID value that matches Guid. If a match is found, then a pointer to the matching
GUID in the target buffer is returned. If no match is found, then NULL is returned.
If Length is 0, then NULL is returned.
If Length > 0 and Buffer is NULL, then ASSERT().
If Buffer is not aligned on a 32-bit boundary, then ASSERT().
If Length is not aligned on a 128-bit boundary, then ASSERT().
If Length is greater than (MAX_ADDRESS ? Buffer + 1), then ASSERT().
@param Buffer Pointer to the target buffer to scan.
@param Length Number of bytes in Buffer to scan.
@param Guid Value to search for in the target buffer.
@return A pointer to the matching Guid in the target buffer or NULL otherwise.
**/
VOID *
EFIAPI
ScanGuid (
IN CONST VOID *Buffer,
IN UINTN Length,
IN CONST GUID *Guid
)
{
CONST GUID *GuidPtr;
ASSERT (((UINTN)Buffer & (sizeof (Guid->Data1) - 1)) == 0);
ASSERT (Length <= (MAX_ADDRESS - (UINTN)Buffer + 1));
ASSERT ((Length & (sizeof (*GuidPtr) - 1)) == 0);
GuidPtr = (GUID*)Buffer;
Buffer = GuidPtr + Length / sizeof (*GuidPtr);
while (GuidPtr < (CONST GUID*)Buffer) {
if (CompareGuid (GuidPtr, Guid)) {
return (VOID*)GuidPtr;
}
GuidPtr++;
}
return NULL;
}

View File

@ -0,0 +1,233 @@
/** @file
Declaration of internal functions for Base Memory Library.
The following BaseMemoryLib instances share the same version of this file:
BaseMemoryLib
BaseMemoryLibMmx
BaseMemoryLibSse2
BaseMemoryLibRepStr
PeiMemoryLib
DxeMemoryLib
Copyright (c) 2006, Intel Corporation<BR>
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.
**/
#ifndef __MEM_LIB_INTERNALS__
#define __MEM_LIB_INTERNALS__
#include <Base.h>
#include <Library/BaseMemoryLib.h>
#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
/**
Copy Length bytes from Source to Destination.
@param Destination Target of copy
@param Source Place to copy from
@param Length Number of bytes to copy
@return Destination
**/
VOID *
EFIAPI
InternalMemCopyMem (
OUT VOID *DestinationBuffer,
IN CONST VOID *SourceBuffer,
IN UINTN Length
);
/**
Set Buffer to Value for Size bytes.
@param Buffer Memory to set.
@param Size Number of bytes to set
@param Value Value of the set operation.
@return Buffer
**/
VOID *
EFIAPI
InternalMemSetMem (
OUT VOID *Buffer,
IN UINTN Length,
IN UINT8 Value
);
/**
Fills a target buffer with a 16-bit value, and returns the target buffer.
@param Buffer Pointer to the target buffer to fill.
@param Length Number of bytes in Buffer to fill.
@param Value Value with which to fill Length bytes of Buffer.
@return Buffer
**/
VOID *
EFIAPI
InternalMemSetMem16 (
OUT VOID *Buffer,
IN UINTN Length,
IN UINT16 Value
);
/**
Fills a target buffer with a 32-bit value, and returns the target buffer.
@param Buffer Pointer to the target buffer to fill.
@param Length Number of bytes in Buffer to fill.
@param Value Value with which to fill Length bytes of Buffer.
@return Buffer
**/
VOID *
EFIAPI
InternalMemSetMem32 (
OUT VOID *Buffer,
IN UINTN Length,
IN UINT32 Value
);
/**
Fills a target buffer with a 64-bit value, and returns the target buffer.
@param Buffer Pointer to the target buffer to fill.
@param Length Number of bytes in Buffer to fill.
@param Value Value with which to fill Length bytes of Buffer.
@return Buffer
**/
VOID *
EFIAPI
InternalMemSetMem64 (
OUT VOID *Buffer,
IN UINTN Length,
IN UINT64 Value
);
/**
Set Buffer to 0 for Size bytes.
@param Buffer Memory to set.
@param Size Number of bytes to set
@return Buffer
**/
VOID *
EFIAPI
InternalMemZeroMem (
OUT VOID *Buffer,
IN UINTN Length
);
/**
Compares two memory buffers of a given length.
@param DestinationBuffer First memory buffer
@param SourceBuffer Second memory buffer
@param Length Length of DestinationBuffer and SourceBuffer memory
regions to compare. Must be non-zero.
@retval 0 if MemOne == MemTwo
**/
INTN
EFIAPI
InternalMemCompareMem (
IN CONST VOID *DestinationBuffer,
IN CONST VOID *SourceBuffer,
IN UINTN Length
);
/**
Scans a target buffer for an 8-bit value, and returns a pointer to the
matching 8-bit value in the target buffer.
@param Buffer Pointer to the target buffer to scan.
@param Length Number of bytes in Buffer to scan. Must be non-zero.
@param Value Value to search for in the target buffer.
@return Pointer to the first occurrence or NULL if not found.
**/
CONST VOID *
EFIAPI
InternalMemScanMem8 (
IN CONST VOID *Buffer,
IN UINTN Length,
IN UINT8 Value
);
/**
Scans a target buffer for a 16-bit value, and returns a pointer to the
matching 16-bit value in the target buffer.
@param Buffer Pointer to the target buffer to scan.
@param Length Number of bytes in Buffer to scan. Must be non-zero.
@param Value Value to search for in the target buffer.
@return Pointer to the first occurrence or NULL if not found.
**/
CONST VOID *
EFIAPI
InternalMemScanMem16 (
IN CONST VOID *Buffer,
IN UINTN Length,
IN UINT16 Value
);
/**
Scans a target buffer for a 32-bit value, and returns a pointer to the
matching 32-bit value in the target buffer.
@param Buffer Pointer to the target buffer to scan.
@param Length Number of bytes in Buffer to scan. Must be non-zero.
@param Value Value to search for in the target buffer.
@return Pointer to the first occurrence or NULL if not found.
**/
CONST VOID *
EFIAPI
InternalMemScanMem32 (
IN CONST VOID *Buffer,
IN UINTN Length,
IN UINT32 Value
);
/**
Scans a target buffer for a 64-bit value, and returns a pointer to the
matching 64-bit value in the target buffer.
@param Buffer Pointer to the target buffer to scan.
@param Length Number of bytes in Buffer to scan. Must be non-zero.
@param Value Value to search for in the target buffer.
@return Pointer to the first occurrence or NULL if not found.
**/
CONST VOID *
EFIAPI
InternalMemScanMem64 (
IN CONST VOID *Buffer,
IN UINTN Length,
IN UINT64 Value
);
#endif

View File

@ -0,0 +1,69 @@
/** @file
ScanMem16() implementation.
Copyright (c) 2006, Intel Corporation<BR>
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.
The following BaseMemoryLib instances share the same version of this file:
BaseMemoryLib
BaseMemoryLibMmx
BaseMemoryLibSse2
BaseMemoryLibRepStr
PeiMemoryLib
DxeMemoryLib
**/
//
// Include common header file for this module.
//
#include "MemLibInternals.h"
/**
Scans a target buffer for a 16-bit value, and returns a pointer to the matching 16-bit value
in the target buffer.
This function searches target the buffer specified by Buffer and Length from the lowest
address to the highest address for a 16-bit value that matches Value. If a match is found,
then a pointer to the matching byte in the target buffer is returned. If no match is found,
then NULL is returned. If Length is 0, then NULL is returned.
If Length > 0 and Buffer is NULL, then ASSERT().
If Buffer is not aligned on a 16-bit boundary, then ASSERT().
If Length is not aligned on a 16-bit boundary, then ASSERT().
If Length is greater than (MAX_ADDRESS ? Buffer + 1), then ASSERT().
@param Buffer Pointer to the target buffer to scan.
@param Length Number of bytes in Buffer to scan.
@param Value Value to search for in the target buffer.
@return A pointer to the matching byte in the target buffer or NULL otherwise.
**/
VOID *
EFIAPI
ScanMem16 (
IN CONST VOID *Buffer,
IN UINTN Length,
IN UINT16 Value
)
{
if (Length == 0) {
return NULL;
}
ASSERT (Buffer != NULL);
ASSERT (((UINTN)Buffer & (sizeof (Value) - 1)) == 0);
ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)Buffer));
ASSERT ((Length & (sizeof (Value) - 1)) == 0);
return (VOID*)InternalMemScanMem16 (Buffer, Length / sizeof (Value), Value);
}

View File

@ -0,0 +1,69 @@
/** @file
ScanMem32() implementation.
Copyright (c) 2006, Intel Corporation<BR>
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.
The following BaseMemoryLib instances share the same version of this file:
BaseMemoryLib
BaseMemoryLibMmx
BaseMemoryLibSse2
BaseMemoryLibRepStr
PeiMemoryLib
DxeMemoryLib
**/
//
// Include common header file for this module.
//
#include "MemLibInternals.h"
/**
Scans a target buffer for a 32-bit value, and returns a pointer to the matching 32-bit value
in the target buffer.
This function searches target the buffer specified by Buffer and Length from the lowest
address to the highest address for a 32-bit value that matches Value. If a match is found,
then a pointer to the matching byte in the target buffer is returned. If no match is found,
then NULL is returned. If Length is 0, then NULL is returned.
If Length > 0 and Buffer is NULL, then ASSERT().
If Buffer is not aligned on a 32-bit boundary, then ASSERT().
If Length is not aligned on a 32-bit boundary, then ASSERT().
If Length is greater than (MAX_ADDRESS ? Buffer + 1), then ASSERT().
@param Buffer Pointer to the target buffer to scan.
@param Length Number of bytes in Buffer to scan.
@param Value Value to search for in the target buffer.
@return A pointer to the matching byte in the target buffer or NULL otherwise.
**/
VOID *
EFIAPI
ScanMem32 (
IN CONST VOID *Buffer,
IN UINTN Length,
IN UINT32 Value
)
{
if (Length == 0) {
return NULL;
}
ASSERT (Buffer != NULL);
ASSERT (((UINTN)Buffer & (sizeof (Value) - 1)) == 0);
ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)Buffer));
ASSERT ((Length & (sizeof (Value) - 1)) == 0);
return (VOID*)InternalMemScanMem32 (Buffer, Length / sizeof (Value), Value);
}

View File

@ -0,0 +1,69 @@
/** @file
ScanMem64() implementation.
Copyright (c) 2006, Intel Corporation<BR>
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.
The following BaseMemoryLib instances share the same version of this file:
BaseMemoryLib
BaseMemoryLibMmx
BaseMemoryLibSse2
BaseMemoryLibRepStr
PeiMemoryLib
DxeMemoryLib
**/
//
// Include common header file for this module.
//
#include "MemLibInternals.h"
/**
Scans a target buffer for a 64-bit value, and returns a pointer to the matching 64-bit value
in the target buffer.
This function searches target the buffer specified by Buffer and Length from the lowest
address to the highest address for a 64-bit value that matches Value. If a match is found,
then a pointer to the matching byte in the target buffer is returned. If no match is found,
then NULL is returned. If Length is 0, then NULL is returned.
If Length > 0 and Buffer is NULL, then ASSERT().
If Buffer is not aligned on a 64-bit boundary, then ASSERT().
If Length is not aligned on a 64-bit boundary, then ASSERT().
If Length is greater than (MAX_ADDRESS ? Buffer + 1), then ASSERT().
@param Buffer Pointer to the target buffer to scan.
@param Length Number of bytes in Buffer to scan.
@param Value Value to search for in the target buffer.
@return A pointer to the matching byte in the target buffer or NULL otherwise.
**/
VOID *
EFIAPI
ScanMem64 (
IN CONST VOID *Buffer,
IN UINTN Length,
IN UINT64 Value
)
{
if (Length == 0) {
return NULL;
}
ASSERT (Buffer != NULL);
ASSERT (((UINTN)Buffer & (sizeof (Value) - 1)) == 0);
ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)Buffer));
ASSERT ((Length & (sizeof (Value) - 1)) == 0);
return (VOID*)InternalMemScanMem64 (Buffer, Length / sizeof (Value), Value);
}

View File

@ -0,0 +1,64 @@
/** @file
ScanMem8() implementation.
Copyright (c) 2006, Intel Corporation<BR>
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.
The following BaseMemoryLib instances share the same version of this file:
BaseMemoryLib
BaseMemoryLibMmx
BaseMemoryLibSse2
BaseMemoryLibRepStr
PeiMemoryLib
DxeMemoryLib
**/
//
// Include common header file for this module.
//
#include "MemLibInternals.h"
/**
Scans a target buffer for an 8-bit value, and returns a pointer to the matching 8-bit value
in the target buffer.
This function searches target the buffer specified by Buffer and Length from the lowest
address to the highest address for an 8-bit value that matches Value. If a match is found,
then a pointer to the matching byte in the target buffer is returned. If no match is found,
then NULL is returned. If Length is 0, then NULL is returned.
If Length > 0 and Buffer is NULL, then ASSERT().
If Length is greater than (MAX_ADDRESS ? Buffer + 1), then ASSERT().
@param Buffer Pointer to the target buffer to scan.
@param Length Number of bytes in Buffer to scan.
@param Value Value to search for in the target buffer.
@return A pointer to the matching byte in the target buffer or NULL otherwise.
**/
VOID *
EFIAPI
ScanMem8 (
IN CONST VOID *Buffer,
IN UINTN Length,
IN UINT8 Value
)
{
if (Length == 0) {
return NULL;
}
ASSERT (Buffer != NULL);
ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)Buffer));
return (VOID*)InternalMemScanMem8 (Buffer, Length, Value);
}

View File

@ -0,0 +1,68 @@
/** @file
SetMem16() implementation.
Copyright (c) 2006, Intel Corporation<BR>
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.
The following BaseMemoryLib instances share the same version of this file:
BaseMemoryLib
BaseMemoryLibMmx
BaseMemoryLibSse2
BaseMemoryLibRepStr
PeiMemoryLib
DxeMemoryLib
**/
//
// Include common header file for this module.
//
#include "MemLibInternals.h"
/**
Fills a target buffer with a 16-bit value, and returns the target buffer.
This function fills Length bytes of Buffer with the 16-bit value specified by
Value, and returns Buffer. Value is repeated every 16-bits in for Length
bytes of Buffer.
If Length > 0 and Buffer is NULL, then ASSERT().
If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
If Buffer is not aligned on a 16-bit boundary, then ASSERT().
If Length is not aligned on a 16-bit boundary, then ASSERT().
@param Buffer Pointer to the target buffer to fill.
@param Length Number of bytes in Buffer to fill.
@param Value Value with which to fill Length bytes of Buffer.
@return Buffer.
**/
VOID *
EFIAPI
SetMem16 (
OUT VOID *Buffer,
IN UINTN Length,
IN UINT16 Value
)
{
if (Length == 0) {
return Buffer;
}
ASSERT (Buffer != NULL);
ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)Buffer));
ASSERT ((((UINTN)Buffer) & (sizeof (Value) - 1)) == 0);
ASSERT ((Length & (sizeof (Value) - 1)) == 0);
return InternalMemSetMem16 (Buffer, Length / sizeof (Value), Value);
}

View File

@ -0,0 +1,68 @@
/** @file
SetMem32() implementation.
Copyright (c) 2006, Intel Corporation<BR>
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.
The following BaseMemoryLib instances share the same version of this file:
BaseMemoryLib
BaseMemoryLibMmx
BaseMemoryLibSse2
BaseMemoryLibRepStr
PeiMemoryLib
DxeMemoryLib
**/
//
// Include common header file for this module.
//
#include "MemLibInternals.h"
/**
Fills a target buffer with a 32-bit value, and returns the target buffer.
This function fills Length bytes of Buffer with the 32-bit value specified by
Value, and returns Buffer. Value is repeated every 32-bits in for Length
bytes of Buffer.
If Length > 0 and Buffer is NULL, then ASSERT().
If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
If Buffer is not aligned on a 32-bit boundary, then ASSERT().
If Length is not aligned on a 32-bit boundary, then ASSERT().
@param Buffer Pointer to the target buffer to fill.
@param Length Number of bytes in Buffer to fill.
@param Value Value with which to fill Length bytes of Buffer.
@return Buffer.
**/
VOID *
EFIAPI
SetMem32 (
OUT VOID *Buffer,
IN UINTN Length,
IN UINT32 Value
)
{
if (Length == 0) {
return Buffer;
}
ASSERT (Buffer != NULL);
ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)Buffer));
ASSERT ((((UINTN)Buffer) & (sizeof (Value) - 1)) == 0);
ASSERT ((Length & (sizeof (Value) - 1)) == 0);
return InternalMemSetMem32 (Buffer, Length / sizeof (Value), Value);
}

View File

@ -0,0 +1,68 @@
/** @file
SetMem64() implementation.
Copyright (c) 2006, Intel Corporation<BR>
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.
The following BaseMemoryLib instances share the same version of this file:
BaseMemoryLib
BaseMemoryLibMmx
BaseMemoryLibSse2
BaseMemoryLibRepStr
PeiMemoryLib
DxeMemoryLib
**/
//
// Include common header file for this module.
//
#include "MemLibInternals.h"
/**
Fills a target buffer with a 64-bit value, and returns the target buffer.
This function fills Length bytes of Buffer with the 64-bit value specified by
Value, and returns Buffer. Value is repeated every 64-bits in for Length
bytes of Buffer.
If Length > 0 and Buffer is NULL, then ASSERT().
If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
If Buffer is not aligned on a 64-bit boundary, then ASSERT().
If Length is not aligned on a 64-bit boundary, then ASSERT().
@param Buffer Pointer to the target buffer to fill.
@param Length Number of bytes in Buffer to fill.
@param Value Value with which to fill Length bytes of Buffer.
@return Buffer.
**/
VOID *
EFIAPI
SetMem64 (
OUT VOID *Buffer,
IN UINTN Length,
IN UINT64 Value
)
{
if (Length == 0) {
return Buffer;
}
ASSERT (Buffer != NULL);
ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)Buffer));
ASSERT ((((UINTN)Buffer) & (sizeof (Value) - 1)) == 0);
ASSERT ((Length & (sizeof (Value) - 1)) == 0);
return InternalMemSetMem64 (Buffer, Length / sizeof (Value), Value);
}

View File

@ -0,0 +1,59 @@
/** @file
SetMem() implementation.
Copyright (c) 2006, Intel Corporation<BR>
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.
The following BaseMemoryLib instances share the same version of this file:
BaseMemoryLib
BaseMemoryLibMmx
BaseMemoryLibSse2
BaseMemoryLibRepStr
PeiMemoryLib
DxeMemoryLib
**/
//
// Include common header file for this module.
//
#include "MemLibInternals.h"
/**
Fills a target buffer with a byte value, and returns the target buffer.
This function fills Length bytes of Buffer with Value, and returns Buffer.
If Length is greater than (MAX_ADDRESS ? Buffer + 1), then ASSERT().
@param Buffer Memory to set.
@param Length Number of bytes to set.
@param Value Value of the set operation.
@return Buffer.
**/
VOID *
EFIAPI
SetMem (
OUT VOID *Buffer,
IN UINTN Length,
IN UINT8 Value
)
{
if (Length == 0) {
return Buffer;
}
ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)Buffer));
return InternalMemSetMem (Buffer, Length, Value);
}

View File

@ -0,0 +1,54 @@
/** @file
ZeroMem() implementation.
Copyright (c) 2006, Intel Corporation<BR>
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.
The following BaseMemoryLib instances share the same version of this file:
BaseMemoryLib
BaseMemoryLibMmx
BaseMemoryLibSse2
BaseMemoryLibRepStr
PeiMemoryLib
DxeMemoryLib
**/
//
// Include common header file for this module.
//
#include "MemLibInternals.h"
/**
Fills a target buffer with zeros, and returns the target buffer.
This function fills Length bytes of Buffer with zeros, and returns Buffer.
If Length > 0 and Buffer is NULL, then ASSERT().
If Length is greater than (MAX_ADDRESS ? Buffer + 1), then ASSERT().
@param Buffer Pointer to the target buffer to fill with zeros.
@param Length Number of bytes in Buffer to fill with zeros.
@return Buffer.
**/
VOID *
EFIAPI
ZeroMem (
OUT VOID *Buffer,
IN UINTN Length
)
{
ASSERT (!(Buffer == NULL && Length > 0));
ASSERT (Length <= (MAX_ADDRESS - (UINTN)Buffer + 1));
return InternalMemZeroMem (Buffer, Length);
}

View File

@ -0,0 +1,52 @@
;------------------------------------------------------------------------------
;
; Copyright (c) 2006, 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.
;
; Module Name:
;
; CompareMem.Asm
;
; Abstract:
;
; CompareMem function
;
; Notes:
;
; The following BaseMemoryLib instances share the same version of this file:
;
; BaseMemoryLibRepStr
; BaseMemoryLibMmx
; BaseMemoryLibSse2
;
;------------------------------------------------------------------------------
.code
;------------------------------------------------------------------------------
; INTN
; EFIAPI
; InternalMemCompareMem (
; IN CONST VOID *DestinationBuffer,
; IN CONST VOID *SourceBuffer,
; IN UINTN Length
; );
;------------------------------------------------------------------------------
InternalMemCompareMem PROC USES rsi rdi
mov rsi, rcx
mov rdi, rdx
mov rcx, r8
repe cmpsb
movzx rax, byte ptr [rsi - 1]
movzx rdx, byte ptr [rdi - 1]
sub rax, rdx
ret
InternalMemCompareMem ENDP
END

View File

@ -0,0 +1,61 @@
;------------------------------------------------------------------------------
;
; Copyright (c) 2006, 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.
;
; Module Name:
;
; CopyMem.Asm
;
; Abstract:
;
; CopyMem function
;
; Notes:
;
;------------------------------------------------------------------------------
.code
;------------------------------------------------------------------------------
; VOID *
; EFIAPI
; InternalMemCopyMem (
; IN VOID *Destination,
; IN VOID *Source,
; IN UINTN Count
; )
;------------------------------------------------------------------------------
InternalMemCopyMem PROC USES rsi rdi
mov rsi, rdx ; rsi <- Source
mov rdi, rcx ; rdi <- Destination
lea r9, [rsi + r8 - 1] ; r9 <- End of Source
cmp rsi, rdi
mov rax, rdi ; rax <- Destination as return value
jae @F
cmp r9, rdi
jae @CopyBackward ; Copy backward if overlapped
@@:
mov rcx, r8
and r8, 7
shr rcx, 3
rep movsq ; Copy as many Qwords as possible
jmp @CopyBytes
@CopyBackward:
mov rsi, r9 ; rsi <- End of Source
lea rdi, [rdi + r8 - 1] ; esi <- End of Destination
std ; set direction flag
@CopyBytes:
mov rcx, r8
rep movsb ; Copy bytes backward
cld
ret
InternalMemCopyMem ENDP
END

View File

@ -0,0 +1,51 @@
;------------------------------------------------------------------------------
;
; Copyright (c) 2006, 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.
;
; Module Name:
;
; ScanMem16.Asm
;
; Abstract:
;
; ScanMem16 function
;
; Notes:
;
; The following BaseMemoryLib instances share the same version of this file:
;
; BaseMemoryLibRepStr
; BaseMemoryLibMmx
; BaseMemoryLibSse2
;
;------------------------------------------------------------------------------
.code
;------------------------------------------------------------------------------
; CONST VOID *
; EFIAPI
; InternalMemScanMem16 (
; IN CONST VOID *Buffer,
; IN UINTN Length,
; IN UINT16 Value
; );
;------------------------------------------------------------------------------
InternalMemScanMem16 PROC USES rdi
mov rdi, rcx
mov rax, r8
mov rcx, rdx
repne scasw
lea rax, [rdi - 2]
cmovnz rax, rcx
ret
InternalMemScanMem16 ENDP
END

View File

@ -0,0 +1,51 @@
;------------------------------------------------------------------------------
;
; Copyright (c) 2006, 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.
;
; Module Name:
;
; ScanMem32.Asm
;
; Abstract:
;
; ScanMem32 function
;
; Notes:
;
; The following BaseMemoryLib instances share the same version of this file:
;
; BaseMemoryLibRepStr
; BaseMemoryLibMmx
; BaseMemoryLibSse2
;
;------------------------------------------------------------------------------
.code
;------------------------------------------------------------------------------
; CONST VOID *
; EFIAPI
; InternalMemScanMem32 (
; IN CONST VOID *Buffer,
; IN UINTN Length,
; IN UINT32 Value
; );
;------------------------------------------------------------------------------
InternalMemScanMem32 PROC USES rdi
mov rdi, rcx
mov rax, r8
mov rcx, rdx
repne scasd
lea rax, [rdi - 4]
cmovnz rax, rcx
ret
InternalMemScanMem32 ENDP
END

View File

@ -0,0 +1,51 @@
;------------------------------------------------------------------------------
;
; Copyright (c) 2006, 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.
;
; Module Name:
;
; ScanMem64.Asm
;
; Abstract:
;
; ScanMem64 function
;
; Notes:
;
; The following BaseMemoryLib instances share the same version of this file:
;
; BaseMemoryLibRepStr
; BaseMemoryLibMmx
; BaseMemoryLibSse2
;
;------------------------------------------------------------------------------
.code
;------------------------------------------------------------------------------
; CONST VOID *
; EFIAPI
; InternalMemScanMem64 (
; IN CONST VOID *Buffer,
; IN UINTN Length,
; IN UINT64 Value
; );
;------------------------------------------------------------------------------
InternalMemScanMem64 PROC USES rdi
mov rdi, rcx
mov rax, r8
mov rcx, rdx
repne scasq
lea rax, [rdi - 8]
cmovnz rax, rcx
ret
InternalMemScanMem64 ENDP
END

View File

@ -0,0 +1,51 @@
;------------------------------------------------------------------------------
;
; Copyright (c) 2006, 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.
;
; Module Name:
;
; ScanMem8.Asm
;
; Abstract:
;
; ScanMem8 function
;
; Notes:
;
; The following BaseMemoryLib instances share the same version of this file:
;
; BaseMemoryLibRepStr
; BaseMemoryLibMmx
; BaseMemoryLibSse2
;
;------------------------------------------------------------------------------
.code
;------------------------------------------------------------------------------
; CONST VOID *
; EFIAPI
; InternalMemScanMem8 (
; IN CONST VOID *Buffer,
; IN UINTN Length,
; IN UINT8 Value
; );
;------------------------------------------------------------------------------
InternalMemScanMem8 PROC USES rdi
mov rdi, rcx
mov rcx, rdx
mov rax, r8
repne scasb
lea rax, [rdi - 1]
cmovnz rax, rcx ; set rax to 0 if not found
ret
InternalMemScanMem8 ENDP
END

View File

@ -0,0 +1,45 @@
;------------------------------------------------------------------------------
;
; Copyright (c) 2006, 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.
;
; Module Name:
;
; SetMem.Asm
;
; Abstract:
;
; SetMem function
;
; Notes:
;
;------------------------------------------------------------------------------
.code
;------------------------------------------------------------------------------
; VOID *
; EFIAPI
; InternalMemSetMem (
; IN VOID *Buffer,
; IN UINTN Count,
; IN UINT8 Value
; )
;------------------------------------------------------------------------------
InternalMemSetMem PROC USES rdi
push rcx ; push Buffer
mov rax, r8 ; rax = Value
mov rdi, rcx ; rdi = Buffer
mov rcx, rdx ; rcx = Count
rep stosb
pop rax ; rax = Buffer
ret
InternalMemSetMem ENDP
END

View File

@ -0,0 +1,44 @@
;------------------------------------------------------------------------------
;
; Copyright (c) 2006, 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.
;
; Module Name:
;
; SetMem16.Asm
;
; Abstract:
;
; SetMem16 function
;
; Notes:
;
;------------------------------------------------------------------------------
.code
;------------------------------------------------------------------------------
; VOID *
; EFIAPI
; InternalMemSetMem16 (
; IN VOID *Buffer,
; IN UINTN Count,
; IN UINT16 Value
; )
;------------------------------------------------------------------------------
InternalMemSetMem16 PROC USES rdi
mov rdi, rcx
mov rax, r8
xchg rcx, rdx
rep stosw
mov rax, rdx
ret
InternalMemSetMem16 ENDP
END

View File

@ -0,0 +1,44 @@
;------------------------------------------------------------------------------
;
; Copyright (c) 2006, 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.
;
; Module Name:
;
; SetMem32.Asm
;
; Abstract:
;
; SetMem32 function
;
; Notes:
;
;------------------------------------------------------------------------------
.code
;------------------------------------------------------------------------------
; VOID *
; EFIAPI
; InternalMemSetMem32 (
; IN VOID *Buffer,
; IN UINTN Count,
; IN UINT32 Value
; );
;------------------------------------------------------------------------------
InternalMemSetMem32 PROC USES rdi
mov rdi, rcx
mov rax, r8
xchg rcx, rdx
rep stosd
mov rax, rdx
ret
InternalMemSetMem32 ENDP
END

View File

@ -0,0 +1,43 @@
;------------------------------------------------------------------------------
;
; Copyright (c) 2006, 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.
;
; Module Name:
;
; SetMem64.Asm
;
; Abstract:
;
; SetMem64 function
;
; Notes:
;
;------------------------------------------------------------------------------
.code
;------------------------------------------------------------------------------
; VOID *
; InternalMemSetMem64 (
; IN VOID *Buffer,
; IN UINTN Count,
; IN UINT64 Value
; )
;------------------------------------------------------------------------------
InternalMemSetMem64 PROC USES rdi
mov rdi, rcx
mov rax, r8
xchg rcx, rdx
rep stosq
mov rax, rdx
ret
InternalMemSetMem64 ENDP
END

View File

@ -0,0 +1,47 @@
;------------------------------------------------------------------------------
;
; Copyright (c) 2006, 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.
;
; Module Name:
;
; ZeroMem.Asm
;
; Abstract:
;
; ZeroMem function
;
; Notes:
;
;------------------------------------------------------------------------------
.code
;------------------------------------------------------------------------------
; VOID *
; InternalMemZeroMem (
; IN VOID *Buffer,
; IN UINTN Count
; );
;------------------------------------------------------------------------------
InternalMemZeroMem PROC USES rdi
push rcx
xor rax, rax
mov rdi, rcx
mov rcx, rdx
shr rcx, 3
and rdx, 7
rep stosq
mov ecx, edx
rep stosb
pop rax
ret
InternalMemZeroMem ENDP
END