public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Yao, Jiewen" <jiewen.yao@intel.com>
To: "Li, Yi1" <yi1.li@intel.com>,
	"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: "Wang, Jian J" <jian.j.wang@intel.com>
Subject: Re: [PATCH 1/3] CryptoPkg: Add instrinsics to support building ECC on IA32 windows
Date: Wed, 13 Apr 2022 06:35:24 +0000	[thread overview]
Message-ID: <MW4PR11MB5872A1944D1D50F44582CBB68CEC9@MW4PR11MB5872.namprd11.prod.outlook.com> (raw)
In-Reply-To: <df51297fb766a090af0621903f35b904a5d5b06c.1649826540.git.yi1.li@intel.com>

Reviewed-by: Jiewen Yao <Jiewen.yao@intel.com>

> -----Original Message-----
> From: Li, Yi1 <yi1.li@intel.com>
> Sent: Wednesday, April 13, 2022 2:25 PM
> To: devel@edk2.groups.io
> Cc: Li, Yi1 <yi1.li@intel.com>; Yao, Jiewen <jiewen.yao@intel.com>; Wang, Jian
> J <jian.j.wang@intel.com>
> Subject: [PATCH 1/3] 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
> 
> Cc: Jiewen Yao <jiewen.yao@intel.com>
> Cc: Jian J Wang <jian.j.wang@intel.com>
> 
> 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


  reply	other threads:[~2022-04-13  6:35 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-13  6:24 [PATCH 0/3] CryptoPkg: Enable ECC in openssllib by a customize-able way yi1 li
2022-04-13  6:24 ` [PATCH 1/3] CryptoPkg: Add instrinsics to support building ECC on IA32 windows yi1 li
2022-04-13  6:35   ` Yao, Jiewen [this message]
2022-04-13  6:24 ` [PATCH 2/3] CryptoPkg: Reconfigure OpensslLib to add EC algorithms yi1 li
2022-04-13  6:37   ` Yao, Jiewen
2022-04-13  6:24 ` [PATCH 3/3] CryptoPkg: Make EC source file config-able yi1 li
2022-04-13  6:34   ` Yao, Jiewen
2022-04-13  6:41 ` [PATCH 0/3] CryptoPkg: Enable ECC in openssllib by a customize-able way Yao, Jiewen
2022-04-13  7:03   ` yi1 li
2022-04-14  3:18     ` Yao, Jiewen

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=MW4PR11MB5872A1944D1D50F44582CBB68CEC9@MW4PR11MB5872.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