mirror of https://github.com/acidanthera/audk.git
Add some ldm/vldm optimized CopyMem routines. Add performance macros to BDS
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10388 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
d02b28d736
commit
d39eb83cc5
|
@ -0,0 +1,112 @@
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# CopyMem() worker for ARM
|
||||||
|
#
|
||||||
|
# This file started out as C code that did 64 bit moves if the buffer was
|
||||||
|
# 32-bit aligned, else it does a byte copy. It also does a byte copy for
|
||||||
|
# any trailing bytes. It was updated to do 32-byte copies using stm/ldm.
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008-2010 Apple Inc. All rights reserved.<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.
|
||||||
|
#
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
Copy Length bytes from Source to Destination. Overlap is OK.
|
||||||
|
|
||||||
|
This implementation
|
||||||
|
|
||||||
|
@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
|
||||||
|
)
|
||||||
|
**/
|
||||||
|
.text
|
||||||
|
.align 2
|
||||||
|
.globl ASM_PFX(InternalMemCopyMem)
|
||||||
|
|
||||||
|
ASM_PFX(InternalMemCopyMem):
|
||||||
|
stmfd sp!, {r4-r11, lr}
|
||||||
|
tst r0, #3
|
||||||
|
mov r11, r0
|
||||||
|
mov r10, r0
|
||||||
|
mov ip, r2
|
||||||
|
mov lr, r1
|
||||||
|
movne r0, #0
|
||||||
|
bne L4
|
||||||
|
tst r1, #3
|
||||||
|
movne r3, #0
|
||||||
|
moveq r3, #1
|
||||||
|
cmp r2, #31
|
||||||
|
movls r0, #0
|
||||||
|
andhi r0, r3, #1
|
||||||
|
L4:
|
||||||
|
cmp r11, r1
|
||||||
|
bcc L26
|
||||||
|
bls L7
|
||||||
|
rsb r3, r1, r11
|
||||||
|
cmp ip, r3
|
||||||
|
bcc L26
|
||||||
|
cmp ip, #0
|
||||||
|
beq L7
|
||||||
|
add r10, r11, ip
|
||||||
|
add lr, ip, r1
|
||||||
|
b L16
|
||||||
|
L29:
|
||||||
|
sub ip, ip, #8
|
||||||
|
cmp ip, #7
|
||||||
|
ldrd r2, [lr, #-8]!
|
||||||
|
movls r0, #0
|
||||||
|
cmp ip, #0
|
||||||
|
strd r2, [r10, #-8]!
|
||||||
|
beq L7
|
||||||
|
L16:
|
||||||
|
cmp r0, #0
|
||||||
|
bne L29
|
||||||
|
sub r3, lr, #1
|
||||||
|
sub ip, ip, #1
|
||||||
|
ldrb r3, [r3, #0]
|
||||||
|
sub r2, r10, #1
|
||||||
|
cmp ip, #0
|
||||||
|
sub r10, r10, #1
|
||||||
|
sub lr, lr, #1
|
||||||
|
strb r3, [r2, #0]
|
||||||
|
bne L16
|
||||||
|
b L7
|
||||||
|
L11:
|
||||||
|
ldrb r3, [lr], #1
|
||||||
|
sub ip, ip, #1
|
||||||
|
strb r3, [r10], #1
|
||||||
|
L26:
|
||||||
|
cmp ip, #0
|
||||||
|
beq L7
|
||||||
|
L30:
|
||||||
|
cmp r0, #0
|
||||||
|
beq L11
|
||||||
|
sub ip, ip, #32
|
||||||
|
cmp ip, #31
|
||||||
|
ldmia lr!, {r2-r9}
|
||||||
|
movls r0, #0
|
||||||
|
cmp ip, #0
|
||||||
|
stmia r10!, {r2-r9}
|
||||||
|
bne L30
|
||||||
|
L7:
|
||||||
|
mov r0, r11
|
||||||
|
ldmfd sp!, {r4-r11, pc}
|
||||||
|
|
|
@ -0,0 +1,114 @@
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
;
|
||||||
|
; CopyMem() worker for ARM
|
||||||
|
;
|
||||||
|
; This file started out as C code that did 64 bit moves if the buffer was
|
||||||
|
; 32-bit aligned, else it does a byte copy. It also does a byte copy for
|
||||||
|
; any trailing bytes. It was updated to do 32-byte copies using stm/ldm.
|
||||||
|
;
|
||||||
|
; Copyright (c) 2008-2010 Apple Inc. All rights reserved.<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.
|
||||||
|
;
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
Copy Length bytes from Source to Destination. Overlap is OK.
|
||||||
|
|
||||||
|
This implementation
|
||||||
|
|
||||||
|
@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
|
||||||
|
)
|
||||||
|
**/
|
||||||
|
EXPORT InternalMemCopyMem
|
||||||
|
|
||||||
|
AREA AsmMemStuff, CODE, READONLY
|
||||||
|
|
||||||
|
InternalMemCopyMem
|
||||||
|
stmfd sp!, {r4-r11, lr}
|
||||||
|
tst r0, #3
|
||||||
|
mov r11, r0
|
||||||
|
mov r10, r0
|
||||||
|
mov ip, r2
|
||||||
|
mov lr, r1
|
||||||
|
movne r0, #0
|
||||||
|
bne L4
|
||||||
|
tst r1, #3
|
||||||
|
movne r3, #0
|
||||||
|
moveq r3, #1
|
||||||
|
cmp r2, #31
|
||||||
|
movls r0, #0
|
||||||
|
andhi r0, r3, #1
|
||||||
|
L4
|
||||||
|
cmp r11, r1
|
||||||
|
bcc L26
|
||||||
|
bls L7
|
||||||
|
rsb r3, r1, r11
|
||||||
|
cmp ip, r3
|
||||||
|
bcc L26
|
||||||
|
cmp ip, #0
|
||||||
|
beq L7
|
||||||
|
add r10, r11, ip
|
||||||
|
add lr, ip, r1
|
||||||
|
b L16
|
||||||
|
L29
|
||||||
|
sub ip, ip, #8
|
||||||
|
cmp ip, #7
|
||||||
|
ldrd r2, [lr, #-8]!
|
||||||
|
movls r0, #0
|
||||||
|
cmp ip, #0
|
||||||
|
strd r2, [r10, #-8]!
|
||||||
|
beq L7
|
||||||
|
L16
|
||||||
|
cmp r0, #0
|
||||||
|
bne L29
|
||||||
|
sub r3, lr, #1
|
||||||
|
sub ip, ip, #1
|
||||||
|
ldrb r3, [r3, #0]
|
||||||
|
sub r2, r10, #1
|
||||||
|
cmp ip, #0
|
||||||
|
sub r10, r10, #1
|
||||||
|
sub lr, lr, #1
|
||||||
|
strb r3, [r2, #0]
|
||||||
|
bne L16
|
||||||
|
b L7
|
||||||
|
L11
|
||||||
|
ldrb r3, [lr], #1
|
||||||
|
sub ip, ip, #1
|
||||||
|
strb r3, [r10], #1
|
||||||
|
L26
|
||||||
|
cmp ip, #0
|
||||||
|
beq L7
|
||||||
|
L30
|
||||||
|
cmp r0, #0
|
||||||
|
beq L11
|
||||||
|
sub ip, ip, #32
|
||||||
|
cmp ip, #31
|
||||||
|
ldmia lr!, {r2-r9}
|
||||||
|
movls r0, #0
|
||||||
|
cmp ip, #0
|
||||||
|
stmia r10!, {r2-r9}
|
||||||
|
bne L30
|
||||||
|
L7
|
||||||
|
mov r0, r11
|
||||||
|
ldmfd sp!, {r4-r11, pc}
|
||||||
|
|
||||||
|
END
|
||||||
|
|
|
@ -0,0 +1,82 @@
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# SemMem() worker for ARM
|
||||||
|
#
|
||||||
|
# This file started out as C code that did 64 bit moves if the buffer was
|
||||||
|
# 32-bit aligned, else it does a byte copy. It also does a byte copy for
|
||||||
|
# any trailing bytes. It was updated to do 32-byte at a time.
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008-2010 Apple Inc. All rights reserved.<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.
|
||||||
|
#
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
Set Buffer to Value for Size bytes.
|
||||||
|
|
||||||
|
@param Buffer Memory to set.
|
||||||
|
@param Length 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
|
||||||
|
)
|
||||||
|
**/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.align 2
|
||||||
|
.globl ASM_PFX(InternalMemSetMem)
|
||||||
|
|
||||||
|
ASM_PFX(InternalMemSetMem):
|
||||||
|
stmfd sp!, {r4-r11, lr}
|
||||||
|
tst r0, #3
|
||||||
|
movne r3, #0
|
||||||
|
moveq r3, #1
|
||||||
|
cmp r1, #31
|
||||||
|
movls lr, #0
|
||||||
|
andhi lr, r3, #1
|
||||||
|
cmp lr, #0
|
||||||
|
mov r12, r0
|
||||||
|
bne L31
|
||||||
|
L32:
|
||||||
|
mov r3, #0
|
||||||
|
b L43
|
||||||
|
L31:
|
||||||
|
and r4, r2, #0xff
|
||||||
|
orr r4, r4, r4, LSL #8
|
||||||
|
orr r4, r4, r4, LSL #16
|
||||||
|
mov r5, r4
|
||||||
|
mov r5, r4
|
||||||
|
mov r6, r4
|
||||||
|
mov r7, r4
|
||||||
|
mov r8, r4
|
||||||
|
mov r9, r4
|
||||||
|
mov r10, r4
|
||||||
|
mov r11, r4
|
||||||
|
b L32
|
||||||
|
L34:
|
||||||
|
cmp lr, #0
|
||||||
|
streqb r2, [r12], #1
|
||||||
|
subeq r1, r1, #1
|
||||||
|
beq L43
|
||||||
|
sub r1, r1, #32
|
||||||
|
cmp r1, #31
|
||||||
|
movls lr, r3
|
||||||
|
stmia r12!, {r4-r11}
|
||||||
|
L43:
|
||||||
|
cmp r1, #0
|
||||||
|
bne L34
|
||||||
|
ldmfd sp!, {r4-r11, pc}
|
||||||
|
|
|
@ -0,0 +1,83 @@
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
;
|
||||||
|
; SetMem() worker for ARM
|
||||||
|
;
|
||||||
|
; This file started out as C code that did 64 bit moves if the buffer was
|
||||||
|
; 32-bit aligned, else it does a byte copy. It also does a byte copy for
|
||||||
|
; any trailing bytes. It was updated to do 32-byte at a time.
|
||||||
|
;
|
||||||
|
; Copyright (c) 2008-2010 Apple Inc. All rights reserved.<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.
|
||||||
|
;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Set Buffer to Value for Size bytes.
|
||||||
|
|
||||||
|
@param Buffer Memory to set.
|
||||||
|
@param Length 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
|
||||||
|
)
|
||||||
|
**/
|
||||||
|
|
||||||
|
EXPORT InternalMemSetMem
|
||||||
|
|
||||||
|
AREA AsmMemStuff, CODE, READONLY
|
||||||
|
|
||||||
|
InternalMemSetMem
|
||||||
|
stmfd sp!, {r4-r11, lr}
|
||||||
|
tst r0, #3
|
||||||
|
movne r3, #0
|
||||||
|
moveq r3, #1
|
||||||
|
cmp r1, #31
|
||||||
|
movls lr, #0
|
||||||
|
andhi lr, r3, #1
|
||||||
|
cmp lr, #0
|
||||||
|
mov r12, r0
|
||||||
|
bne L31
|
||||||
|
L32
|
||||||
|
mov r3, #0
|
||||||
|
b L43
|
||||||
|
L31
|
||||||
|
and r4, r2, #0xff
|
||||||
|
orr r4, r4, r4, LSL #8
|
||||||
|
orr r4, r4, r4, LSL #16
|
||||||
|
mov r5, r4
|
||||||
|
mov r5, r4
|
||||||
|
mov r6, r4
|
||||||
|
mov r7, r4
|
||||||
|
mov r8, r4
|
||||||
|
mov r9, r4
|
||||||
|
mov r10, r4
|
||||||
|
mov r11, r4
|
||||||
|
b L32
|
||||||
|
L34
|
||||||
|
cmp lr, #0
|
||||||
|
streqb r2, [r12], #1
|
||||||
|
subeq r1, r1, #1
|
||||||
|
beq L43
|
||||||
|
sub r1, r1, #32
|
||||||
|
cmp r1, #31
|
||||||
|
movls lr, r3
|
||||||
|
stmia r12!, {r4-r11}
|
||||||
|
L43
|
||||||
|
cmp r1, #0
|
||||||
|
bne L34
|
||||||
|
ldmfd sp!, {r4-r11, pc}
|
||||||
|
|
||||||
|
END
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
## @file
|
||||||
|
# Instance of Base Memory Library with some ARM ldm/stm assembly.
|
||||||
|
#
|
||||||
|
# This is a copy of the MdePkg BaseMemoryLib with the CopyMem and
|
||||||
|
# SetMem worker functions replaced with assembler that uses
|
||||||
|
# ldm/stm.
|
||||||
|
#
|
||||||
|
# Copyright (c) 2007 - 2010, Intel Corporation.
|
||||||
|
# Portions Copyright (c) 2010, Apple, Inc. All rights reserved.
|
||||||
|
#
|
||||||
|
# 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 = BaseMemoryLibStm
|
||||||
|
FILE_GUID = 4D466AF3-2380-448D-A337-E4033F29F3F7
|
||||||
|
MODULE_TYPE = BASE
|
||||||
|
VERSION_STRING = 1.0
|
||||||
|
LIBRARY_CLASS = BaseMemoryLib
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# VALID_ARCHITECTURES = ARM
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
[Sources.ARM]
|
||||||
|
ScanMem64Wrapper.c
|
||||||
|
ScanMem32Wrapper.c
|
||||||
|
ScanMem16Wrapper.c
|
||||||
|
ScanMem8Wrapper.c
|
||||||
|
ZeroMemWrapper.c
|
||||||
|
CompareMemWrapper.c
|
||||||
|
SetMem64Wrapper.c
|
||||||
|
SetMem32Wrapper.c
|
||||||
|
SetMem16Wrapper.c
|
||||||
|
SetMemWrapper.c
|
||||||
|
CopyMemWrapper.c
|
||||||
|
MemLibGeneric.c
|
||||||
|
MemLibGuid.c
|
||||||
|
MemLibInternals.h
|
||||||
|
Arm/CopyMem.asm
|
||||||
|
Arm/CopyMem.S
|
||||||
|
Arm/SetMem.asm
|
||||||
|
Arm/SetMem.S
|
||||||
|
|
||||||
|
|
||||||
|
[Packages]
|
||||||
|
MdePkg/MdePkg.dec
|
||||||
|
|
||||||
|
[LibraryClasses]
|
||||||
|
DebugLib
|
||||||
|
BaseLib
|
||||||
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
/** @file
|
||||||
|
CompareMem() implementation.
|
||||||
|
|
||||||
|
The following BaseMemoryLib instances contain the same copy of this file:
|
||||||
|
BaseMemoryLib
|
||||||
|
BaseMemoryLibMmx
|
||||||
|
BaseMemoryLibSse2
|
||||||
|
BaseMemoryLibRepStr
|
||||||
|
BaseMemoryLibOptDxe
|
||||||
|
BaseMemoryLibOptPei
|
||||||
|
PeiMemoryLib
|
||||||
|
UefiMemoryLib
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2009, 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#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, then ASSERT().
|
||||||
|
If Length > 0 and SourceBuffer is NULL, 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 || DestinationBuffer == SourceBuffer) {
|
||||||
|
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);
|
||||||
|
}
|
|
@ -0,0 +1,62 @@
|
||||||
|
/** @file
|
||||||
|
Implementation of the InternalMemCopyMem routine. This function is broken
|
||||||
|
out into its own source file so that it can be excluded from a build for a
|
||||||
|
particular platform easily if an optimized version is desired.
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2008, 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include "MemLibInternals.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
Copy Length bytes from Source to Destination.
|
||||||
|
|
||||||
|
@param DestinationBuffer Target of copy
|
||||||
|
@param SourceBuffer 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
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Declare the local variables that actually move the data elements as
|
||||||
|
// volatile to prevent the optimizer from replacing this function with
|
||||||
|
// the intrinsic memcpy()
|
||||||
|
//
|
||||||
|
volatile UINT8 *Destination8;
|
||||||
|
CONST UINT8 *Source8;
|
||||||
|
|
||||||
|
if (SourceBuffer > DestinationBuffer) {
|
||||||
|
Destination8 = (UINT8*)DestinationBuffer;
|
||||||
|
Source8 = (CONST UINT8*)SourceBuffer;
|
||||||
|
while (Length-- != 0) {
|
||||||
|
*(Destination8++) = *(Source8++);
|
||||||
|
}
|
||||||
|
} else if (SourceBuffer < DestinationBuffer) {
|
||||||
|
Destination8 = (UINT8*)DestinationBuffer + Length;
|
||||||
|
Source8 = (CONST UINT8*)SourceBuffer + Length;
|
||||||
|
while (Length-- != 0) {
|
||||||
|
*(--Destination8) = *(--Source8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return DestinationBuffer;
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
/** @file
|
||||||
|
CopyMem() implementation.
|
||||||
|
|
||||||
|
The following BaseMemoryLib instances contain the same copy of this file:
|
||||||
|
|
||||||
|
BaseMemoryLib
|
||||||
|
BaseMemoryLibMmx
|
||||||
|
BaseMemoryLibSse2
|
||||||
|
BaseMemoryLibRepStr
|
||||||
|
BaseMemoryLibOptDxe
|
||||||
|
BaseMemoryLibOptPei
|
||||||
|
PeiMemoryLib
|
||||||
|
UefiMemoryLib
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2009, 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#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);
|
||||||
|
}
|
|
@ -0,0 +1,260 @@
|
||||||
|
/** @file
|
||||||
|
Architecture Independent Base Memory Library Implementation.
|
||||||
|
|
||||||
|
The following BaseMemoryLib instances contain the same copy of this file:
|
||||||
|
BaseMemoryLib
|
||||||
|
PeiMemoryLib
|
||||||
|
UefiMemoryLib
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2009, 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#include "MemLibInternals.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
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 Count of 16-bit value 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
|
||||||
|
)
|
||||||
|
{
|
||||||
|
do {
|
||||||
|
((UINT16*)Buffer)[--Length] = Value;
|
||||||
|
} while (Length != 0);
|
||||||
|
return Buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
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 Count of 32-bit value 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
|
||||||
|
)
|
||||||
|
{
|
||||||
|
do {
|
||||||
|
((UINT32*)Buffer)[--Length] = Value;
|
||||||
|
} while (Length != 0);
|
||||||
|
return Buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
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 Count of 64-bit value 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
|
||||||
|
)
|
||||||
|
{
|
||||||
|
do {
|
||||||
|
((UINT64*)Buffer)[--Length] = Value;
|
||||||
|
} while (Length != 0);
|
||||||
|
return Buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Set Buffer to 0 for Size bytes.
|
||||||
|
|
||||||
|
@param Buffer Memory to set.
|
||||||
|
@param Length Number of bytes to set
|
||||||
|
|
||||||
|
@return Buffer
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID *
|
||||||
|
EFIAPI
|
||||||
|
InternalMemZeroMem (
|
||||||
|
OUT VOID *Buffer,
|
||||||
|
IN UINTN Length
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return InternalMemSetMem (Buffer, Length, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
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.
|
||||||
|
|
||||||
|
@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
|
||||||
|
InternalMemCompareMem (
|
||||||
|
IN CONST VOID *DestinationBuffer,
|
||||||
|
IN CONST VOID *SourceBuffer,
|
||||||
|
IN UINTN Length
|
||||||
|
)
|
||||||
|
{
|
||||||
|
while ((--Length != 0) &&
|
||||||
|
(*(INT8*)DestinationBuffer == *(INT8*)SourceBuffer)) {
|
||||||
|
DestinationBuffer = (INT8*)DestinationBuffer + 1;
|
||||||
|
SourceBuffer = (INT8*)SourceBuffer + 1;
|
||||||
|
}
|
||||||
|
return (INTN)*(UINT8*)DestinationBuffer - (INTN)*(UINT8*)SourceBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
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 Count of 8-bit value 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
|
||||||
|
)
|
||||||
|
{
|
||||||
|
CONST UINT8 *Pointer;
|
||||||
|
|
||||||
|
Pointer = (CONST UINT8*)Buffer;
|
||||||
|
do {
|
||||||
|
if (*(Pointer++) == Value) {
|
||||||
|
return Pointer;
|
||||||
|
}
|
||||||
|
} while (--Length != 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
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 Count of 16-bit value 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
|
||||||
|
)
|
||||||
|
{
|
||||||
|
CONST UINT16 *Pointer;
|
||||||
|
|
||||||
|
Pointer = (CONST UINT16*)Buffer;
|
||||||
|
do {
|
||||||
|
if (*(Pointer++) == Value) {
|
||||||
|
return Pointer;
|
||||||
|
}
|
||||||
|
} while (--Length != 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
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 Count of 32-bit value 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
|
||||||
|
)
|
||||||
|
{
|
||||||
|
CONST UINT32 *Pointer;
|
||||||
|
|
||||||
|
Pointer = (CONST UINT32*)Buffer;
|
||||||
|
do {
|
||||||
|
if (*(Pointer++) == Value) {
|
||||||
|
return Pointer;
|
||||||
|
}
|
||||||
|
} while (--Length != 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
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 Count of 64-bit value 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
|
||||||
|
)
|
||||||
|
{
|
||||||
|
CONST UINT64 *Pointer;
|
||||||
|
|
||||||
|
Pointer = (CONST UINT64*)Buffer;
|
||||||
|
do {
|
||||||
|
if (*(Pointer++) == Value) {
|
||||||
|
return Pointer;
|
||||||
|
}
|
||||||
|
} while (--Length != 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
|
@ -0,0 +1,142 @@
|
||||||
|
/** @file
|
||||||
|
Implementation of GUID functions.
|
||||||
|
|
||||||
|
The following BaseMemoryLib instances contain the same copy of this file:
|
||||||
|
|
||||||
|
BaseMemoryLib
|
||||||
|
BaseMemoryLibMmx
|
||||||
|
BaseMemoryLibSse2
|
||||||
|
BaseMemoryLibRepStr
|
||||||
|
BaseMemoryLibOptDxe
|
||||||
|
BaseMemoryLibOptPei
|
||||||
|
PeiMemoryLib
|
||||||
|
UefiMemoryLib
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2009, 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#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 the target 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;
|
||||||
|
}
|
|
@ -0,0 +1,234 @@
|
||||||
|
/** @file
|
||||||
|
Declaration of internal functions for Base Memory Library.
|
||||||
|
|
||||||
|
The following BaseMemoryLib instances contain the same copy of this file:
|
||||||
|
BaseMemoryLib
|
||||||
|
BaseMemoryLibMmx
|
||||||
|
BaseMemoryLibSse2
|
||||||
|
BaseMemoryLibRepStr
|
||||||
|
BaseMemoryLibOptDxe
|
||||||
|
BaseMemoryLibOptPei
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2009, 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 DestinationBuffer Target of copy
|
||||||
|
@param SourceBuffer 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 Length 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 Count of 16-bit value 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 Count of 32-bit value 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 Count of 64-bit value 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 Length 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.
|
||||||
|
|
||||||
|
@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
|
||||||
|
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 Count of 8-bit value 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 Count of 16-bit value 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 Count of 32-bit value 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 Count of 64-bit value 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
|
|
@ -0,0 +1,67 @@
|
||||||
|
/** @file
|
||||||
|
ScanMem16() implementation.
|
||||||
|
|
||||||
|
The following BaseMemoryLib instances contain the same copy of this file:
|
||||||
|
|
||||||
|
BaseMemoryLib
|
||||||
|
BaseMemoryLibMmx
|
||||||
|
BaseMemoryLibSse2
|
||||||
|
BaseMemoryLibRepStr
|
||||||
|
BaseMemoryLibOptDxe
|
||||||
|
BaseMemoryLibOptPei
|
||||||
|
PeiMemoryLib
|
||||||
|
UefiMemoryLib
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2009, 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#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 the target 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);
|
||||||
|
}
|
|
@ -0,0 +1,66 @@
|
||||||
|
/** @file
|
||||||
|
ScanMem32() implementation.
|
||||||
|
|
||||||
|
The following BaseMemoryLib instances contain the same copy of this file:
|
||||||
|
BaseMemoryLib
|
||||||
|
BaseMemoryLibMmx
|
||||||
|
BaseMemoryLibSse2
|
||||||
|
BaseMemoryLibRepStr
|
||||||
|
BaseMemoryLibOptDxe
|
||||||
|
BaseMemoryLibOptPei
|
||||||
|
PeiMemoryLib
|
||||||
|
UefiMemoryLib
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2009, 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#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 the target 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);
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
/** @file
|
||||||
|
ScanMem64() implementation.
|
||||||
|
|
||||||
|
The following BaseMemoryLib instances contain the same copy of this file:
|
||||||
|
|
||||||
|
BaseMemoryLib
|
||||||
|
BaseMemoryLibMmx
|
||||||
|
BaseMemoryLibSse2
|
||||||
|
BaseMemoryLibRepStr
|
||||||
|
BaseMemoryLibOptDxe
|
||||||
|
BaseMemoryLibOptPei
|
||||||
|
PeiMemoryLib
|
||||||
|
UefiMemoryLib
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2009, 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#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 the target 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);
|
||||||
|
}
|
|
@ -0,0 +1,99 @@
|
||||||
|
/** @file
|
||||||
|
ScanMem8() and ScanMemN() implementation.
|
||||||
|
|
||||||
|
The following BaseMemoryLib instances contain the same copy of this file:
|
||||||
|
|
||||||
|
BaseMemoryLib
|
||||||
|
BaseMemoryLibMmx
|
||||||
|
BaseMemoryLibSse2
|
||||||
|
BaseMemoryLibRepStr
|
||||||
|
BaseMemoryLibOptDxe
|
||||||
|
BaseMemoryLibOptPei
|
||||||
|
PeiMemoryLib
|
||||||
|
UefiMemoryLib
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2009, 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#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 the target 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Scans a target buffer for a UINTN sized value, and returns a pointer to the matching
|
||||||
|
UINTN sized value in the target buffer.
|
||||||
|
|
||||||
|
This function searches the target buffer specified by Buffer and Length from the lowest
|
||||||
|
address to the highest address for a UINTN sized 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 UINTN boundary, then ASSERT().
|
||||||
|
If Length is not aligned on a UINTN 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
|
||||||
|
ScanMemN (
|
||||||
|
IN CONST VOID *Buffer,
|
||||||
|
IN UINTN Length,
|
||||||
|
IN UINTN Value
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (sizeof (UINTN) == sizeof (UINT64)) {
|
||||||
|
return ScanMem64 (Buffer, Length, (UINT64)Value);
|
||||||
|
} else {
|
||||||
|
return ScanMem32 (Buffer, Length, (UINT32)Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
/** @file
|
||||||
|
Implementation of the EfiSetMem routine. This function is broken
|
||||||
|
out into its own source file so that it can be excluded from a
|
||||||
|
build for a particular platform easily if an optimized version
|
||||||
|
is desired.
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2010, 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include "MemLibInternals.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
Set Buffer to Value for Size bytes.
|
||||||
|
|
||||||
|
@param Buffer Memory to set.
|
||||||
|
@param Length 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
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Declare the local variables that actually move the data elements as
|
||||||
|
// volatile to prevent the optimizer from replacing this function with
|
||||||
|
// the intrinsic memset()
|
||||||
|
//
|
||||||
|
volatile UINT8 *Pointer;
|
||||||
|
|
||||||
|
Pointer = (UINT8*)Buffer;
|
||||||
|
while (Length-- > 0) {
|
||||||
|
*(Pointer++) = Value;
|
||||||
|
}
|
||||||
|
return Buffer;
|
||||||
|
}
|
|
@ -0,0 +1,64 @@
|
||||||
|
/** @file
|
||||||
|
SetMem16() implementation.
|
||||||
|
|
||||||
|
The following BaseMemoryLib instances contain the same copy of this file:
|
||||||
|
BaseMemoryLib
|
||||||
|
BaseMemoryLibMmx
|
||||||
|
BaseMemoryLibSse2
|
||||||
|
BaseMemoryLibRepStr
|
||||||
|
BaseMemoryLibOptDxe
|
||||||
|
BaseMemoryLibOptPei
|
||||||
|
PeiMemoryLib
|
||||||
|
UefiMemoryLib
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2009, 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#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);
|
||||||
|
}
|
|
@ -0,0 +1,64 @@
|
||||||
|
/** @file
|
||||||
|
SetMem32() implementation.
|
||||||
|
|
||||||
|
The following BaseMemoryLib instances contain the same copy of this file:
|
||||||
|
BaseMemoryLib
|
||||||
|
BaseMemoryLibMmx
|
||||||
|
BaseMemoryLibSse2
|
||||||
|
BaseMemoryLibRepStr
|
||||||
|
BaseMemoryLibOptDxe
|
||||||
|
BaseMemoryLibOptPei
|
||||||
|
PeiMemoryLib
|
||||||
|
UefiMemoryLib
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2009, 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#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);
|
||||||
|
}
|
|
@ -0,0 +1,64 @@
|
||||||
|
/** @file
|
||||||
|
SetMem64() implementation.
|
||||||
|
|
||||||
|
The following BaseMemoryLib instances contain the same copy of this file:
|
||||||
|
BaseMemoryLib
|
||||||
|
BaseMemoryLibMmx
|
||||||
|
BaseMemoryLibSse2
|
||||||
|
BaseMemoryLibRepStr
|
||||||
|
BaseMemoryLibOptDxe
|
||||||
|
BaseMemoryLibOptPei
|
||||||
|
PeiMemoryLib
|
||||||
|
UefiMemoryLib
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2009, 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#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);
|
||||||
|
}
|
|
@ -0,0 +1,91 @@
|
||||||
|
/** @file
|
||||||
|
SetMem() and SetMemN() implementation.
|
||||||
|
|
||||||
|
The following BaseMemoryLib instances contain the same copy of this file:
|
||||||
|
|
||||||
|
BaseMemoryLib
|
||||||
|
BaseMemoryLibMmx
|
||||||
|
BaseMemoryLibSse2
|
||||||
|
BaseMemoryLibRepStr
|
||||||
|
BaseMemoryLibOptDxe
|
||||||
|
BaseMemoryLibOptPei
|
||||||
|
PeiMemoryLib
|
||||||
|
UefiMemoryLib
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2009, 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#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 with which to fill Length bytes of Buffer.
|
||||||
|
|
||||||
|
@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);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Fills a target buffer with a value that is size UINTN, and returns the target buffer.
|
||||||
|
|
||||||
|
This function fills Length bytes of Buffer with the UINTN sized value specified by
|
||||||
|
Value, and returns Buffer. Value is repeated every sizeof(UINTN) bytes 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 UINTN boundary, then ASSERT().
|
||||||
|
If Length is not aligned on a UINTN 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
|
||||||
|
SetMemN (
|
||||||
|
OUT VOID *Buffer,
|
||||||
|
IN UINTN Length,
|
||||||
|
IN UINTN Value
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (sizeof (UINTN) == sizeof (UINT64)) {
|
||||||
|
return SetMem64 (Buffer, Length, (UINT64)Value);
|
||||||
|
} else {
|
||||||
|
return SetMem32 (Buffer, Length, (UINT32)Value);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
/** @file
|
||||||
|
ZeroMem() implementation.
|
||||||
|
|
||||||
|
The following BaseMemoryLib instances contain the same copy of this file:
|
||||||
|
|
||||||
|
BaseMemoryLib
|
||||||
|
BaseMemoryLibMmx
|
||||||
|
BaseMemoryLibSse2
|
||||||
|
BaseMemoryLibRepStr
|
||||||
|
BaseMemoryLibOptDxe
|
||||||
|
BaseMemoryLibOptPei
|
||||||
|
PeiMemoryLib
|
||||||
|
UefiMemoryLib
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2009 , 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#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);
|
||||||
|
}
|
|
@ -0,0 +1,114 @@
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# CopyMem() worker for ARM
|
||||||
|
#
|
||||||
|
# This file started out as C code that did 64 bit moves if the buffer was
|
||||||
|
# 32-bit aligned, else it does a byte copy. It also does a byte copy for
|
||||||
|
# any trailing bytes. Update using VSTM/SLDM to do 128 byte copies.
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008-2010 Apple Inc. All rights reserved.<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.
|
||||||
|
#
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
Copy Length bytes from Source to Destination. Overlap is OK.
|
||||||
|
|
||||||
|
This implementation
|
||||||
|
|
||||||
|
@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
|
||||||
|
)
|
||||||
|
**/
|
||||||
|
.text
|
||||||
|
.align 2
|
||||||
|
.globl ASM_PFX(InternalMemCopyMem)
|
||||||
|
|
||||||
|
ASM_PFX(InternalMemCopyMem):
|
||||||
|
stmfd sp!, {r4, r9, lr}
|
||||||
|
tst r0, #3
|
||||||
|
mov r4, r0
|
||||||
|
mov r9, r0
|
||||||
|
mov ip, r2
|
||||||
|
mov lr, r1
|
||||||
|
movne r0, #0
|
||||||
|
bne L4
|
||||||
|
tst r1, #3
|
||||||
|
movne r3, #0
|
||||||
|
moveq r3, #1
|
||||||
|
cmp r2, #127
|
||||||
|
movls r0, #0
|
||||||
|
andhi r0, r3, #1
|
||||||
|
L4:
|
||||||
|
cmp r4, r1
|
||||||
|
bcc L26
|
||||||
|
bls L7
|
||||||
|
rsb r3, r1, r4
|
||||||
|
cmp ip, r3
|
||||||
|
bcc L26
|
||||||
|
cmp ip, #0
|
||||||
|
beq L7
|
||||||
|
add r9, r4, ip
|
||||||
|
add lr, ip, r1
|
||||||
|
b L16
|
||||||
|
L29:
|
||||||
|
sub ip, ip, #8
|
||||||
|
cmp ip, #7
|
||||||
|
ldrd r2, [lr, #-8]!
|
||||||
|
movls r0, #0
|
||||||
|
cmp ip, #0
|
||||||
|
strd r2, [r9, #-8]!
|
||||||
|
beq L7
|
||||||
|
L16:
|
||||||
|
cmp r0, #0
|
||||||
|
bne L29
|
||||||
|
sub r3, lr, #1
|
||||||
|
sub ip, ip, #1
|
||||||
|
ldrb r3, [r3, #0]
|
||||||
|
sub r2, r9, #1
|
||||||
|
cmp ip, #0
|
||||||
|
sub r9, r9, #1
|
||||||
|
sub lr, lr, #1
|
||||||
|
strb r3, [r2, #0]
|
||||||
|
bne L16
|
||||||
|
b L7
|
||||||
|
L11:
|
||||||
|
ldrb r3, [lr], #1
|
||||||
|
sub ip, ip, #1
|
||||||
|
strb r3, [r9], #1
|
||||||
|
L26:
|
||||||
|
cmp ip, #0
|
||||||
|
beq L7
|
||||||
|
L30:
|
||||||
|
cmp r0, #0
|
||||||
|
beq L11
|
||||||
|
sub ip, ip, #128 // 32
|
||||||
|
cmp ip, #127 // 31
|
||||||
|
vldm lr!, {d0-d15}
|
||||||
|
movls r0, #0
|
||||||
|
cmp ip, #0
|
||||||
|
vstm r9!, {d0-d15}
|
||||||
|
bne L30
|
||||||
|
L7:
|
||||||
|
dsb
|
||||||
|
mov r0, r4
|
||||||
|
ldmfd sp!, {r4, r9, pc}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,115 @@
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
;
|
||||||
|
; CopyMem() worker for ARM
|
||||||
|
;
|
||||||
|
; This file started out as C code that did 64 bit moves if the buffer was
|
||||||
|
; 32-bit aligned, else it does a byte copy. It also does a byte copy for
|
||||||
|
; any trailing bytes. Update using VSTM/SLDM to do 128 byte copies.
|
||||||
|
;
|
||||||
|
; Copyright (c) 2008-2010 Apple Inc. All rights reserved.<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.
|
||||||
|
;
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
Copy Length bytes from Source to Destination. Overlap is OK.
|
||||||
|
|
||||||
|
This implementation
|
||||||
|
|
||||||
|
@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
|
||||||
|
)
|
||||||
|
**/
|
||||||
|
EXPORT InternalMemCopyMem
|
||||||
|
|
||||||
|
AREA AsmMemStuff, CODE, READONLY
|
||||||
|
|
||||||
|
InternalMemCopyMem
|
||||||
|
stmfd sp!, {r4, r9, lr}
|
||||||
|
tst r0, #3
|
||||||
|
mov r4, r0
|
||||||
|
mov r9, r0
|
||||||
|
mov ip, r2
|
||||||
|
mov lr, r1
|
||||||
|
movne r0, #0
|
||||||
|
bne L4
|
||||||
|
tst r1, #3
|
||||||
|
movne r3, #0
|
||||||
|
moveq r3, #1
|
||||||
|
cmp r2, #127
|
||||||
|
movls r0, #0
|
||||||
|
andhi r0, r3, #1
|
||||||
|
L4
|
||||||
|
cmp r4, r1
|
||||||
|
bcc L26
|
||||||
|
bls L7
|
||||||
|
rsb r3, r1, r4
|
||||||
|
cmp ip, r3
|
||||||
|
bcc L26
|
||||||
|
cmp ip, #0
|
||||||
|
beq L7
|
||||||
|
add r9, r4, ip
|
||||||
|
add lr, ip, r1
|
||||||
|
b L16
|
||||||
|
L29
|
||||||
|
sub ip, ip, #8
|
||||||
|
cmp ip, #7
|
||||||
|
ldrd r2, [lr, #-8]!
|
||||||
|
movls r0, #0
|
||||||
|
cmp ip, #0
|
||||||
|
strd r2, [r9, #-8]!
|
||||||
|
beq L7
|
||||||
|
L16
|
||||||
|
cmp r0, #0
|
||||||
|
bne L29
|
||||||
|
sub r3, lr, #1
|
||||||
|
sub ip, ip, #1
|
||||||
|
ldrb r3, [r3, #0]
|
||||||
|
sub r2, r9, #1
|
||||||
|
cmp ip, #0
|
||||||
|
sub r9, r9, #1
|
||||||
|
sub lr, lr, #1
|
||||||
|
strb r3, [r2, #0]
|
||||||
|
bne L16
|
||||||
|
b L7
|
||||||
|
L11
|
||||||
|
ldrb r3, [lr], #1
|
||||||
|
sub ip, ip, #1
|
||||||
|
strb r3, [r9], #1
|
||||||
|
L26
|
||||||
|
cmp ip, #0
|
||||||
|
beq L7
|
||||||
|
L30
|
||||||
|
cmp r0, #0
|
||||||
|
beq L11
|
||||||
|
sub ip, ip, #128 // 32
|
||||||
|
cmp ip, #127 // 31
|
||||||
|
vldm lr!, {d0-d15}
|
||||||
|
movls r0, #0
|
||||||
|
cmp ip, #0
|
||||||
|
vstm r9!, {d0-d15}
|
||||||
|
bne L30
|
||||||
|
L7
|
||||||
|
dsb
|
||||||
|
mov r0, r4
|
||||||
|
ldmfd sp!, {r4, r9, pc}
|
||||||
|
|
||||||
|
END
|
||||||
|
|
|
@ -0,0 +1,80 @@
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# SemMem() worker for ARM
|
||||||
|
#
|
||||||
|
# This file started out as C code that did 64 bit moves if the buffer was
|
||||||
|
# 32-bit aligned, else it does a byte copy. It also does a byte copy for
|
||||||
|
# any trailing bytes. Update to use VSTM/VLDM to do 128 byte writes.
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008-2010 Apple Inc. All rights reserved.<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.
|
||||||
|
#
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
Set Buffer to Value for Size bytes.
|
||||||
|
|
||||||
|
@param Buffer Memory to set.
|
||||||
|
@param Length 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
|
||||||
|
)
|
||||||
|
**/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.align 2
|
||||||
|
.globl ASM_PFX(InternalMemSetMem)
|
||||||
|
|
||||||
|
ASM_PFX(InternalMemSetMem):
|
||||||
|
stmfd sp!, {r4-r7, lr}
|
||||||
|
tst r0, #3
|
||||||
|
movne r3, #0
|
||||||
|
moveq r3, #1
|
||||||
|
cmp r1, #127
|
||||||
|
movls lr, #0
|
||||||
|
andhi lr, r3, #1
|
||||||
|
cmp lr, #0
|
||||||
|
mov r12, r0
|
||||||
|
bne L31
|
||||||
|
L32:
|
||||||
|
mov r3, #0
|
||||||
|
b L43
|
||||||
|
L31:
|
||||||
|
vdup.8 q0,r2
|
||||||
|
vmov q1,q0
|
||||||
|
vmov q2,q0
|
||||||
|
vmov q3,q0
|
||||||
|
vmov q4,q0
|
||||||
|
vmov q5,q0
|
||||||
|
vmov q6,q0
|
||||||
|
vmov q7,q0
|
||||||
|
b L32
|
||||||
|
L34:
|
||||||
|
cmp lr, #0
|
||||||
|
streqb r2, [r12], #1
|
||||||
|
subeq r1, r1, #1
|
||||||
|
beq L43
|
||||||
|
sub r1, r1, #128
|
||||||
|
cmp r1, #127
|
||||||
|
cmp r1, #31
|
||||||
|
movls lr, r3
|
||||||
|
vstm r12!, {d0-d15}
|
||||||
|
L43:
|
||||||
|
cmp r1, #0
|
||||||
|
bne L34
|
||||||
|
ldmfd sp!, {pc}
|
||||||
|
|
|
@ -0,0 +1,80 @@
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
;
|
||||||
|
; SetMem() worker for ARM
|
||||||
|
;
|
||||||
|
; This file started out as C code that did 64 bit moves if the buffer was
|
||||||
|
; 32-bit aligned, else it does a byte copy. It also does a byte copy for
|
||||||
|
; any trailing bytes. Update to use VSTM/VLDM to do 128 byte writes.
|
||||||
|
;
|
||||||
|
; Copyright (c) 2008-2010 Apple Inc. All rights reserved.<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.
|
||||||
|
;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Set Buffer to Value for Size bytes.
|
||||||
|
|
||||||
|
@param Buffer Memory to set.
|
||||||
|
@param Length 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
|
||||||
|
)
|
||||||
|
**/
|
||||||
|
|
||||||
|
EXPORT InternalMemSetMem
|
||||||
|
|
||||||
|
AREA AsmMemStuff, CODE, READONLY
|
||||||
|
|
||||||
|
InternalMemSetMem
|
||||||
|
stmfd sp!, {lr}
|
||||||
|
tst r0, #3
|
||||||
|
movne r3, #0
|
||||||
|
moveq r3, #1
|
||||||
|
cmp r1, #127
|
||||||
|
movls lr, #0
|
||||||
|
andhi lr, r3, #1
|
||||||
|
cmp lr, #0
|
||||||
|
mov r12, r0
|
||||||
|
bne L31
|
||||||
|
L32
|
||||||
|
mov r3, #0
|
||||||
|
b L43
|
||||||
|
L31
|
||||||
|
vdup.8 q0,r2
|
||||||
|
vmov q1,q0
|
||||||
|
vmov q2,q0
|
||||||
|
vmov q3,q0
|
||||||
|
vmov q4,q0
|
||||||
|
vmov q5,q0
|
||||||
|
vmov q6,q0
|
||||||
|
vmov q7,q0
|
||||||
|
b L32
|
||||||
|
L34
|
||||||
|
cmp lr, #0
|
||||||
|
streqb r2, [r12], #1
|
||||||
|
subeq r1, r1, #1
|
||||||
|
beq L43
|
||||||
|
sub r1, r1, #128
|
||||||
|
cmp r1, #127
|
||||||
|
movls lr, r3
|
||||||
|
vstm r12!, {d0-d15}
|
||||||
|
L43
|
||||||
|
cmp r1, #0
|
||||||
|
bne L34
|
||||||
|
ldmfd sp!, {pc}
|
||||||
|
|
||||||
|
END
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
## @file
|
||||||
|
# Instance of Base Memory Library with some ARM vldm/vstm assembly.
|
||||||
|
#
|
||||||
|
# This is a copy of the MdePkg BaseMemoryLib with the CopyMem and
|
||||||
|
# SetMem worker functions replaced with assembler that uses
|
||||||
|
# vldm/vstm (part of NEON SIMD, optional in ARMv7-A).
|
||||||
|
#
|
||||||
|
# Note: You need to enable NEON in SEC to use this library
|
||||||
|
# // Enable NEON register in case folks want to use them for optimizations (CopyMem)
|
||||||
|
# mrc p15, 0, r0, c1, c0, 2
|
||||||
|
# orr r0, r0, #0x00f00000 // Enable VPF access (V* instructions)
|
||||||
|
# mcr p15, 0, r0, c1, c0, 2
|
||||||
|
# mov r0, #0x40000000 // Set EN bit in FPEXC
|
||||||
|
# msr FPEXC,r0
|
||||||
|
#
|
||||||
|
# Copyright (c) 2007 - 2010, Intel Corporation.
|
||||||
|
# Portions Copyright (c) 2010, Apple, Inc. All rights reserved.
|
||||||
|
#
|
||||||
|
# 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 = BaseMemoryLibVstm
|
||||||
|
FILE_GUID = 09EE1E8D-7A2E-4573-8117-68A18569C1F5
|
||||||
|
MODULE_TYPE = BASE
|
||||||
|
VERSION_STRING = 1.0
|
||||||
|
LIBRARY_CLASS = BaseMemoryLib
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# VALID_ARCHITECTURES = ARM
|
||||||
|
#
|
||||||
|
|
||||||
|
[Sources.ARM]
|
||||||
|
ScanMem64Wrapper.c
|
||||||
|
ScanMem32Wrapper.c
|
||||||
|
ScanMem16Wrapper.c
|
||||||
|
ScanMem8Wrapper.c
|
||||||
|
ZeroMemWrapper.c
|
||||||
|
CompareMemWrapper.c
|
||||||
|
SetMem64Wrapper.c
|
||||||
|
SetMem32Wrapper.c
|
||||||
|
SetMem16Wrapper.c
|
||||||
|
SetMemWrapper.c
|
||||||
|
CopyMemWrapper.c
|
||||||
|
MemLibGeneric.c
|
||||||
|
MemLibGuid.c
|
||||||
|
MemLibInternals.h
|
||||||
|
Arm/CopyMem.asm
|
||||||
|
Arm/CopyMem.S
|
||||||
|
Arm/SetMem.asm
|
||||||
|
Arm/SetMem.S
|
||||||
|
|
||||||
|
|
||||||
|
[Packages]
|
||||||
|
MdePkg/MdePkg.dec
|
||||||
|
|
||||||
|
[LibraryClasses]
|
||||||
|
DebugLib
|
||||||
|
BaseLib
|
||||||
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
/** @file
|
||||||
|
CompareMem() implementation.
|
||||||
|
|
||||||
|
The following BaseMemoryLib instances contain the same copy of this file:
|
||||||
|
BaseMemoryLib
|
||||||
|
BaseMemoryLibMmx
|
||||||
|
BaseMemoryLibSse2
|
||||||
|
BaseMemoryLibRepStr
|
||||||
|
BaseMemoryLibOptDxe
|
||||||
|
BaseMemoryLibOptPei
|
||||||
|
PeiMemoryLib
|
||||||
|
UefiMemoryLib
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2009, 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#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, then ASSERT().
|
||||||
|
If Length > 0 and SourceBuffer is NULL, 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 || DestinationBuffer == SourceBuffer) {
|
||||||
|
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);
|
||||||
|
}
|
|
@ -0,0 +1,62 @@
|
||||||
|
/** @file
|
||||||
|
Implementation of the InternalMemCopyMem routine. This function is broken
|
||||||
|
out into its own source file so that it can be excluded from a build for a
|
||||||
|
particular platform easily if an optimized version is desired.
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2008, 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include "MemLibInternals.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
Copy Length bytes from Source to Destination.
|
||||||
|
|
||||||
|
@param DestinationBuffer Target of copy
|
||||||
|
@param SourceBuffer 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
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Declare the local variables that actually move the data elements as
|
||||||
|
// volatile to prevent the optimizer from replacing this function with
|
||||||
|
// the intrinsic memcpy()
|
||||||
|
//
|
||||||
|
volatile UINT8 *Destination8;
|
||||||
|
CONST UINT8 *Source8;
|
||||||
|
|
||||||
|
if (SourceBuffer > DestinationBuffer) {
|
||||||
|
Destination8 = (UINT8*)DestinationBuffer;
|
||||||
|
Source8 = (CONST UINT8*)SourceBuffer;
|
||||||
|
while (Length-- != 0) {
|
||||||
|
*(Destination8++) = *(Source8++);
|
||||||
|
}
|
||||||
|
} else if (SourceBuffer < DestinationBuffer) {
|
||||||
|
Destination8 = (UINT8*)DestinationBuffer + Length;
|
||||||
|
Source8 = (CONST UINT8*)SourceBuffer + Length;
|
||||||
|
while (Length-- != 0) {
|
||||||
|
*(--Destination8) = *(--Source8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return DestinationBuffer;
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
/** @file
|
||||||
|
CopyMem() implementation.
|
||||||
|
|
||||||
|
The following BaseMemoryLib instances contain the same copy of this file:
|
||||||
|
|
||||||
|
BaseMemoryLib
|
||||||
|
BaseMemoryLibMmx
|
||||||
|
BaseMemoryLibSse2
|
||||||
|
BaseMemoryLibRepStr
|
||||||
|
BaseMemoryLibOptDxe
|
||||||
|
BaseMemoryLibOptPei
|
||||||
|
PeiMemoryLib
|
||||||
|
UefiMemoryLib
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2009, 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#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);
|
||||||
|
}
|
|
@ -0,0 +1,260 @@
|
||||||
|
/** @file
|
||||||
|
Architecture Independent Base Memory Library Implementation.
|
||||||
|
|
||||||
|
The following BaseMemoryLib instances contain the same copy of this file:
|
||||||
|
BaseMemoryLib
|
||||||
|
PeiMemoryLib
|
||||||
|
UefiMemoryLib
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2009, 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#include "MemLibInternals.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
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 Count of 16-bit value 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
|
||||||
|
)
|
||||||
|
{
|
||||||
|
do {
|
||||||
|
((UINT16*)Buffer)[--Length] = Value;
|
||||||
|
} while (Length != 0);
|
||||||
|
return Buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
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 Count of 32-bit value 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
|
||||||
|
)
|
||||||
|
{
|
||||||
|
do {
|
||||||
|
((UINT32*)Buffer)[--Length] = Value;
|
||||||
|
} while (Length != 0);
|
||||||
|
return Buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
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 Count of 64-bit value 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
|
||||||
|
)
|
||||||
|
{
|
||||||
|
do {
|
||||||
|
((UINT64*)Buffer)[--Length] = Value;
|
||||||
|
} while (Length != 0);
|
||||||
|
return Buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Set Buffer to 0 for Size bytes.
|
||||||
|
|
||||||
|
@param Buffer Memory to set.
|
||||||
|
@param Length Number of bytes to set
|
||||||
|
|
||||||
|
@return Buffer
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID *
|
||||||
|
EFIAPI
|
||||||
|
InternalMemZeroMem (
|
||||||
|
OUT VOID *Buffer,
|
||||||
|
IN UINTN Length
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return InternalMemSetMem (Buffer, Length, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
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.
|
||||||
|
|
||||||
|
@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
|
||||||
|
InternalMemCompareMem (
|
||||||
|
IN CONST VOID *DestinationBuffer,
|
||||||
|
IN CONST VOID *SourceBuffer,
|
||||||
|
IN UINTN Length
|
||||||
|
)
|
||||||
|
{
|
||||||
|
while ((--Length != 0) &&
|
||||||
|
(*(INT8*)DestinationBuffer == *(INT8*)SourceBuffer)) {
|
||||||
|
DestinationBuffer = (INT8*)DestinationBuffer + 1;
|
||||||
|
SourceBuffer = (INT8*)SourceBuffer + 1;
|
||||||
|
}
|
||||||
|
return (INTN)*(UINT8*)DestinationBuffer - (INTN)*(UINT8*)SourceBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
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 Count of 8-bit value 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
|
||||||
|
)
|
||||||
|
{
|
||||||
|
CONST UINT8 *Pointer;
|
||||||
|
|
||||||
|
Pointer = (CONST UINT8*)Buffer;
|
||||||
|
do {
|
||||||
|
if (*(Pointer++) == Value) {
|
||||||
|
return Pointer;
|
||||||
|
}
|
||||||
|
} while (--Length != 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
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 Count of 16-bit value 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
|
||||||
|
)
|
||||||
|
{
|
||||||
|
CONST UINT16 *Pointer;
|
||||||
|
|
||||||
|
Pointer = (CONST UINT16*)Buffer;
|
||||||
|
do {
|
||||||
|
if (*(Pointer++) == Value) {
|
||||||
|
return Pointer;
|
||||||
|
}
|
||||||
|
} while (--Length != 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
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 Count of 32-bit value 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
|
||||||
|
)
|
||||||
|
{
|
||||||
|
CONST UINT32 *Pointer;
|
||||||
|
|
||||||
|
Pointer = (CONST UINT32*)Buffer;
|
||||||
|
do {
|
||||||
|
if (*(Pointer++) == Value) {
|
||||||
|
return Pointer;
|
||||||
|
}
|
||||||
|
} while (--Length != 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
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 Count of 64-bit value 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
|
||||||
|
)
|
||||||
|
{
|
||||||
|
CONST UINT64 *Pointer;
|
||||||
|
|
||||||
|
Pointer = (CONST UINT64*)Buffer;
|
||||||
|
do {
|
||||||
|
if (*(Pointer++) == Value) {
|
||||||
|
return Pointer;
|
||||||
|
}
|
||||||
|
} while (--Length != 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
|
@ -0,0 +1,142 @@
|
||||||
|
/** @file
|
||||||
|
Implementation of GUID functions.
|
||||||
|
|
||||||
|
The following BaseMemoryLib instances contain the same copy of this file:
|
||||||
|
|
||||||
|
BaseMemoryLib
|
||||||
|
BaseMemoryLibMmx
|
||||||
|
BaseMemoryLibSse2
|
||||||
|
BaseMemoryLibRepStr
|
||||||
|
BaseMemoryLibOptDxe
|
||||||
|
BaseMemoryLibOptPei
|
||||||
|
PeiMemoryLib
|
||||||
|
UefiMemoryLib
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2009, 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#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 the target 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;
|
||||||
|
}
|
|
@ -0,0 +1,234 @@
|
||||||
|
/** @file
|
||||||
|
Declaration of internal functions for Base Memory Library.
|
||||||
|
|
||||||
|
The following BaseMemoryLib instances contain the same copy of this file:
|
||||||
|
BaseMemoryLib
|
||||||
|
BaseMemoryLibMmx
|
||||||
|
BaseMemoryLibSse2
|
||||||
|
BaseMemoryLibRepStr
|
||||||
|
BaseMemoryLibOptDxe
|
||||||
|
BaseMemoryLibOptPei
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2009, 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 DestinationBuffer Target of copy
|
||||||
|
@param SourceBuffer 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 Length 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 Count of 16-bit value 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 Count of 32-bit value 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 Count of 64-bit value 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 Length 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.
|
||||||
|
|
||||||
|
@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
|
||||||
|
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 Count of 8-bit value 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 Count of 16-bit value 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 Count of 32-bit value 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 Count of 64-bit value 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
|
|
@ -0,0 +1,67 @@
|
||||||
|
/** @file
|
||||||
|
ScanMem16() implementation.
|
||||||
|
|
||||||
|
The following BaseMemoryLib instances contain the same copy of this file:
|
||||||
|
|
||||||
|
BaseMemoryLib
|
||||||
|
BaseMemoryLibMmx
|
||||||
|
BaseMemoryLibSse2
|
||||||
|
BaseMemoryLibRepStr
|
||||||
|
BaseMemoryLibOptDxe
|
||||||
|
BaseMemoryLibOptPei
|
||||||
|
PeiMemoryLib
|
||||||
|
UefiMemoryLib
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2009, 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#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 the target 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);
|
||||||
|
}
|
|
@ -0,0 +1,66 @@
|
||||||
|
/** @file
|
||||||
|
ScanMem32() implementation.
|
||||||
|
|
||||||
|
The following BaseMemoryLib instances contain the same copy of this file:
|
||||||
|
BaseMemoryLib
|
||||||
|
BaseMemoryLibMmx
|
||||||
|
BaseMemoryLibSse2
|
||||||
|
BaseMemoryLibRepStr
|
||||||
|
BaseMemoryLibOptDxe
|
||||||
|
BaseMemoryLibOptPei
|
||||||
|
PeiMemoryLib
|
||||||
|
UefiMemoryLib
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2009, 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#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 the target 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);
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
/** @file
|
||||||
|
ScanMem64() implementation.
|
||||||
|
|
||||||
|
The following BaseMemoryLib instances contain the same copy of this file:
|
||||||
|
|
||||||
|
BaseMemoryLib
|
||||||
|
BaseMemoryLibMmx
|
||||||
|
BaseMemoryLibSse2
|
||||||
|
BaseMemoryLibRepStr
|
||||||
|
BaseMemoryLibOptDxe
|
||||||
|
BaseMemoryLibOptPei
|
||||||
|
PeiMemoryLib
|
||||||
|
UefiMemoryLib
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2009, 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#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 the target 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);
|
||||||
|
}
|
|
@ -0,0 +1,99 @@
|
||||||
|
/** @file
|
||||||
|
ScanMem8() and ScanMemN() implementation.
|
||||||
|
|
||||||
|
The following BaseMemoryLib instances contain the same copy of this file:
|
||||||
|
|
||||||
|
BaseMemoryLib
|
||||||
|
BaseMemoryLibMmx
|
||||||
|
BaseMemoryLibSse2
|
||||||
|
BaseMemoryLibRepStr
|
||||||
|
BaseMemoryLibOptDxe
|
||||||
|
BaseMemoryLibOptPei
|
||||||
|
PeiMemoryLib
|
||||||
|
UefiMemoryLib
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2009, 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#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 the target 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Scans a target buffer for a UINTN sized value, and returns a pointer to the matching
|
||||||
|
UINTN sized value in the target buffer.
|
||||||
|
|
||||||
|
This function searches the target buffer specified by Buffer and Length from the lowest
|
||||||
|
address to the highest address for a UINTN sized 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 UINTN boundary, then ASSERT().
|
||||||
|
If Length is not aligned on a UINTN 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
|
||||||
|
ScanMemN (
|
||||||
|
IN CONST VOID *Buffer,
|
||||||
|
IN UINTN Length,
|
||||||
|
IN UINTN Value
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (sizeof (UINTN) == sizeof (UINT64)) {
|
||||||
|
return ScanMem64 (Buffer, Length, (UINT64)Value);
|
||||||
|
} else {
|
||||||
|
return ScanMem32 (Buffer, Length, (UINT32)Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
/** @file
|
||||||
|
Implementation of the EfiSetMem routine. This function is broken
|
||||||
|
out into its own source file so that it can be excluded from a
|
||||||
|
build for a particular platform easily if an optimized version
|
||||||
|
is desired.
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2010, 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include "MemLibInternals.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
Set Buffer to Value for Size bytes.
|
||||||
|
|
||||||
|
@param Buffer Memory to set.
|
||||||
|
@param Length 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
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Declare the local variables that actually move the data elements as
|
||||||
|
// volatile to prevent the optimizer from replacing this function with
|
||||||
|
// the intrinsic memset()
|
||||||
|
//
|
||||||
|
volatile UINT8 *Pointer;
|
||||||
|
|
||||||
|
Pointer = (UINT8*)Buffer;
|
||||||
|
while (Length-- > 0) {
|
||||||
|
*(Pointer++) = Value;
|
||||||
|
}
|
||||||
|
return Buffer;
|
||||||
|
}
|
|
@ -0,0 +1,64 @@
|
||||||
|
/** @file
|
||||||
|
SetMem16() implementation.
|
||||||
|
|
||||||
|
The following BaseMemoryLib instances contain the same copy of this file:
|
||||||
|
BaseMemoryLib
|
||||||
|
BaseMemoryLibMmx
|
||||||
|
BaseMemoryLibSse2
|
||||||
|
BaseMemoryLibRepStr
|
||||||
|
BaseMemoryLibOptDxe
|
||||||
|
BaseMemoryLibOptPei
|
||||||
|
PeiMemoryLib
|
||||||
|
UefiMemoryLib
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2009, 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#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);
|
||||||
|
}
|
|
@ -0,0 +1,64 @@
|
||||||
|
/** @file
|
||||||
|
SetMem32() implementation.
|
||||||
|
|
||||||
|
The following BaseMemoryLib instances contain the same copy of this file:
|
||||||
|
BaseMemoryLib
|
||||||
|
BaseMemoryLibMmx
|
||||||
|
BaseMemoryLibSse2
|
||||||
|
BaseMemoryLibRepStr
|
||||||
|
BaseMemoryLibOptDxe
|
||||||
|
BaseMemoryLibOptPei
|
||||||
|
PeiMemoryLib
|
||||||
|
UefiMemoryLib
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2009, 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#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);
|
||||||
|
}
|
|
@ -0,0 +1,64 @@
|
||||||
|
/** @file
|
||||||
|
SetMem64() implementation.
|
||||||
|
|
||||||
|
The following BaseMemoryLib instances contain the same copy of this file:
|
||||||
|
BaseMemoryLib
|
||||||
|
BaseMemoryLibMmx
|
||||||
|
BaseMemoryLibSse2
|
||||||
|
BaseMemoryLibRepStr
|
||||||
|
BaseMemoryLibOptDxe
|
||||||
|
BaseMemoryLibOptPei
|
||||||
|
PeiMemoryLib
|
||||||
|
UefiMemoryLib
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2009, 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#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);
|
||||||
|
}
|
|
@ -0,0 +1,91 @@
|
||||||
|
/** @file
|
||||||
|
SetMem() and SetMemN() implementation.
|
||||||
|
|
||||||
|
The following BaseMemoryLib instances contain the same copy of this file:
|
||||||
|
|
||||||
|
BaseMemoryLib
|
||||||
|
BaseMemoryLibMmx
|
||||||
|
BaseMemoryLibSse2
|
||||||
|
BaseMemoryLibRepStr
|
||||||
|
BaseMemoryLibOptDxe
|
||||||
|
BaseMemoryLibOptPei
|
||||||
|
PeiMemoryLib
|
||||||
|
UefiMemoryLib
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2009, 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#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 with which to fill Length bytes of Buffer.
|
||||||
|
|
||||||
|
@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);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Fills a target buffer with a value that is size UINTN, and returns the target buffer.
|
||||||
|
|
||||||
|
This function fills Length bytes of Buffer with the UINTN sized value specified by
|
||||||
|
Value, and returns Buffer. Value is repeated every sizeof(UINTN) bytes 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 UINTN boundary, then ASSERT().
|
||||||
|
If Length is not aligned on a UINTN 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
|
||||||
|
SetMemN (
|
||||||
|
OUT VOID *Buffer,
|
||||||
|
IN UINTN Length,
|
||||||
|
IN UINTN Value
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (sizeof (UINTN) == sizeof (UINT64)) {
|
||||||
|
return SetMem64 (Buffer, Length, (UINT64)Value);
|
||||||
|
} else {
|
||||||
|
return SetMem32 (Buffer, Length, (UINT32)Value);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
/** @file
|
||||||
|
ZeroMem() implementation.
|
||||||
|
|
||||||
|
The following BaseMemoryLib instances contain the same copy of this file:
|
||||||
|
|
||||||
|
BaseMemoryLib
|
||||||
|
BaseMemoryLibMmx
|
||||||
|
BaseMemoryLibSse2
|
||||||
|
BaseMemoryLibRepStr
|
||||||
|
BaseMemoryLibOptDxe
|
||||||
|
BaseMemoryLibOptPei
|
||||||
|
PeiMemoryLib
|
||||||
|
UefiMemoryLib
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2009 , 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#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);
|
||||||
|
}
|
|
@ -74,6 +74,10 @@ BdsEntry (
|
||||||
EFI_DEVICE_PATH_PROTOCOL *LoadImageDevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *LoadImageDevicePath;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *FileSystemDevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *FileSystemDevicePath;
|
||||||
|
|
||||||
|
PERF_END (NULL, "DXE", NULL, 0);
|
||||||
|
PERF_START (NULL, "BDS", NULL, 0);
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Now do the EFI stuff
|
// Now do the EFI stuff
|
||||||
//
|
//
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include <Library/PcdLib.h>
|
#include <Library/PcdLib.h>
|
||||||
#include <Library/MemoryAllocationLib.h>
|
#include <Library/MemoryAllocationLib.h>
|
||||||
#include <Library/PrintLib.h>
|
#include <Library/PrintLib.h>
|
||||||
|
#include <Library/PerformanceLib.h>
|
||||||
|
|
||||||
#include <Protocol/Bds.h>
|
#include <Protocol/Bds.h>
|
||||||
#include <Protocol/SerialIo.h>
|
#include <Protocol/SerialIo.h>
|
||||||
|
|
|
@ -141,6 +141,7 @@ LoadPeCoffSectionFromFv (
|
||||||
|
|
||||||
Status = gBS->LoadImage (TRUE, gImageHandle, DevicePath, NULL, 0, &ImageHandle);
|
Status = gBS->LoadImage (TRUE, gImageHandle, DevicePath, NULL, 0, &ImageHandle);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
|
PERF_END (NULL, "BDS", NULL, 0);
|
||||||
Status = gBS->StartImage (ImageHandle, NULL, NULL);
|
Status = gBS->StartImage (ImageHandle, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@
|
||||||
MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
|
MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
|
||||||
|
|
||||||
BaseLib|MdePkg/Library/BaseLib/BaseLib.inf
|
BaseLib|MdePkg/Library/BaseLib/BaseLib.inf
|
||||||
BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
|
BaseMemoryLib|ArmPkg/Library/BaseMemoryLibStm/BaseMemoryLibStm.inf
|
||||||
|
|
||||||
EfiResetSystemLib|BeagleBoardPkg/Library/ResetSystemLib/ResetSystemLib.inf
|
EfiResetSystemLib|BeagleBoardPkg/Library/ResetSystemLib/ResetSystemLib.inf
|
||||||
|
|
||||||
|
@ -122,6 +122,9 @@
|
||||||
PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf
|
PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf
|
||||||
HobLib|EmbeddedPkg/Library/PrePiHobLib/PrePiHobLib.inf
|
HobLib|EmbeddedPkg/Library/PrePiHobLib/PrePiHobLib.inf
|
||||||
PerformanceLib|MdeModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.inf
|
PerformanceLib|MdeModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.inf
|
||||||
|
|
||||||
|
# 1/123 faster than Stm or Vstm version
|
||||||
|
BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
|
||||||
|
|
||||||
[LibraryClasses.common.PEI_CORE]
|
[LibraryClasses.common.PEI_CORE]
|
||||||
PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
|
PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
|
||||||
|
|
|
@ -156,15 +156,27 @@ ImageHandleToPdbFileName (
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
|
EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
|
||||||
|
CHAR8 *Pdb;
|
||||||
|
CHAR8 *StripLeading;
|
||||||
|
|
||||||
Status = gBS->HandleProtocol (Handle, &gEfiLoadedImageProtocolGuid, (VOID **)&LoadedImage);
|
Status = gBS->HandleProtocol (Handle, &gEfiLoadedImageProtocolGuid, (VOID **)&LoadedImage);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
return PeCoffLoaderGetPdbPointer (LoadedImage->ImageBase);
|
Pdb = PeCoffLoaderGetPdbPointer (LoadedImage->ImageBase);
|
||||||
|
StripLeading = AsciiStrStr (Pdb, "\\ARM\\");
|
||||||
|
if (StripLeading == NULL) {
|
||||||
|
StripLeading = AsciiStrStr (Pdb, "/ARM/");
|
||||||
|
if (StripLeading == NULL) {
|
||||||
|
return Pdb;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Hopefully we hacked off the unneeded part
|
||||||
|
return (StripLeading + 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CHAR8 *mTokenList[] = {
|
CHAR8 *mTokenList[] = {
|
||||||
"SEC",
|
"SEC",
|
||||||
"PEI",
|
"PEI",
|
||||||
|
|
Loading…
Reference in New Issue