From nobody Tue May 14 05:46:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+87528+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+87528+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1647231767824245.11313133758756; Sun, 13 Mar 2022 21:22:47 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id jtcPYY1788612xMBh5KOXyyz; Sun, 13 Mar 2022 21:22:48 -0700 X-Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by mx.groups.io with SMTP id smtpd.web12.22895.1647231766669016211 for ; Sun, 13 Mar 2022 21:22:47 -0700 X-IronPort-AV: E=McAfee;i="6200,9189,10285"; a="255660514" X-IronPort-AV: E=Sophos;i="5.90,179,1643702400"; d="scan'208";a="255660514" X-Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Mar 2022 21:22:45 -0700 X-IronPort-AV: E=Sophos;i="5.90,179,1643702400"; d="scan'208";a="634052024" X-Received: from tedkuo1-win10.gar.corp.intel.com ([10.5.215.13]) by fmsmga003-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Mar 2022 21:22:44 -0700 From: "Kuo, Ted" To: devel@edk2.groups.io Cc: Chasel Chiu , Nate DeSimone , Star Zeng , Ashraf Ali S Subject: [edk2-devel][PATCH] IntelFsp2Pkg: BaseFspCommonLib Support for X64 Date: Mon, 14 Mar 2022 12:22:38 +0800 Message-Id: Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,ted.kuo@intel.com X-Gm-Message-State: ud5zSUPyOa0xeywP0yqgFIDHx1787277AA= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1647231768; bh=wpzv9G64l8b0vuy60F7JTwi2qJo2aN63fWgjWqAfzIU=; h=Cc:Date:From:Reply-To:Subject:To; b=w7gu4KY6O/ZB88rRWZ8U9Z0r5O8Lty1Q93Pb8J7qwRhIE7aextnC4zSdVguEyhngIeR UaCIlgy9z1C9FN8YWHjc371fyUbswEIXyo9c+fPnMiNHs63rqgc40VV/rApUAaUv0efHj X/FAQQJnnRPsdQhL5JBln5l72TXBhOQT7bI= X-ZohoMail-DKIM: fail (Signature date is -1 seconds in the future.) X-ZM-MESSAGEID: 1647231797150100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3D3867 Add BaseFspCommonLib Support for X64. Cc: Chasel Chiu Cc: Nate DeSimone Cc: Star Zeng Cc: Ashraf Ali S Signed-off-by: Ted Kuo Reviewed-by: Chasel Chiu --- IntelFsp2Pkg/FspSecCore/SecFsp.c | 2 +- IntelFsp2Pkg/FspSecCore/SecFsp.h | 2 +- IntelFsp2Pkg/Include/FspGlobalData.h | 2 +- IntelFsp2Pkg/Include/Library/FspCommonLib.h | 6 +- .../Library/BaseFspCommonLib/FspCommonLib.c | 65 +++++++++++++-----= ---- 5 files changed, 45 insertions(+), 32 deletions(-) diff --git a/IntelFsp2Pkg/FspSecCore/SecFsp.c b/IntelFsp2Pkg/FspSecCore/Sec= Fsp.c index f79d45900e..68e588dd41 100644 --- a/IntelFsp2Pkg/FspSecCore/SecFsp.c +++ b/IntelFsp2Pkg/FspSecCore/SecFsp.c @@ -217,7 +217,7 @@ FspGlobalDataInit ( **/ VOID FspDataPointerFixUp ( - IN UINT32 OffsetGap + IN UINTN OffsetGap ) { FSP_GLOBAL_DATA *NewFspData; diff --git a/IntelFsp2Pkg/FspSecCore/SecFsp.h b/IntelFsp2Pkg/FspSecCore/Sec= Fsp.h index aacd32f7f7..7c9be85fe0 100644 --- a/IntelFsp2Pkg/FspSecCore/SecFsp.h +++ b/IntelFsp2Pkg/FspSecCore/SecFsp.h @@ -61,7 +61,7 @@ FspGlobalDataInit ( **/ VOID FspDataPointerFixUp ( - IN UINT32 OffsetGap + IN UINTN OffsetGap ); =20 /** diff --git a/IntelFsp2Pkg/Include/FspGlobalData.h b/IntelFsp2Pkg/Include/Fs= pGlobalData.h index 71033121c4..2b534075ae 100644 --- a/IntelFsp2Pkg/Include/FspGlobalData.h +++ b/IntelFsp2Pkg/Include/FspGlobalData.h @@ -42,7 +42,7 @@ typedef struct { UINT32 Signature; UINT8 Version; UINT8 Reserved1[3]; - UINT32 CoreStack; + UINTN CoreStack; UINT32 StatusCode; UINT32 Reserved2[8]; FSP_PLAT_DATA PlatformData; diff --git a/IntelFsp2Pkg/Include/Library/FspCommonLib.h b/IntelFsp2Pkg/Inc= lude/Library/FspCommonLib.h index c70039d9e8..b5e38568e2 100644 --- a/IntelFsp2Pkg/Include/Library/FspCommonLib.h +++ b/IntelFsp2Pkg/Include/Library/FspCommonLib.h @@ -38,7 +38,7 @@ GetFspGlobalDataPointer ( =20 @retval ApiParameter FSP API first parameter passed by the bootloader. **/ -UINT32 +UINTN EFIAPI GetFspApiParameter ( VOID @@ -49,7 +49,7 @@ GetFspApiParameter ( =20 @retval ApiParameter FSP API second parameter passed by the bootloader. **/ -UINT32 +UINTN EFIAPI GetFspApiParameter2 ( VOID @@ -87,7 +87,7 @@ SetFspApiParameter ( VOID EFIAPI SetFspApiReturnStatus ( - IN UINT32 ReturnStatus + IN UINTN ReturnStatus ); =20 /** diff --git a/IntelFsp2Pkg/Library/BaseFspCommonLib/FspCommonLib.c b/IntelFs= p2Pkg/Library/BaseFspCommonLib/FspCommonLib.c index 8f8453915e..cd10b63c95 100644 --- a/IntelFsp2Pkg/Library/BaseFspCommonLib/FspCommonLib.c +++ b/IntelFsp2Pkg/Library/BaseFspCommonLib/FspCommonLib.c @@ -30,21 +30,34 @@ typedef struct { UINT16 IdtrLimit; UINT32 IdtrBase; UINT16 Reserved; - UINT32 Edi; - UINT32 Esi; - UINT32 Ebp; - UINT32 Esp; - UINT32 Ebx; - UINT32 Edx; - UINT32 Ecx; - UINT32 Eax; + UINT32 Registers[8]; // General Purpose Registers: Edi, Esi, Ebp, E= sp, Ebx, Edx, Ecx and Eax UINT16 Flags[2]; UINT32 FspInfoHeader; UINT32 ApiRet; UINT32 ApiParam[2]; } CONTEXT_STACK; =20 -#define CONTEXT_STACK_OFFSET(x) (UINT32)&((CONTEXT_STACK *)(UINTN)0)->x +// +// API return address +0xB0 +// push API Parameter2 +0xA8 +// push API Parameter1 +0xA0 +// push FspInfoHeader +0x98 +// pushfq +0x90 +// cli +// PUSHA_64 +0x10 +// sub rsp, 16 +0x00 +// sidt [rsp] +// +typedef struct { + UINT64 Idtr[2]; // IDTR Limit - bit0:bi15, IDTR Base - bit16:b= it79 + UINT64 Registers[16]; // General Purpose Registers: RDI, RSI, RBP, R= SP, RBX, RDX, RCX, RAX, and R15 to R8 + UINT32 Flags[2]; + UINT64 FspInfoHeader; + UINT64 ApiParam[2]; + UINT64 ApiRet; // 64bit stack format is different from the 32= bit one due to x64 calling convention +} CONTEXT_STACK_64; + +#define CONTEXT_STACK_OFFSET(x) (sizeof(UINTN) =3D=3D sizeof (UINT32) ? (= UINTN)&((CONTEXT_STACK *)(UINTN)0)->x : (UINTN)&((CONTEXT_STACK_64 *)(UINTN= )0)->x) =20 #pragma pack() =20 @@ -85,7 +98,7 @@ GetFspGlobalDataPointer ( =20 @retval ApiParameter FSP API first parameter passed by the bootloader. **/ -UINT32 +UINTN EFIAPI GetFspApiParameter ( VOID @@ -94,7 +107,7 @@ GetFspApiParameter ( FSP_GLOBAL_DATA *FspData; =20 FspData =3D GetFspGlobalDataPointer (); - return *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET (Api= Param[0])); + return *(UINTN *)(FspData->CoreStack + CONTEXT_STACK_OFFSET (ApiParam[0]= )); } =20 /** @@ -119,7 +132,7 @@ GetFspEntryStack ( =20 @retval ApiParameter FSP API second parameter passed by the bootloader. **/ -UINT32 +UINTN EFIAPI GetFspApiParameter2 ( VOID @@ -128,7 +141,7 @@ GetFspApiParameter2 ( FSP_GLOBAL_DATA *FspData; =20 FspData =3D GetFspGlobalDataPointer (); - return *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET (Api= Param[1])); + return *(UINTN *)(FspData->CoreStack + CONTEXT_STACK_OFFSET (ApiParam[1]= )); } =20 /** @@ -145,8 +158,8 @@ SetFspApiParameter ( { FSP_GLOBAL_DATA *FspData; =20 - FspData = =3D GetFspGlobalDataPointer (); - *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET (ApiParam))= =3D Value; + FspData =3D Get= FspGlobalDataPointer (); + *(UINTN *)(FspData->CoreStack + CONTEXT_STACK_OFFSET (ApiParam)) =3D Val= ue; } =20 /** @@ -158,13 +171,13 @@ SetFspApiParameter ( VOID EFIAPI SetFspApiReturnStatus ( - IN UINT32 ReturnStatus + IN UINTN ReturnStatus ) { FSP_GLOBAL_DATA *FspData; =20 - FspData =3D = GetFspGlobalDataPointer (); - *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET (Eax)) =3D = ReturnStatus; + FspData =3D= GetFspGlobalDataPointer (); + *(UINTN *)(FspData->CoreStack + CONTEXT_STACK_OFFSET (Registers[7])) =3D= ReturnStatus; } =20 /** @@ -180,19 +193,19 @@ SetFspCoreStackPointer ( ) { FSP_GLOBAL_DATA *FspData; - UINT32 *OldStack; - UINT32 *NewStack; + UINTN *OldStack; + UINTN *NewStack; UINT32 StackContextLen; =20 FspData =3D GetFspGlobalDataPointer (); - StackContextLen =3D sizeof (CONTEXT_STACK) / sizeof (UINT32); + StackContextLen =3D sizeof(CONTEXT_STACK) / sizeof(UINTN); =20 // // Reserve space for the ContinuationFunc two parameters // - OldStack =3D (UINT32 *)FspData->CoreStack; - NewStack =3D (UINT32 *)NewStackTop - StackContextLen - 2; - FspData->CoreStack =3D (UINT32)NewStack; + OldStack =3D (UINTN *)FspData->CoreStack; + NewStack =3D (UINTN *)NewStackTop - StackContextLen - 2; + FspData->CoreStack =3D (UINTN)NewStack; while (StackContextLen-- !=3D 0) { *NewStack++ =3D *OldStack++; } @@ -427,7 +440,7 @@ GetFspInfoHeaderFromApiContext ( FSP_GLOBAL_DATA *FspData; =20 FspData =3D GetFspGlobalDataPointer (); - return (FSP_INFO_HEADER *)(*(UINT32 *)(UINTN)(FspData->CoreStack + CONTE= XT_STACK_OFFSET (FspInfoHeader))); + return (FSP_INFO_HEADER *)(*(UINTN *)(FspData->CoreStack + CONTEXT_STACK= _OFFSET (FspInfoHeader))); } =20 /** @@ -444,7 +457,7 @@ GetFspCfgRegionDataPointer ( FSP_INFO_HEADER *FspInfoHeader; =20 FspInfoHeader =3D GetFspInfoHeader (); - return (VOID *)(FspInfoHeader->ImageBase + FspInfoHeader->CfgRegionOffse= t); + return (VOID *)(UINTN)(FspInfoHeader->ImageBase + FspInfoHeader->CfgRegi= onOffset); } =20 /** --=20 2.16.2.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#87528): https://edk2.groups.io/g/devel/message/87528 Mute This Topic: https://groups.io/mt/89766844/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-