mirror of
https://github.com/acidanthera/audk.git
synced 2025-04-08 17:05:09 +02:00
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
112
ArmPkg/Library/BaseMemoryLibStm/Arm/CopyMem.S
Executable file
112
ArmPkg/Library/BaseMemoryLibStm/Arm/CopyMem.S
Executable file
@ -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}
|
||||
|
114
ArmPkg/Library/BaseMemoryLibStm/Arm/CopyMem.asm
Executable file
114
ArmPkg/Library/BaseMemoryLibStm/Arm/CopyMem.asm
Executable file
@ -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
|
||||
|
82
ArmPkg/Library/BaseMemoryLibStm/Arm/SetMem.S
Executable file
82
ArmPkg/Library/BaseMemoryLibStm/Arm/SetMem.S
Executable file
@ -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}
|
||||
|
83
ArmPkg/Library/BaseMemoryLibStm/Arm/SetMem.asm
Executable file
83
ArmPkg/Library/BaseMemoryLibStm/Arm/SetMem.asm
Executable file
@ -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
|
||||
|
62
ArmPkg/Library/BaseMemoryLibStm/BaseMemoryLibStm.inf
Executable file
62
ArmPkg/Library/BaseMemoryLibStm/BaseMemoryLibStm.inf
Executable file
@ -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
|
||||
|
66
ArmPkg/Library/BaseMemoryLibStm/CompareMemWrapper.c
Executable file
66
ArmPkg/Library/BaseMemoryLibStm/CompareMemWrapper.c
Executable file
@ -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);
|
||||
}
|
62
ArmPkg/Library/BaseMemoryLibStm/CopyMem.c
Executable file
62
ArmPkg/Library/BaseMemoryLibStm/CopyMem.c
Executable file
@ -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;
|
||||
}
|
63
ArmPkg/Library/BaseMemoryLibStm/CopyMemWrapper.c
Executable file
63
ArmPkg/Library/BaseMemoryLibStm/CopyMemWrapper.c
Executable file
@ -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);
|
||||
}
|
260
ArmPkg/Library/BaseMemoryLibStm/MemLibGeneric.c
Executable file
260
ArmPkg/Library/BaseMemoryLibStm/MemLibGeneric.c
Executable file
@ -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;
|
||||
}
|
142
ArmPkg/Library/BaseMemoryLibStm/MemLibGuid.c
Executable file
142
ArmPkg/Library/BaseMemoryLibStm/MemLibGuid.c
Executable file
@ -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;
|
||||
}
|
234
ArmPkg/Library/BaseMemoryLibStm/MemLibInternals.h
Executable file
234
ArmPkg/Library/BaseMemoryLibStm/MemLibInternals.h
Executable file
@ -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
|
67
ArmPkg/Library/BaseMemoryLibStm/ScanMem16Wrapper.c
Executable file
67
ArmPkg/Library/BaseMemoryLibStm/ScanMem16Wrapper.c
Executable file
@ -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);
|
||||
}
|
66
ArmPkg/Library/BaseMemoryLibStm/ScanMem32Wrapper.c
Executable file
66
ArmPkg/Library/BaseMemoryLibStm/ScanMem32Wrapper.c
Executable file
@ -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);
|
||||
}
|
67
ArmPkg/Library/BaseMemoryLibStm/ScanMem64Wrapper.c
Executable file
67
ArmPkg/Library/BaseMemoryLibStm/ScanMem64Wrapper.c
Executable file
@ -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);
|
||||
}
|
99
ArmPkg/Library/BaseMemoryLibStm/ScanMem8Wrapper.c
Executable file
99
ArmPkg/Library/BaseMemoryLibStm/ScanMem8Wrapper.c
Executable file
@ -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);
|
||||
}
|
||||
}
|
||||
|
53
ArmPkg/Library/BaseMemoryLibStm/SetMem.c
Executable file
53
ArmPkg/Library/BaseMemoryLibStm/SetMem.c
Executable file
@ -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;
|
||||
}
|
64
ArmPkg/Library/BaseMemoryLibStm/SetMem16Wrapper.c
Executable file
64
ArmPkg/Library/BaseMemoryLibStm/SetMem16Wrapper.c
Executable file
@ -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);
|
||||
}
|
64
ArmPkg/Library/BaseMemoryLibStm/SetMem32Wrapper.c
Executable file
64
ArmPkg/Library/BaseMemoryLibStm/SetMem32Wrapper.c
Executable file
@ -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);
|
||||
}
|
64
ArmPkg/Library/BaseMemoryLibStm/SetMem64Wrapper.c
Executable file
64
ArmPkg/Library/BaseMemoryLibStm/SetMem64Wrapper.c
Executable file
@ -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);
|
||||
}
|
91
ArmPkg/Library/BaseMemoryLibStm/SetMemWrapper.c
Executable file
91
ArmPkg/Library/BaseMemoryLibStm/SetMemWrapper.c
Executable file
@ -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);
|
||||
}
|
||||
}
|
52
ArmPkg/Library/BaseMemoryLibStm/ZeroMemWrapper.c
Executable file
52
ArmPkg/Library/BaseMemoryLibStm/ZeroMemWrapper.c
Executable file
@ -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);
|
||||
}
|
114
ArmPkg/Library/BaseMemoryLibVstm/Arm/CopyMem.S
Executable file
114
ArmPkg/Library/BaseMemoryLibVstm/Arm/CopyMem.S
Executable file
@ -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}
|
||||
|
||||
|
115
ArmPkg/Library/BaseMemoryLibVstm/Arm/CopyMem.asm
Executable file
115
ArmPkg/Library/BaseMemoryLibVstm/Arm/CopyMem.asm
Executable file
@ -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
|
||||
|
80
ArmPkg/Library/BaseMemoryLibVstm/Arm/SetMem.S
Executable file
80
ArmPkg/Library/BaseMemoryLibVstm/Arm/SetMem.S
Executable file
@ -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}
|
||||
|
80
ArmPkg/Library/BaseMemoryLibVstm/Arm/SetMem.asm
Executable file
80
ArmPkg/Library/BaseMemoryLibVstm/Arm/SetMem.asm
Executable file
@ -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
|
||||
|
69
ArmPkg/Library/BaseMemoryLibVstm/BaseMemoryLibVstm.inf
Executable file
69
ArmPkg/Library/BaseMemoryLibVstm/BaseMemoryLibVstm.inf
Executable file
@ -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
|
||||
|
66
ArmPkg/Library/BaseMemoryLibVstm/CompareMemWrapper.c
Executable file
66
ArmPkg/Library/BaseMemoryLibVstm/CompareMemWrapper.c
Executable file
@ -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);
|
||||
}
|
62
ArmPkg/Library/BaseMemoryLibVstm/CopyMem.c
Executable file
62
ArmPkg/Library/BaseMemoryLibVstm/CopyMem.c
Executable file
@ -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;
|
||||
}
|
63
ArmPkg/Library/BaseMemoryLibVstm/CopyMemWrapper.c
Executable file
63
ArmPkg/Library/BaseMemoryLibVstm/CopyMemWrapper.c
Executable file
@ -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);
|
||||
}
|
260
ArmPkg/Library/BaseMemoryLibVstm/MemLibGeneric.c
Executable file
260
ArmPkg/Library/BaseMemoryLibVstm/MemLibGeneric.c
Executable file
@ -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;
|
||||
}
|
142
ArmPkg/Library/BaseMemoryLibVstm/MemLibGuid.c
Executable file
142
ArmPkg/Library/BaseMemoryLibVstm/MemLibGuid.c
Executable file
@ -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;
|
||||
}
|
234
ArmPkg/Library/BaseMemoryLibVstm/MemLibInternals.h
Executable file
234
ArmPkg/Library/BaseMemoryLibVstm/MemLibInternals.h
Executable file
@ -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
|
67
ArmPkg/Library/BaseMemoryLibVstm/ScanMem16Wrapper.c
Executable file
67
ArmPkg/Library/BaseMemoryLibVstm/ScanMem16Wrapper.c
Executable file
@ -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);
|
||||
}
|
66
ArmPkg/Library/BaseMemoryLibVstm/ScanMem32Wrapper.c
Executable file
66
ArmPkg/Library/BaseMemoryLibVstm/ScanMem32Wrapper.c
Executable file
@ -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);
|
||||
}
|
67
ArmPkg/Library/BaseMemoryLibVstm/ScanMem64Wrapper.c
Executable file
67
ArmPkg/Library/BaseMemoryLibVstm/ScanMem64Wrapper.c
Executable file
@ -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);
|
||||
}
|
99
ArmPkg/Library/BaseMemoryLibVstm/ScanMem8Wrapper.c
Executable file
99
ArmPkg/Library/BaseMemoryLibVstm/ScanMem8Wrapper.c
Executable file
@ -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);
|
||||
}
|
||||
}
|
||||
|
53
ArmPkg/Library/BaseMemoryLibVstm/SetMem.c
Executable file
53
ArmPkg/Library/BaseMemoryLibVstm/SetMem.c
Executable file
@ -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;
|
||||
}
|
64
ArmPkg/Library/BaseMemoryLibVstm/SetMem16Wrapper.c
Executable file
64
ArmPkg/Library/BaseMemoryLibVstm/SetMem16Wrapper.c
Executable file
@ -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);
|
||||
}
|
64
ArmPkg/Library/BaseMemoryLibVstm/SetMem32Wrapper.c
Executable file
64
ArmPkg/Library/BaseMemoryLibVstm/SetMem32Wrapper.c
Executable file
@ -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);
|
||||
}
|
64
ArmPkg/Library/BaseMemoryLibVstm/SetMem64Wrapper.c
Executable file
64
ArmPkg/Library/BaseMemoryLibVstm/SetMem64Wrapper.c
Executable file
@ -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);
|
||||
}
|
91
ArmPkg/Library/BaseMemoryLibVstm/SetMemWrapper.c
Executable file
91
ArmPkg/Library/BaseMemoryLibVstm/SetMemWrapper.c
Executable file
@ -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);
|
||||
}
|
||||
}
|
52
ArmPkg/Library/BaseMemoryLibVstm/ZeroMemWrapper.c
Executable file
52
ArmPkg/Library/BaseMemoryLibVstm/ZeroMemWrapper.c
Executable file
@ -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 *FileSystemDevicePath;
|
||||
|
||||
PERF_END (NULL, "DXE", NULL, 0);
|
||||
PERF_START (NULL, "BDS", NULL, 0);
|
||||
|
||||
|
||||
//
|
||||
// Now do the EFI stuff
|
||||
//
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Library/MemoryAllocationLib.h>
|
||||
#include <Library/PrintLib.h>
|
||||
#include <Library/PerformanceLib.h>
|
||||
|
||||
#include <Protocol/Bds.h>
|
||||
#include <Protocol/SerialIo.h>
|
||||
|
@ -141,6 +141,7 @@ LoadPeCoffSectionFromFv (
|
||||
|
||||
Status = gBS->LoadImage (TRUE, gImageHandle, DevicePath, NULL, 0, &ImageHandle);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
PERF_END (NULL, "BDS", NULL, 0);
|
||||
Status = gBS->StartImage (ImageHandle, NULL, NULL);
|
||||
}
|
||||
|
||||
|
@ -43,7 +43,7 @@
|
||||
MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.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
|
||||
|
||||
@ -122,6 +122,9 @@
|
||||
PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf
|
||||
HobLib|EmbeddedPkg/Library/PrePiHobLib/PrePiHobLib.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]
|
||||
PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
|
||||
|
@ -156,15 +156,27 @@ ImageHandleToPdbFileName (
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
|
||||
CHAR8 *Pdb;
|
||||
CHAR8 *StripLeading;
|
||||
|
||||
Status = gBS->HandleProtocol (Handle, &gEfiLoadedImageProtocolGuid, (VOID **)&LoadedImage);
|
||||
if (EFI_ERROR (Status)) {
|
||||
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[] = {
|
||||
"SEC",
|
||||
"PEI",
|
||||
|
Loading…
x
Reference in New Issue
Block a user