From: "Michael D Kinney" <michael.d.kinney@intel.com>
To: "devel@edk2.groups.io" <devel@edk2.groups.io>,
"Li, Yi1" <yi1.li@intel.com>, Gerd Hoffmann <kraxel@redhat.com>,
"Kinney, Michael D" <michael.d.kinney@intel.com>
Subject: Re: [edk2-devel] [PATCH 1/4] CryptoPkg: Add instrinsics to support building ECC on IA32 windows
Date: Mon, 18 Apr 2022 15:24:01 +0000 [thread overview]
Message-ID: <CO1PR11MB492976228A027BA3B28A22DBD2F39@CO1PR11MB4929.namprd11.prod.outlook.com> (raw)
In-Reply-To: <df51297fb766a090af0621903f35b904a5d5b06c.1650286720.git.yi1.li@intel.com>
There are other patch series to move intrinsics to the MdePkg for
OpenSSL 3.0 enabling.
I recommend you work with Gerd on the intrinsic topic.
Mike
> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of yi1 li
> Sent: Monday, April 18, 2022 6:03 AM
> To: devel@edk2.groups.io
> Cc: Li, Yi1 <yi1.li@intel.com>
> Subject: [edk2-devel] [PATCH 1/4] CryptoPkg: Add instrinsics to support building ECC on IA32 windows
>
> REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3679
>
> This dependency is needed to build openssl lib with ECC ciphers
> under IA32 Windows and adds implementation for _allmul and _allshr
> instrinsics.
>
> It is taken from Project Mu:
> microsoft/mu_basecore@b55b341
>
> Signed-off-by: yi1 li <yi1.li@intel.com>
> ---
> .../Library/IntrinsicLib/Ia32/MathLlmul.asm | 98 +++++++++++++++++++
> .../Library/IntrinsicLib/Ia32/MathLlshr.asm | 78 +++++++++++++++
> .../Library/IntrinsicLib/IntrinsicLib.inf | 2 +
> 3 files changed, 178 insertions(+)
> create mode 100644 CryptoPkg/Library/IntrinsicLib/Ia32/MathLlmul.asm
> create mode 100644 CryptoPkg/Library/IntrinsicLib/Ia32/MathLlshr.asm
>
> diff --git a/CryptoPkg/Library/IntrinsicLib/Ia32/MathLlmul.asm b/CryptoPkg/Library/IntrinsicLib/Ia32/MathLlmul.asm
> new file mode 100644
> index 000000000000..341ea8a7bc0d
> --- /dev/null
> +++ b/CryptoPkg/Library/IntrinsicLib/Ia32/MathLlmul.asm
> @@ -0,0 +1,98 @@
> +;***
> +;llmul.asm - long multiply routine
> +;
> +; Copyright (c) Microsoft Corporation. All rights reserved.
> +; SPDX-License-Identifier: BSD-2-Clause-Patent
> +;
> +;Purpose:
> +; Defines long multiply routine
> +; Both signed and unsigned routines are the same, since multiply's
> +; work out the same in 2's complement
> +; creates the following routine:
> +; __allmul
> +;
> +;Original Implemenation: MSVC 14.12.25827
> +;
> +;*******************************************************************************
> + .686
> + .model flat,C
> + .code
> +
> +
> +;***
> +;llmul - long multiply routine
> +;
> +;Purpose:
> +; Does a long multiply (same for signed/unsigned)
> +; Parameters are not changed.
> +;
> +;Entry:
> +; Parameters are passed on the stack:
> +; 1st pushed: multiplier (QWORD)
> +; 2nd pushed: multiplicand (QWORD)
> +;
> +;Exit:
> +; EDX:EAX - product of multiplier and multiplicand
> +; NOTE: parameters are removed from the stack
> +;
> +;Uses:
> +; ECX
> +;
> +;Exceptions:
> +;
> +;*******************************************************************************
> +_allmul PROC NEAR
> +
> +A EQU [esp + 4] ; stack address of a
> +B EQU [esp + 12] ; stack address of b
> +
> +HIGH_PART EQU [4] ;
> +LOW_PART EQU [0]
> +
> +;
> +; AHI, BHI : upper 32 bits of A and B
> +; ALO, BLO : lower 32 bits of A and B
> +;
> +; ALO * BLO
> +; ALO * BHI
> +; + BLO * AHI
> +; ---------------------
> +;
> +
> + mov eax,HIGH_PART(A)
> + mov ecx,HIGH_PART(B)
> + or ecx,eax ;test for both high dwords zero.
> + mov ecx,LOW_PART(B)
> + jnz short hard ;both are zero, just mult ALO and BLO
> +
> + mov eax,LOW_PART(A)
> + mul ecx
> +
> + ret 16 ; callee restores the stack
> +
> +hard:
> + push ebx
> +
> +; must redefine A and B since esp has been altered
> +
> +A2 EQU [esp + 8] ; stack address of a
> +B2 EQU [esp + 16] ; stack address of b
> +
> + mul ecx ;eax has AHI, ecx has BLO, so AHI * BLO
> + mov ebx,eax ;save result
> +
> + mov eax,LOW_PART(A2)
> + mul dword ptr HIGH_PART(B2) ;ALO * BHI
> + add ebx,eax ;ebx = ((ALO * BHI) + (AHI * BLO))
> +
> + mov eax,LOW_PART(A2);ecx = BLO
> + mul ecx ;so edx:eax = ALO*BLO
> + add edx,ebx ;now edx has all the LO*HI stuff
> +
> + pop ebx
> +
> + ret 16 ; callee restores the stack
> +
> +_allmul ENDP
> +
> + end
> diff --git a/CryptoPkg/Library/IntrinsicLib/Ia32/MathLlshr.asm b/CryptoPkg/Library/IntrinsicLib/Ia32/MathLlshr.asm
> new file mode 100644
> index 000000000000..ab8294580f16
> --- /dev/null
> +++ b/CryptoPkg/Library/IntrinsicLib/Ia32/MathLlshr.asm
> @@ -0,0 +1,78 @@
> +;***
> +;llshr.asm - long shift right
> +;
> +; Copyright (c) Microsoft Corporation. All rights reserved.
> +; SPDX-License-Identifier: BSD-2-Clause-Patent
> +;
> +;Purpose:
> +; define signed long shift right routine
> +; __allshr
> +;
> +;Original Implemenation: MSVC 14.12.25827
> +;
> +;*******************************************************************************
> + .686
> + .model flat,C
> + .code
> +
> +
> +
> +;***
> +;llshr - long shift right
> +;
> +;Purpose:
> +; Does a signed Long Shift Right
> +; Shifts a long right any number of bits.
> +;
> +;Entry:
> +; EDX:EAX - long value to be shifted
> +; CL - number of bits to shift by
> +;
> +;Exit:
> +; EDX:EAX - shifted value
> +;
> +;Uses:
> +; CL is destroyed.
> +;
> +;Exceptions:
> +;
> +;*******************************************************************************
> +_allshr PROC NEAR
> +
> +;
> +; Handle shifts of 64 bits or more (if shifting 64 bits or more, the result
> +; depends only on the high order bit of edx).
> +;
> + cmp cl,64
> + jae short RETSIGN
> +
> +;
> +; Handle shifts of between 0 and 31 bits
> +;
> + cmp cl, 32
> + jae short MORE32
> + shrd eax,edx,cl
> + sar edx,cl
> + ret
> +
> +;
> +; Handle shifts of between 32 and 63 bits
> +;
> +MORE32:
> + mov eax,edx
> + sar edx,31
> + and cl,31
> + sar eax,cl
> + ret
> +
> +;
> +; Return double precision 0 or -1, depending on the sign of edx
> +;
> +RETSIGN:
> + sar edx,31
> + mov eax,edx
> + ret
> +
> +_allshr ENDP
> +
> + end
> diff --git a/CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf b/CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf
> index fcbb93316cf7..86e74b57b109 100644
> --- a/CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf
> +++ b/CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf
> @@ -30,6 +30,8 @@
> Ia32/MathLShiftS64.c | MSFT
> Ia32/MathRShiftU64.c | MSFT
> Ia32/MathFtol.c | MSFT
> + Ia32/MathLlmul.asm | MSFT
> + Ia32/MathLlshr.asm | MSFT
>
> Ia32/MathLShiftS64.c | INTEL
> Ia32/MathRShiftU64.c | INTEL
> --
> 2.33.0.windows.2
>
>
>
>
>
next prev parent reply other threads:[~2022-04-18 15:24 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-04-18 13:03 [PATCH 0/4] !!TEST Fix warnings of EC feature yi1 li
2022-04-18 13:03 ` [PATCH 1/4] CryptoPkg: Add instrinsics to support building ECC on IA32 windows yi1 li
2022-04-18 15:24 ` Michael D Kinney [this message]
2022-04-19 1:14 ` [edk2-devel] " yi1 li
2022-04-19 0:51 ` Yao, Jiewen
2022-04-18 13:03 ` [PATCH 2/4] CryptoPkg: Reconfigure OpensslLib to add EC algorithms yi1 li
2022-04-18 13:03 ` [PATCH 3/4] CryptoPkg: Make EC source file config-able yi1 li
2022-04-18 15:21 ` [edk2-devel] " Michael D Kinney
2022-04-25 15:52 ` PierreGondois
2022-04-26 2:01 ` yi1 li
2022-04-26 8:14 ` PierreGondois
2022-04-26 8:33 ` Bob Feng
2022-04-18 13:03 ` [PATCH 4/4] CryptoPkg: Add PcdEcEnabled to Base/Pei/SmmCryptLib.inf yi1 li
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CO1PR11MB492976228A027BA3B28A22DBD2F39@CO1PR11MB4929.namprd11.prod.outlook.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox