From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 192.55.52.88, mailfrom: ray.ni@intel.com) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by groups.io with SMTP; Tue, 25 Jun 2019 20:14:45 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 25 Jun 2019 20:14:45 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.63,418,1557212400"; d="scan'208";a="155726689" Received: from fmsmsx106.amr.corp.intel.com ([10.18.124.204]) by orsmga008.jf.intel.com with ESMTP; 25 Jun 2019 20:14:44 -0700 Received: from fmsmsx114.amr.corp.intel.com (10.18.116.8) by FMSMSX106.amr.corp.intel.com (10.18.124.204) with Microsoft SMTP Server (TLS) id 14.3.439.0; Tue, 25 Jun 2019 20:14:44 -0700 Received: from shsmsx108.ccr.corp.intel.com (10.239.4.97) by FMSMSX114.amr.corp.intel.com (10.18.116.8) with Microsoft SMTP Server (TLS) id 14.3.439.0; Tue, 25 Jun 2019 20:14:43 -0700 Received: from shsmsx104.ccr.corp.intel.com ([169.254.5.185]) by SHSMSX108.ccr.corp.intel.com ([169.254.8.236]) with mapi id 14.03.0439.000; Wed, 26 Jun 2019 11:14:42 +0800 From: "Ni, Ray" To: "Dong, Eric" , "devel@edk2.groups.io" CC: Laszlo Ersek Subject: Re: [Patch 1/2] MdePkg: Add new MM MP Protocol definition. Thread-Topic: [Patch 1/2] MdePkg: Add new MM MP Protocol definition. Thread-Index: AQHVJmMKsP9jNqKwiECwXl1L3LwarKatTQEw Date: Wed, 26 Jun 2019 03:14:41 +0000 Message-ID: <734D49CCEBEEF84792F5B80ED585239D5C1F0C54@SHSMSX104.ccr.corp.intel.com> References: <20190619055114.12744-1-eric.dong@intel.com> <20190619055114.12744-2-eric.dong@intel.com> In-Reply-To: <20190619055114.12744-2-eric.dong@intel.com> Accept-Language: en-US, zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Return-Path: ray.ni@intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Eric, Is SmmMp.h necessary? If PI spec doesn't define the EFI_SMM_MP_PROTOCOL, Sm= mMp.h is not needed. Consumer is expected to use the new MM_MP protocol. There is no backward co= mpatibility issue here. Thanks, Ray > -----Original Message----- > From: Dong, Eric > Sent: Wednesday, June 19, 2019 1:51 PM > To: devel@edk2.groups.io > Cc: Ni, Ray ; Laszlo Ersek > Subject: [Patch 1/2] MdePkg: Add new MM MP Protocol definition. >=20 > EFI MM MP Protocol is defined in the PI 1.7 specification. >=20 > The MM MP protocol provides a set of functions to allow execution of > procedures on processors that have entered MM. This protocol has the > following properties: > 1. The caller can invoke execution of a procedure on a processor, other t= han > the caller, that has also entered MM. Supports blocking and non-blocking > modes of operation. > 2. The caller can invoke a procedure on multiple processors. Supports > blocking and non-blocking modes of operation. >=20 > Cc: Ray Ni > Cc: Laszlo Ersek > Signed-off-by: Eric Dong > --- > MdePkg/Include/Pi/PiMultiPhase.h | 16 ++ > MdePkg/Include/Protocol/MmMp.h | 334 > +++++++++++++++++++++++++++++++ > MdePkg/Include/Protocol/SmmMp.h | 44 ++++ > MdePkg/MdePkg.dec | 6 + > 4 files changed, 400 insertions(+) > create mode 100644 MdePkg/Include/Protocol/MmMp.h create mode > 100644 MdePkg/Include/Protocol/SmmMp.h >=20 > diff --git a/MdePkg/Include/Pi/PiMultiPhase.h > b/MdePkg/Include/Pi/PiMultiPhase.h > index eb12527767..a5056799e1 100644 > --- a/MdePkg/Include/Pi/PiMultiPhase.h > +++ b/MdePkg/Include/Pi/PiMultiPhase.h > @@ -176,4 +176,20 @@ VOID > IN OUT VOID *Buffer > ); >=20 > +/** > + The function prototype for invoking a function on an Application Proce= ssor. > + > + This definition is used by the UEFI MM MP Serices Protocol. > + > + @param[in] ProcedureArgument The pointer to private data buffer. > + > + @retval EFI_SUCCESS Excutive the procedure successfully > + > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *EFI_AP_PROCEDURE2)( > + IN VOID *ProcedureArgument > +); > + > #endif > diff --git a/MdePkg/Include/Protocol/MmMp.h > b/MdePkg/Include/Protocol/MmMp.h new file mode 100644 index > 0000000000..0467072bec > --- /dev/null > +++ b/MdePkg/Include/Protocol/MmMp.h > @@ -0,0 +1,334 @@ > +/** @file > + EFI MM MP Protocol is defined in the PI 1.5 specification. > + > + The MM MP protocol provides a set of functions to allow execution of > + procedures on processors that have entered MM. This protocol has the > following properties: > + 1. The caller can only invoke execution of a procedure on a processor, > other than the caller, that > + has also entered MM. > + 2. It is possible to invoke a procedure on multiple processors. Suppor= ts > blocking and non-blocking > + modes of operation. > + > + Copyright (c) 2019, Intel Corporation. All rights reserved.
> + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef _MM_MP_H_ > +#define _MM_MP_H_ > + > +#include > + > +#define EFI_MM_MP_PROTOCOL_GUID \ > + { \ > + 0x5d5450d7, 0x990c, 0x4180, {0xa8, 0x3, 0x8e, 0x63, 0xf0, 0x60, > +0x83, 0x7 } \ > + } > + > +// > +// Revision definition. > +// > +#define EFI_MM_MP_PROTOCOL_REVISION 0x00 > + > +// > +// Attribute flags > +// > +#define EFI_MM_MP_TIMEOUT_SUPPORTED 0x01 > + > +// > +// Completion token > +// > +typedef VOID* MM_COMPLETION; > + > +typedef struct { > + MM_COMPLETION Completion; > + EFI_STATUS Status; > +} MM_DISPATCH_COMPLETION_TOKEN; > + > +typedef struct _EFI_MM_MP_PROTOCOL EFI_MM_MP_PROTOCOL; > + > +/** > + Service to retrieves the number of logical processor in the platform. > + > + @param[in] This The EFI_MM_MP_PROTOCOL instance. > + @param[out] NumberOfProcessors Pointer to the total number of logical > processors in the system, > + including the BSP and all APs. > + > + @retval EFI_SUCCESS The number of processors was retrieved > successfully > + @retval EFI_INVALID_PARAMETER NumberOfProcessors is NULL > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *EFI_MM_GET_NUMBER_OF_PROCESSORS) ( > + IN CONST EFI_MM_MP_PROTOCOL *This, > + OUT UINTN *NumberOfProcessors > +); > + > + > +/** > + This service allows the caller to invoke a procedure one of the > +application processors (AP). This > + function uses an optional token parameter to support blocking and > +non-blocking modes. If the token > + is passed into the call, the function will operate in a non-blocking > +fashion and the caller can > + check for completion with CheckOnProcedure or WaitForProcedure. > + > + @param[in] This The EFI_MM_MP_PROTOCOL instance. > + @param[in] Procedure A pointer to the procedure to be= run on > the designated target > + AP of the system. Type EFI_AP_PR= OCEDURE2 is defined > below in > + related definitions. > + @param[in] CpuNumber The zero-based index of the proc= essor > number of the target > + AP, on which the code stream is = supposed to run. If the > number > + points to the calling processor = then it will not run the > + supplied code. > + @param[in] TimeoutInMicroseconds Indicates the time limit in > microseconds for this AP to > + finish execution of Procedure, e= ither for blocking or > + non-blocking mode. Zero means in= finity. If the timeout > + expires before this AP returns f= rom Procedure, then > Procedure > + on the AP is terminated. If the = timeout expires in > blocking > + mode, the call returns EFI_TIMEO= UT. If the timeout > expires > + in non-blocking mode, the timeou= t determined can be > through > + CheckOnProcedure or WaitForProce= dure. > + Note that timeout support is opt= ional. Whether an > + implementation supports this fea= ture, can be > determined via > + the Attributes data member. > + @param[in,out] ProcedureArguments Allows the caller to pass a list= of > parameters to the code > + that is run by the AP. It is an = optional common mailbox > + between APs and the caller to sh= are information. > + @param[in,out] Token This is parameter is broken into= two > components: > + 1.Token->Completion is an option= al parameter that > allows the > + caller to execute the procedure = in a blocking or non- > blocking > + fashion. If it is NULL the call = is blocking, and the call will > + not return until the AP has comp= leted the procedure. If > the > + token is not NULL, the call will= return immediately. The > caller > + can check whether the procedure = has completed with > + CheckOnProcedure or WaitForProce= dure. > + 2.Token->Status The implementati= on updates the > address pointed > + at by this variable with the sta= tus code returned by > Procedure > + when it completes execution on t= he target AP, or with > EFI_TIMEOUT > + if the Procedure fails to comple= te within the optional > timeout. > + The implementation will update t= his variable with > EFI_NOT_READY > + prior to starting Procedure on t= he target AP. > + @param[in,out] CPUStatus This optional pointer may be use= d to get > the status code returned > + by Procedure when it completes e= xecution on the > target AP, or with > + EFI_TIMEOUT if the Procedure fai= ls to complete within > the optional > + timeout. The implementation will= update this variable > with > + EFI_NOT_READY prior to starting = Procedure on the > target AP. > + > + @retval EFI_SUCCESS In the blocking case, this indic= ates that > Procedure has completed > + execution on the target AP. > + In the non-blocking case this in= dicates that the > procedure has > + been successfully scheduled for = execution on the target > AP. > + @retval EFI_INVALID_PARAMETER The input arguments are out of > range. Either the target AP is the > + caller of the function, or the P= rocedure or Token is NULL > + @retval EFI_NOT_READY If the target AP is busy executi= ng another > procedure > + @retval EFI_ALREADY_STARTED Token is already in use for anot= her > procedure > + @retval EFI_TIMEOUT In blocking mode, the timeout ex= pired > before the specified AP > + has finished **/ typedef > +EFI_STATUS (EFIAPI *EFI_MM_DISPATCH_PROCEDURE) ( > + IN CONST EFI_MM_MP_PROTOCOL *This, > + IN EFI_AP_PROCEDURE2 Procedure, > + IN UINTN CpuNumber, > + IN UINTN TimeoutInMicroseconds, > + IN OUT VOID *ProcedureArguments OPTIONAL, > + IN OUT MM_COMPLETION *Token, > + IN OUT EFI_STATUS *CPUStatus > +); > + > +/** > + This service allows the caller to invoke a procedure on all running > +application processors (AP) > + except the caller. This function uses an optional token parameter to > +support blocking and > + nonblocking modes. If the token is passed into the call, the function > +will operate in a non-blocking > + fashion and the caller can check for completion with CheckOnProcedure = or > WaitForProcedure. > + > + It is not necessary for the implementation to run the procedure on eve= ry > processor on the platform. > + Processors that are powered down in such a way that they cannot > + respond to interrupts, may be excluded from the broadcast. > + > + > + @param[in] This The EFI_MM_MP_PROTOCOL instance. > + @param[in] Procedure A pointer to the code stream to = be run on > the APs that have > + entered MM. Type EFI_AP_PROCEDUR= E is defined > below in related > + definitions. > + @param[in] TimeoutInMicroseconds Indicates the time limit in > microseconds for the APs to finish > + execution of Procedure, either f= or blocking or non- > blocking mode. > + Zero means infinity. If the time= out expires before all > APs return > + from Procedure, then Procedure o= n the failed APs is > terminated. If > + the timeout expires in blocking = mode, the call returns > EFI_TIMEOUT. > + If the timeout expires in non-bl= ocking mode, the > timeout determined > + can be through CheckOnProcedure = or > WaitForProcedure. > + Note that timeout support is opt= ional. Whether an > implementation > + supports this feature can be det= ermined via the > Attributes data > + member. > + @param[in,out] ProcedureArguments Allows the caller to pass a list= of > parameters to the code > + that is run by the AP. It is an = optional common mailbox > + between APs and the caller to sh= are information. > + @param[in,out] Token This is parameter is broken into= two > components: > + 1.Token->Completion is an option= al parameter that > allows the > + caller to execute the procedure = in a blocking or non- > blocking > + fashion. If it is NULL the call = is blocking, and the call will > + not return until the AP has comp= leted the procedure. If > the > + token is not NULL, the call will= return immediately. The > caller > + can check whether the procedure = has completed with > + CheckOnProcedure or WaitForProce= dure. > + 2.Token->Status The implementati= on updates the > address pointed > + at by this variable with the sta= tus code returned by > Procedure > + when it completes execution on t= he target AP, or with > EFI_TIMEOUT > + if the Procedure fails to comple= te within the optional > timeout. > + The implementation will update t= his variable with > EFI_NOT_READY > + prior to starting Procedure on t= he target AP > + @param[in,out] CPUStatus This optional pointer may be use= d to get > the individual status > + returned by every AP that partic= ipated in the broadcast. > This > + parameter if used provides the b= ase address of an array > to hold > + the EFI_STATUS value of each AP = in the system. The size > of the > + array can be ascertained by the > GetNumberOfProcessors function. > + As mentioned above, the broadcas= t may not include > every processor > + in the system. Some implementati= ons may exclude > processors that > + have been powered down in such a= way that they are > not responsive > + to interrupts. Additionally the = broadcast excludes the > processor > + which is making the BroadcastPro= cedure call. For every > excluded > + processor, the array entry must > + contain a value of EFI_NOT_STARTED > + > + @retval EFI_SUCCESS In the blocking case, this indic= ates that > Procedure has completed > + execution on the APs. In the non= -blocking case this > indicates that > + the procedure has been successfu= lly scheduled for > execution on the > + APs. > + @retval EFI_INVALID_PARAMETER Procedure or Token is NULL. > + @retval EFI_NOT_READY If a target AP is busy executing= another > procedure. > + @retval EFI_TIMEOUT In blocking mode, the timeout ex= pired > before all enabled APs have > + finished. > + @retval EFI_ALREADY_STARTED Before the AP procedure associat= ed > with the Token is finished, the > + same Token cannot be used to dis= patch or broadcast > another procedure. > + > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *EFI_MM_BROADCAST_PROCEDURE) ( > + IN CONST EFI_MM_MP_PROTOCOL *This, > + IN EFI_AP_PROCEDURE2 Procedure, > + IN UINTN TimeoutInMicroseconds, > + IN OUT VOID *ProcedureArguments OPTIONAL, > + IN OUT MM_COMPLETION *Token, > + IN OUT EFI_STATUS *CPUStatus > +); > + > + > +/** > + This service allows the caller to set a startup procedure that will > +be executed when an AP powers > + up from a state where core configuration and context is lost. The > +procedure is execution has the > + following properties: > + 1. The procedure executes before the processor is handed over to the > operating system. > + 2. All processors execute the same startup procedure. > + 3. The procedure may run in parallel with other procedures invoked > +through the functions in this > + protocol, or with processors that are executing an MM handler or runni= ng > in the operating system. > + > + > + @param[in] This The EFI_MM_MP_PROTOCOL instance. > + @param[in] Procedure A pointer to the code stream to b= e run on > the designated target AP > + of the system. Type EFI_AP_PROCED= URE is defined > below in Volume 2 > + with the related definitions of > + EFI_MP_SERVICES_PROTOCOL.StartupA= llAPs. > + If caller may pass a value of NUL= L to deregister any > existing > + startup procedure. > + @param[in,out] ProcedureArguments Allows the caller to pass a list = of > parameters to the code that is > + run by the AP. It is an optional = common mailbox > between APs and > + the caller to share information > + > + @retval EFI_SUCCESS The Procedure has been set succes= sfully. > + @retval EFI_INVALID_PARAMETER The Procedure is NULL. > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *EFI_MM_SET_STARTUP_PROCEDURE) ( > + IN CONST EFI_MM_MP_PROTOCOL *This, > + IN EFI_AP_PROCEDURE Procedure, > + IN OUT VOID *ProcedureArguments OPTIONAL > +); > + > +/** > + When non-blocking execution of a procedure on an AP is invoked with > +DispatchProcedure, > + via the use of a token, this function can be used to check for complet= ion of > the procedure on the AP. > + The function takes the token that was passed into the > +DispatchProcedure call. If the procedure > + is complete, and therefore it is now possible to run another > +procedure on the same AP, this function > + returns EFI_SUCESS. In this case the status returned by the procedure > +that executed on the AP is > + returned in the token's Status field. If the procedure has not yet > +completed, then this function > + returns EFI_NOT_READY. > + > + When a non-blocking execution of a procedure is invoked with > + BroadcastProcedure, via the use of a token, this function can be used > + to check for completion of the procedure on all the broadcast APs. > + The function takes the token that was passed into the > + BroadcastProcedure call. If the procedure is complete on all > + broadcast APs this function returns EFI_SUCESS. In this case the Statu= s > field in the token passed into the function reflects the overall result o= f the > invocation, which may be EFI_SUCCESS, if all executions succeeded, or the > first observed failure. > + If the procedure has not yet completed on the broadcast APs, the > + function returns EFI_NOT_READY. > + > + @param[in] This The EFI_MM_MP_PROTOCOL instance. > + @param[in] Token This parameter describes the toke= n that was > passed into > + DispatchProcedure or BroadcastPro= cedure. > + > + @retval EFI_SUCCESS Procedure has completed. > + @retval EFI_NOT_READY The Procedure has not completed. > + @retval EFI_INVALID_PARAMETER Token or Token->Completion is > NULL > + @retval EFI_NOT_FOUND Token is not currently in use for= a non- > blocking call > + > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *EFI_CHECK_FOR_PROCEDURE) ( > + IN CONST EFI_MM_MP_PROTOCOL *This, > + IN MM_COMPLETION Token > +); > + > +/** > + When a non-blocking execution of a procedure on an AP is invoked via > +DispatchProcedure, > + this function will block the caller until the remote procedure has com= pleted > on the designated AP. > + The non-blocking procedure invocation is identified by the Token > +parameter, which must match the > + token that used when DispatchProcedure was called. Upon completion > +the status returned by > + the procedure that executed on the AP is used to update the token's > Status field. > + > + When a non-blocking execution of a procedure on an AP is invoked via > + BroadcastProcedure this function will block the caller until the > + remote procedure has completed on all of the APs that entered MM. The > + non-blocking procedure invocation is identified by the Token > + parameter, which must match the token that used when > + BroadcastProcedure was called. Upon completion the overall status > + returned by the procedures that executed on the broadcast AP is used to > update the token's Status field. The overall status may be EFI_SUCCESS, = if all > executions succeeded, or the first observed failure. > + > + > + @param[in] This The EFI_MM_MP_PROTOCOL instance. > + @param[in] Token This parameter describes the toke= n that was > passed into > + DispatchProcedure or BroadcastPro= cedure. > + > + @retval EFI_SUCCESS Procedure has completed. > + @retval EFI_INVALID_PARAMETER Token or Token->Completion is > NULL > + @retval EFI_NOT_FOUND Token is not currently in use for= a non- > blocking call > + > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *EFI_WAIT_FOR_PROCEDURE) ( > + IN CONST EFI_MM_MP_PROTOCOL *This, > + IN MM_COMPLETION Token > +); > + > + > + > +/// > +/// The MM MP protocol provides a set of functions to allow execution > +of procedures on processors that /// have entered MM. > +/// > +struct _EFI_MM_MP_PROTOCOL { > + UINT32 Revision; > + UINT32 Attributes; > + EFI_MM_GET_NUMBER_OF_PROCESSORS GetNumberOfProcessors; > + EFI_MM_DISPATCH_PROCEDURE DispatchProcedure; > + EFI_MM_BROADCAST_PROCEDURE BroadcastProcedure; > + EFI_MM_SET_STARTUP_PROCEDURE SetStartupProcedure; > + EFI_CHECK_FOR_PROCEDURE CheckForProcedure; > + EFI_WAIT_FOR_PROCEDURE WaitForProcedure; > +}; > + > +extern EFI_GUID gEfiMmMpProtocolGuid; > + > +#endif > + > diff --git a/MdePkg/Include/Protocol/SmmMp.h > b/MdePkg/Include/Protocol/SmmMp.h new file mode 100644 index > 0000000000..5f391a3860 > --- /dev/null > +++ b/MdePkg/Include/Protocol/SmmMp.h > @@ -0,0 +1,44 @@ > +/** @file > + EFI SMM MP Protocol is defined in the PI 1.5 specification. > + > + The SMM MP protocol provides a set of functions to allow execution of > + procedures on processors that have entered SMM. This protocol has the > following properties: > + 1. The caller can only invoke execution of a procedure on a processor, > other than the caller, that > + has also entered SMM. > + 2. It is possible to invoke a procedure on multiple processors. Suppor= ts > blocking and non-blocking > + modes of operation. > + > + Copyright (c) 2019, Intel Corporation. All rights reserved.
> + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef _SMM_MP_H_ > +#define _SMM_MP_H_ > + > +#include > + > +#define EFI_SMM_MP_PROTOCOL_GUID EFI_MM_MP_PROTOCOL_GUID > + > +#define EFI_SMM_MP_TIMEOUT_SUPPORTED > EFI_MM_MP_TIMEOUT_SUPPORTED > + > +#define EFI_SMM_MP_PROTOCOL_REVISION > EFI_MM_MP_PROTOCOL_REVISION > + > +typedef MM_COMPLETION SMM_COMPLETION; > + > +typedef MM_DISPATCH_COMPLETION_TOKEN > SMM_DISPATCH_COMPLETION_TOKEN; > + > +typedef EFI_MM_MP_PROTOCOL EFI_SMM_MP_PROTOCOL; > + > +typedef EFI_MM_GET_NUMBER_OF_PROCESSORS > +EFI_SMM_GET_NUMBER_OF_PROCESSORS; > + > +typedef EFI_MM_DISPATCH_PROCEDURE > EFI_SMM_DISPATCH_PROCEDURE; > + > +typedef EFI_MM_BROADCAST_PROCEDURE > EFI_SMM_BROADCAST_PROCEDURE; > + > +typedef EFI_MM_SET_STARTUP_PROCEDURE > EFI_SMM_SET_STARTUP_PROCEDURE; > + > +extern EFI_GUID gEfiSmmMpProtocolGuid; > + > +#endif > + > diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec index > 6c563375ee..0b8da9f2cb 100644 > --- a/MdePkg/MdePkg.dec > +++ b/MdePkg/MdePkg.dec > @@ -1167,6 +1167,12 @@ > # Protocols defined in PI 1.5. > # >=20 > + ## Include/Protocol/SmmMp.h > + gEfiSmmMpProtocolGuid =3D { 0x5d5450d7, 0x990c, 0x4180, { 0xa8, 0x3, > + 0x8e, 0x63, 0xf0, 0x60, 0x83, 0x7 }} > + > + ## Include/Protocol/MmMp.h > + gEfiMmMpProtocolGuid =3D { 0x5d5450d7, 0x990c, 0x4180, { 0xa8, 0x3, > + 0x8e, 0x63, 0xf0, 0x60, 0x83, 0x7 }} > + > ## Include/Protocol/MmEndOfDxe.h > gEfiMmEndOfDxeProtocolGuid =3D { 0x24e70042, 0xd5c5, 0x4260, { 0x8c, 0= x39, > 0xa, 0xd3, 0xaa, 0x32, 0xe9, 0x3d }} >=20 > -- > 2.21.0.windows.1