On Fri, Dec 16, 2022 at 4:06 PM Kinney, Michael D < michael.d.kinney@intel.com> wrote: > If that intrinsic is specific to RISCV, then should CompilerHelper.c go > into a RiscV64 subdir? > > Mike > > Hi Mike, While this intrinsic is not specific to RISCV, it is needed due to the GCC for RISCV64 does not generate internal implementation, requiring external link with libgcc/compile-rt. It can happen to other platforms or future GCC toolchain if it decides to move __ctzdi2 to libgcc. If you think it is better to put it in the RiscV64 subdir for now, I am good with it. Tuan, > -----Original Message----- > > From: Tuan Phan > > Sent: Friday, December 16, 2022 10:48 AM > > Cc: devel@edk2.groups.io; sunilvl@ventanamicro.com; Kinney, Michael D < > michael.d.kinney@intel.com>; Yao, Jiewen > > ; Wang, Jian J ; Lu, > Xiaoyu1 ; Jiang, Guomin > > ; Tuan Phan > > Subject: [PATCH v2] CryptoPkg/IntrinsicLib: RiscV: Provide > implementation of memcpy and __ctzdi2 > > > > The RiscV toolchain doesn't provide __ctzdi2 implementation when > > compiled with -nostdlib that needed by openssl library. > > So adding the implementation of __ctzdi2. > > > > Forcing to use CopyMem of EDK2 as memcpy buildin disabled for RiscV > > with -fno-builtin-memcpy flag. > > > > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4103 > > Signed-off-by: Tuan Phan > > Acked-by: Sunil V L > > --- > > V2: > > - Add license header. > > - Add REF to the bugzilla. > > > > .../Library/IntrinsicLib/CompilerHelper.c | 42 +++++++++++++++++++ > > .../Library/IntrinsicLib/IntrinsicLib.inf | 6 ++- > > 2 files changed, 47 insertions(+), 1 deletion(-) > > create mode 100644 CryptoPkg/Library/IntrinsicLib/CompilerHelper.c > > > > diff --git a/CryptoPkg/Library/IntrinsicLib/CompilerHelper.c > b/CryptoPkg/Library/IntrinsicLib/CompilerHelper.c > > new file mode 100644 > > index 000000000000..3844fd14ae66 > > --- /dev/null > > +++ b/CryptoPkg/Library/IntrinsicLib/CompilerHelper.c > > @@ -0,0 +1,42 @@ > > +/** @file > > + Implement functions that not available when compiled with -nostdlib. > > + > > + Copyright (c) 2022, Ventana Micro Systems Inc. All Rights > Reserved.
> > + SPDX-License-Identifier: BSD-2-Clause-Patent > > + > > +**/ > > + > > +unsigned int > > +__ctzdi2 (unsigned long long x) > > +{ > > + unsigned int ret = 0; > > + > > + if (!x) { > > + return 64; > > + } > > + if (!(x & 0xffffffff)) { > > + x >>= 32; > > + ret |= 32; > > + } > > + if (!(x & 0xffff)) { > > + x >>= 16; > > + ret |= 16; > > + } > > + if (!(x & 0xff)) { > > + x >>= 8; > > + ret |= 8; > > + } > > + if (!(x & 0xf)) { > > + x >>= 4; > > + ret |= 4; > > + } > > + if (!(x & 0x3)) { > > + x >>= 2; > > + ret |= 2; > > + } > > + if (!(x & 0x1)) { > > + x >>= 1; > > + ret |= 1; > > + } > > + return ret; > > +} > > diff --git a/CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf > b/CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf > > index 86e74b57b109..6796b39b07cf 100644 > > --- a/CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf > > +++ b/CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf > > @@ -18,7 +18,7 @@ > > # > > > > # The following information is for reference only and not required by > the build tools. > > > > # > > > > -# VALID_ARCHITECTURES = IA32 X64 > > > > +# VALID_ARCHITECTURES = IA32 X64 RISCV64 > > > > # > > > > > > > > [Sources] > > > > @@ -43,6 +43,10 @@ > > [Sources.X64] > > > > CopyMem.c > > > > > > > > +[Sources.RISCV64] > > > > + CopyMem.c > > > > + CompilerHelper.c > > > > + > > > > [Packages] > > > > MdePkg/MdePkg.dec > > > > > > > > -- > > 2.25.1 > >