From d08b357f8ac448f8e7180f920faa4b335e1fc65e Mon Sep 17 00:00:00 2001 From: qhuang8 Date: Thu, 13 Jul 2006 04:19:34 +0000 Subject: [PATCH 1/1] 1.Fix SetMem64.S to not use SSE3 instruction 2.Make sure NULL-terminator can be appended. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@945 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Library/BaseMemoryLibSse2/Ia32/SetMem64.S | 122 +++++++++--------- MdePkg/Library/BasePrintLib/PrintLib.c | 2 +- .../Library/BasePrintLib/PrintLibInternal.c | 2 +- 3 files changed, 61 insertions(+), 65 deletions(-) diff --git a/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem64.S b/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem64.S index 2535a61aca..fa60007f5a 100644 --- a/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem64.S +++ b/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem64.S @@ -1,63 +1,59 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2006, Intel Corporation -# All rights reserved. This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# -# Module Name: -# -# SetMem64.asm -# -# Abstract: -# -# SetMem64 function -# -# Notes: -# -#------------------------------------------------------------------------------ - - .686: - #.MODEL flat,C - .xmm: - .code: - -#------------------------------------------------------------------------------ -# VOID * -# _mem_SetMem64 ( -# IN VOID *Buffer, -# IN UINTN Count, -# IN UINT64 Value -# ) -#------------------------------------------------------------------------------ -.global _InternalMemSetMem64 -_InternalMemSetMem64: - push %edi - movl 12(%esp), %ecx - movl 8(%esp), %edi - testl $8, %edi - movddup 16(%esp), %xmm0 - jz L0 - movq %xmm0, (%edi) - addl $8, %edi - decl %ecx -L0: - movl %ecx, %edx - shrl %ecx - jz @SetQwords -L1: - movntdq %xmm0, (%edi) - addl $16, %edi - loop L1 - mfence -@SetQwords: - testb $1, %dl - jz L2 - movq %xmm0, (%edi) -L2: - pop %edi - ret +#------------------------------------------------------------------------------ +# +# Copyright (c) 2006, Intel Corporation +# All rights reserved. This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# Module Name: +# +# SetMem64.S +# +# Abstract: +# +# SetMem64 function +# +# Notes: +# +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# VOID * +# InternalMemSetMem64 ( +# IN VOID *Buffer, +# IN UINTN Count, +# IN UINT64 Value +# ) +#------------------------------------------------------------------------------ +.globl _InternalMemSetMem64 +_InternalMemSetMem64: + movl 4(%esp), %eax + movl 8(%esp), %ecx + testb $8, %al + movl %eax, %edx + movq 0xc(%esp), %xmm0 + jz L1 + movq %xmm0, (%edx) + addl $8, %edx + decl %ecx +L1: + shrl %ecx + jz @SetQwords + movlhps %xmm0, %xmm0 +L2: + movntdq %xmm0, (%edx) + leal 16(%edx), %edx + loop L2 + mfence +@SetQwords: + jnc L3 + movq %xmm0, (%edx) +L3: + ret + + + diff --git a/MdePkg/Library/BasePrintLib/PrintLib.c b/MdePkg/Library/BasePrintLib/PrintLib.c index 6b4f1fad4a..455fd60526 100644 --- a/MdePkg/Library/BasePrintLib/PrintLib.c +++ b/MdePkg/Library/BasePrintLib/PrintLib.c @@ -550,7 +550,7 @@ BasePrintLibVSPrint ( // // Null terminate the Unicode or ASCII string // - BasePrintLibFillBuffer (Buffer, EndBuffer, 1, 0, BytesPerOutputCharacter); + BasePrintLibFillBuffer (Buffer, EndBuffer + BytesPerOutputCharacter, 1, 0, BytesPerOutputCharacter); // // Make sure output buffer cannot contain more than PcdMaximumUnicodeStringLength // Unicode characters if PcdMaximumUnicodeStringLength is not zero. diff --git a/MdePkg/Library/BasePrintLib/PrintLibInternal.c b/MdePkg/Library/BasePrintLib/PrintLibInternal.c index 0a75a3c581..a52e1d4a6a 100644 --- a/MdePkg/Library/BasePrintLib/PrintLibInternal.c +++ b/MdePkg/Library/BasePrintLib/PrintLibInternal.c @@ -193,7 +193,7 @@ BasePrintLibConvertValueToString ( } } - BasePrintLibFillBuffer (Buffer, EndBuffer, 1, 0, Increment); + BasePrintLibFillBuffer (Buffer, EndBuffer + Increment, 1, 0, Increment); return ((Buffer - OriginalBuffer) / Increment); } -- 2.39.2