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 6DDB82205B910 for ; Thu, 11 Jan 2018 02:40:48 -0800 (PST) Received: by mail-it0-x244.google.com with SMTP id m11so19466488iti.1 for ; Thu, 11 Jan 2018 02:46:02 -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=o5+6OT5dLRIsBZtLaaTCV9I8imaO1F2vna0rjHpmkbw=; b=BI3CpufBsc7ugttRzS9AgXh97+j9TIpKtv4dfJ4yOLSfdFM0pkTFV0dZ08A9mntTQv HDryg/taWLUzya7nXw+AQw1M4zEyqS9lGi+8bhChIhugyE5af7842CKPd01lHQY+TAVv XHqXt0JKFNJmYxxOPy4C13wVv1yCeZf+/S7E8= 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=o5+6OT5dLRIsBZtLaaTCV9I8imaO1F2vna0rjHpmkbw=; b=D+tymKJTpo8FrtnR9mS6SUZFunxTWKl47ZiZTWTzAfAbANZ54HnIhcEwGkUnolxiX+ JL6OG40/dboSmthz6wJ+7gAfDGqt28LdWVGJJkzNAm2bBmZV+RNXJqRCH5e/8lCBVPUf yFvxcf6P8ED3CBOKdp4jVJU+NGeQoljaposmELXjpGWR3tNTJuF2uhpUJEfgntTVVEk5 P9LmjggCSSbXGz1G15Bfz/Uu6T6/gLtdqCLENv1HxAfCdjrsQuCxavLS+dO7sDAI7Y3B CLwvyjO9xyZdzL9vXfAJ/4YHBC7Hi58hqTaLzp/ZeSh+VEuv0P3dsFziSxFpo7OzkBBK GiRA== X-Gm-Message-State: AKGB3mItDUNvZkGf4Poh39WkH7PEmlFWTyqvGDB+X+s9nJake//6OzJ/ I/c6GjsJSsVCPWElcGW1sqKS2NiT//xuBgDzw7PNKg== X-Google-Smtp-Source: ACJfBovLjWMRIDAmB4Gw6Es7BRzagv2W1XFf1Ie+NV11wJlMU6SVAqIwKD0vtJSu0+Yt0wu/KEDT8l/KBkeR6bnn2/k= X-Received: by 10.107.160.196 with SMTP id j187mr22117781ioe.186.1515667561704; Thu, 11 Jan 2018 02:46:01 -0800 (PST) MIME-Version: 1.0 Received: by 10.107.37.197 with HTTP; Thu, 11 Jan 2018 02:46:01 -0800 (PST) In-Reply-To: <20180110162644.11208-5-pete@akeo.ie> References: <20180110162644.11208-1-pete@akeo.ie> <20180110162644.11208-5-pete@akeo.ie> From: Ard Biesheuvel Date: Thu, 11 Jan 2018 10:46:01 +0000 Message-ID: To: Pete Batard , "Cohen, Eugene" Cc: "edk2-devel@lists.01.org" , "Gao, Liming" Subject: Re: [PATCH v4 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: Thu, 11 Jan 2018 10:40:49 -0000 Content-Type: text/plain; charset="UTF-8" On 10 January 2018 at 16:26, 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. > > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Pete Batard This looks fine to me but I haven't been able to test it. Reviewed-by: Ard Biesheuvel Eugene: any comments regarding the changes to RVCT code? > --- > 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..3794cac35eed 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 Math, 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..db2fd5057832 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 Math, 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..c5632b4e95e7 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 Math, 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 >