From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2607:f8b0:4001:c0b::244; helo=mail-it0-x244.google.com; envelope-from=ard.biesheuvel@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-it0-x244.google.com (mail-it0-x244.google.com [IPv6:2607:f8b0:4001:c0b::244]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id E0CEA222DDBF5 for ; Mon, 15 Jan 2018 04:01:44 -0800 (PST) Received: by mail-it0-x244.google.com with SMTP id r6so627020itr.3 for ; Mon, 15 Jan 2018 04:07:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=7tLbjQrGKxE4trlhMrAjNG3fdvJMzkA2Yw6rrUeEzrI=; b=begyp5FvjtPlkm0f6N386mtuGgXIVRdT6PhVrjtKNQDPuq4M13JvWJ7+XljUcJneoT gzAdGvc7mBwHqGjkpBpP27qHx01O3jscWY6YwD8MbX0uXv9j+yt3zMoTdsuGTVpsRqr/ NEHOhRgAi9KyIZwFH9Rf7Dgptnd/M3gN7sqnM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=7tLbjQrGKxE4trlhMrAjNG3fdvJMzkA2Yw6rrUeEzrI=; b=lYgtbGVIgvNEf98Y4F0XDIByhOJ+n/GBgGAc75lWFnlNOTv3kM41p3DmM5kTTaRGd1 pq8j0p0GJRpCSSStPSFXnDoOwbpVtY2kPu3QDqQh2lY+ls5c7+BvIOo0UQhP+w1vUkgq AlVNtygFWz7FguhIkAs4XAauWE4t1xKR9W5xW3HpxkaaEPcWS+yyn5GplmEAymqfpaaJ mcszrFdrZ5LQX5BPQn+nzPTMiRJ04dPAi8bdUCJ+UjfKJp/QinQUKlu+pfbfwTZ7s9uu d9YaeWQAlXLsA5qwfALe+KfWcoL2NGXJk9OF2/3GqU6dwPZU8DYUTj93VBhDxeuOiEqa NlBg== X-Gm-Message-State: AKwxytcnv+e+4Pxdn4cEsRmSP7e/JsKEx1+X8lg2BLVrQ4CjBykBc19n ug6hZwFrqk1Zkz+R0w4MOUDzU+GWifL0JIr8KMGx8Q== X-Google-Smtp-Source: ACJfBosbBApfoc24KMksJCDwCHKFV+ZqpSrlohnuzj6UwtqFiFnHQiJdRHkvSHBYeddkNisf+RZxY8WlQZ+PUo6x+gM= X-Received: by 10.36.192.10 with SMTP id u10mr13990967itf.73.1516018022294; Mon, 15 Jan 2018 04:07:02 -0800 (PST) MIME-Version: 1.0 Received: by 10.107.37.197 with HTTP; Mon, 15 Jan 2018 04:07:01 -0800 (PST) In-Reply-To: <20180112133331.7776-5-pete@akeo.ie> References: <20180112133331.7776-1-pete@akeo.ie> <20180112133331.7776-5-pete@akeo.ie> From: Ard Biesheuvel Date: Mon, 15 Jan 2018 12:07:01 +0000 Message-ID: To: Pete Batard Cc: "edk2-devel@lists.01.org" , "Gao, Liming" , "Cohen, Eugene" Subject: Re: [PATCH v5 4/6] ArmPkg/Library/CompilerIntrinsicsLib: Enable VS2017/ARM builds X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 15 Jan 2018 12:01:45 -0000 Content-Type: text/plain; charset="UTF-8" On 12 January 2018 at 13:33, Pete Batard wrote: > Introduce CRT assembly replacements for __rt_sdiv, __rt_udiv, > __rt_udiv64, __rt_sdiv64, __rt_srsh (by reusing the RVCT code) > as well as memcpy and memset. > For MSFT compatibility, some of the code needs to be explicitly > forced to ARM, and the /oldit assembly flag needs to be added. > Also, while RVCT_ASM_EXPORT macro invocations have been removed, > the replacement code is designed to be as close as possible to > the one that would have been generated if using the macros. > > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Pete Batard Reviewed-by: Ard Biesheuvel > --- > ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm | 43 +++++++++++++++++--- > ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm | 40 +++++++++++++----- > ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm | 22 +++++----- > ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm | 29 +++++++++++-- > ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf | 16 +++++++- > ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c | 34 ++++++++++++++++ > ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c | 33 +++++++++++++++ > 7 files changed, 185 insertions(+), 32 deletions(-) > > diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm > index b539e516892d..f9e0107395f2 100644 > --- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm > +++ b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm > @@ -1,6 +1,7 @@ > //------------------------------------------------------------------------------ > // > // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
> +// Copyright (c) 2018, Pete Batard. All rights reserved.
> // > // This program and the accompanying materials > // are licensed and made available under the terms and conditions of the BSD License > @@ -17,18 +18,19 @@ > EXPORT __aeabi_uidivmod > EXPORT __aeabi_idiv > EXPORT __aeabi_idivmod > + EXPORT __rt_udiv > + EXPORT __rt_sdiv > > AREA Math, CODE, READONLY > > ; > ;UINT32 > ;EFIAPI > -;__aeabi_uidivmode ( > -; IN UINT32 Dividen > +;__aeabi_uidivmod ( > +; IN UINT32 Dividend > ; IN UINT32 Divisor > ; ); > ; > - > __aeabi_uidiv > __aeabi_uidivmod > RSBS r12, r1, r0, LSR #4 > @@ -40,10 +42,40 @@ __aeabi_uidivmod > B __arm_div_large > > ; > +;UINT64 > +;EFIAPI > +;__rt_udiv ( > +; IN UINT32 Divisor, > +; IN UINT32 Dividend > +; ); > +; > +__rt_udiv > + ; Swap R0 and R1 > + MOV r12, r0 > + MOV r0, r1 > + MOV r1, r12 > + B __aeabi_uidivmod > + > +; > +;UINT64 > +;EFIAPI > +;__rt_sdiv ( > +; IN INT32 Divisor, > +; IN INT32 Dividend > +; ); > +; > +__rt_sdiv > + ; Swap R0 and R1 > + MOV r12, r0 > + MOV r0, r1 > + MOV r1, r12 > + B __aeabi_idivmod > + > +; > ;INT32 > ;EFIAPI > -;__aeabi_idivmode ( > -; IN INT32 Dividen > +;__aeabi_idivmod ( > +; IN INT32 Dividend > ; IN INT32 Divisor > ; ); > ; > @@ -152,4 +184,3 @@ __aeabi_idiv0 > BX r14 > > END > - > diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm > index c71bd59e4520..115a2b9c0e3c 100644 > --- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm > +++ b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm > @@ -1,6 +1,7 @@ > //------------------------------------------------------------------------------ > // > // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
> +// Copyright (c) 2018, Pete Batard. All rights reserved.
> // > // This program and the accompanying materials > // are licensed and made available under the terms and conditions of the BSD License > @@ -13,20 +14,41 @@ > //------------------------------------------------------------------------------ > > > - EXTERN __aeabi_uldivmod > + IMPORT __aeabi_uldivmod > + EXPORT __aeabi_ldivmod > + EXPORT __rt_sdiv64 > > - INCLUDE AsmMacroExport.inc > + AREA s___aeabi_ldivmod, CODE, READONLY, ARM > + > + ARM > > ; > -;UINT32 > +;INT64 > ;EFIAPI > -;__aeabi_uidivmode ( > -; IN UINT32 Dividen > -; IN UINT32 Divisor > +;__rt_sdiv64 ( > +; IN INT64 Divisor > +; IN INT64 Dividend > ; ); > ; > +__rt_sdiv64 > + ; Swap r0-r1 and r2-r3 > + MOV r12, r0 > + MOV r0, r2 > + MOV r2, r12 > + MOV r12, r1 > + MOV r1, r3 > + MOV r3, r12 > + B __aeabi_ldivmod > > - RVCT_ASM_EXPORT __aeabi_ldivmod > +; > +;INT64 > +;EFIAPI > +;__aeabi_ldivmod ( > +; IN INT64 Dividend > +; IN INT64 Divisor > +; ); > +; > +__aeabi_ldivmod > PUSH {r4,lr} > ASRS r4,r1,#1 > EOR r4,r4,r3,LSR #1 > @@ -39,7 +61,7 @@ L_Test1 > RSBS r2,r2,#0 > RSC r3,r3,#0 > L_Test2 > - BL __aeabi_uldivmod ; > + BL __aeabi_uldivmod > TST r4,#0x40000000 > BEQ L_Test3 > RSBS r0,r0,#0 > @@ -53,5 +75,3 @@ L_Exit > POP {r4,pc} > > END > - > - > diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm > index 881db106d9d7..abfd7ab64a79 100644 > --- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm > +++ b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm > @@ -1,6 +1,7 @@ > //------------------------------------------------------------------------------ > // > // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
> +// Copyright (c) 2018, Pete Batard. All rights reserved.
> // > // This program and the accompanying materials > // are licensed and made available under the terms and conditions of the BSD License > @@ -12,32 +13,33 @@ > // > //------------------------------------------------------------------------------ > > + EXPORT __aeabi_llsr > + EXPORT __rt_srsh > > + AREA s___aeabi_llsr, CODE, READONLY, ARM > > - INCLUDE AsmMacroExport.inc > + ARM > > ; > ;VOID > ;EFIAPI > ;__aeabi_llsr ( > -; IN VOID *Destination, > -; IN VOID *Source, > -; IN UINT32 Size > -; ); > +; IN UINT64 Value, > +; IN UINT32 Shift > +;) > ; > - RVCT_ASM_EXPORT __aeabi_llsr > +__aeabi_llsr > +__rt_srsh > SUBS r3,r2,#0x20 > - BPL {pc} + 0x18 ; 0x1c > + BPL __aeabi_llsr_label1 > RSB r3,r2,#0x20 > LSR r0,r0,r2 > ORR r0,r0,r1,LSL r3 > LSR r1,r1,r2 > BX lr > +__aeabi_llsr_label1 > LSR r0,r1,r3 > MOV r1,#0 > BX lr > > END > - > - > - > diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm > index 6b6184ebd3fc..aedaac8c6c7f 100644 > --- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm > +++ b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm > @@ -1,6 +1,7 @@ > //------------------------------------------------------------------------------ > // > // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
> +// Copyright (c) 2018, Pete Batard. All rights reserved.
> // > // This program and the accompanying materials > // are licensed and made available under the terms and conditions of the BSD License > @@ -13,9 +14,30 @@ > //------------------------------------------------------------------------------ > > > + EXPORT __aeabi_uldivmod > + EXPORT __rt_udiv64 > > + AREA s___aeabi_uldivmod, CODE, READONLY, ARM > > - INCLUDE AsmMacroExport.inc > + ARM > + > +; > +;UINT64 > +;EFIAPI > +;__rt_udiv64 ( > +; IN UINT64 Divisor > +; IN UINT64 Dividend > +; ) > +; > +__rt_udiv64 > + ; Swap r0-r1 and r2-r3 > + mov r12, r0 > + mov r0, r2 > + mov r2, r12 > + mov r12, r1 > + mov r1, r3 > + mov r3, r12 > + b __aeabi_uldivmod > > ; > ;UINT64 > @@ -25,7 +47,7 @@ > ; IN UINT64 Divisor > ; ) > ; > - RVCT_ASM_EXPORT __aeabi_uldivmod > +__aeabi_uldivmod > stmdb sp!, {r4, r5, r6, lr} > mov r4, r1 > mov r5, r0 > @@ -261,7 +283,6 @@ _ll_div0 > b __aeabi_ldiv0 > > __aeabi_ldiv0 > - BX r14 > + bx r14 > > END > - > diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf b/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf > index 44333141a70a..14e88da7ce06 100644 > --- a/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf > +++ b/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf > @@ -23,8 +23,12 @@ [Defines] > LIBRARY_CLASS = CompilerIntrinsicsLib > > [Sources] > - memcpy.c > - memset.c > + memcpy.c | RVCT > + memcpy.c | GCC > + memcpy_ms.c | MSFT > + memset.c | RVCT > + memset.c | GCC > + memset_ms.c | MSFT > > [Sources.ARM] > Arm/mullu.asm | RVCT > @@ -94,6 +98,10 @@ [Sources.ARM] > Arm/llsr.S | GCC > Arm/llsl.S | GCC > > + Arm/div.asm | MSFT > + Arm/uldiv.asm | MSFT > + Arm/ldivmod.asm | MSFT > + Arm/llsr.asm | MSFT > > [Packages] > MdePkg/MdePkg.dec > @@ -101,3 +109,7 @@ [Packages] > > [LibraryClasses] > > +[BuildOptions] > + MSFT:*_*_ARM_CC_FLAGS = /GL- > + MSFT:*_*_ARM_ASM_FLAGS = /oldit > + MSFT:*_*_AARCH64_CC_FLAGS = /GL- > diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c b/ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c > new file mode 100644 > index 000000000000..90bbbb930d31 > --- /dev/null > +++ b/ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c > @@ -0,0 +1,34 @@ > +//------------------------------------------------------------------------------ > +// > +// Copyright (c) 2017, Pete Batard. 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. > +// > +//------------------------------------------------------------------------------ > + > +#if defined(_M_ARM64) > +typedef unsigned __int64 size_t; > +#else > +typedef unsigned __int32 size_t; > +#endif > + > +void* memcpy(void *, const void *, size_t); > +#pragma intrinsic(memcpy) > +#pragma function(memcpy) > +void* memcpy(void *dest, const void *src, size_t n) > +{ > + unsigned char *d = dest; > + unsigned char const *s = src; > + > + while (n--) > + *d++ = *s++; > + > + return dest; > +} > diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c b/ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c > new file mode 100644 > index 000000000000..64205e5d1012 > --- /dev/null > +++ b/ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c > @@ -0,0 +1,33 @@ > +//------------------------------------------------------------------------------ > +// > +// Copyright (c) 2017, Pete Batard. 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. > +// > +//------------------------------------------------------------------------------ > + > +#if defined(_M_ARM64) > +typedef unsigned __int64 size_t; > +#else > +typedef unsigned __int32 size_t; > +#endif > + > +void* memset(void *, int, size_t); > +#pragma intrinsic(memset) > +#pragma function(memset) > +void *memset(void *s, int c, size_t n) > +{ > + unsigned char *d = s; > + > + while (n--) > + *d++ = (unsigned char)c; > + > + return s; > +} > -- > 2.9.3.windows.2 >