diff options
author | Yao, Jiewen <Jiewen.Yao@intel.com> | 2015-05-22 07:49:34 +0000 |
---|---|---|
committer | jyao1 <jyao1@Edk2> | 2015-05-22 07:49:34 +0000 |
commit | f0abe42fd77c07ea06b24efe5bf861f5c49c8559 (patch) | |
tree | c32965fc68dc16fae5199fdf77b412e330bfa3af /IntelFspPkg/FspSecCore | |
parent | e7401ee1af263ff946a57f047124241fa4f01cd5 (diff) | |
download | edk2-platforms-f0abe42fd77c07ea06b24efe5bf861f5c49c8559.tar.xz |
IntelFspPkg/FspSecCore add AsmGetFspBaseAddressNoStack and AsmGetFspInfoHeaderNoStack
Fix GCC issue on FspInfoHeaderRelativeOff.
Clean up comments for platform ID matching on Microcode and PcdFspBootFirmwareVolumeBase
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: "Yao, Jiewen" <Jiewen.Yao@intel.com>
Reviewed-by: "Rangarajan, Ravi P" <ravi.p.rangarajan@intel.com>
Reviewed-by: "Mudusuru, Giri P" <giri.p.mudusuru@intel.com>
Reviewed-by: "Ma, Maurice" <maurice.ma@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17496 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'IntelFspPkg/FspSecCore')
-rw-r--r-- | IntelFspPkg/FspSecCore/Ia32/FspApiEntry.asm | 6 | ||||
-rw-r--r-- | IntelFspPkg/FspSecCore/Ia32/FspApiEntry.s | 6 | ||||
-rw-r--r-- | IntelFspPkg/FspSecCore/Ia32/FspHelper.asm | 34 | ||||
-rw-r--r-- | IntelFspPkg/FspSecCore/Ia32/FspHelper.s | 39 |
4 files changed, 76 insertions, 9 deletions
diff --git a/IntelFspPkg/FspSecCore/Ia32/FspApiEntry.asm b/IntelFspPkg/FspSecCore/Ia32/FspApiEntry.asm index a0c9b1ed73..d0e56b2360 100644 --- a/IntelFspPkg/FspSecCore/Ia32/FspApiEntry.asm +++ b/IntelFspPkg/FspSecCore/Ia32/FspApiEntry.asm @@ -143,8 +143,8 @@ check_main_header: mov ecx, MSR_IA32_PLATFORM_ID
rdmsr
mov ecx, edx
- shr ecx, 50-32
- and ecx, 7h
+ shr ecx, 50-32 ; shift (50d-32d=18d=0x12) bits
+ and ecx, 7h ; platform id at bit[52..50]
mov edx, 1
shl edx, cl
@@ -569,7 +569,7 @@ FspApiCommon PROC C PUBLIC ;
; Pass BFV into the PEI Core
; It uses relative address to calucate the actual boot FV base
- ; For FSP impleantion with single FV, PcdFlashFvRecoveryBase and
+ ; For FSP implementation with single FV, PcdFspBootFirmwareVolumeBase and
; PcdFspAreaBaseAddress are the same. For FSP with mulitple FVs,
; they are different. The code below can handle both cases.
;
diff --git a/IntelFspPkg/FspSecCore/Ia32/FspApiEntry.s b/IntelFspPkg/FspSecCore/Ia32/FspApiEntry.s index 8f4093ca19..d9cfcc3390 100644 --- a/IntelFspPkg/FspSecCore/Ia32/FspApiEntry.s +++ b/IntelFspPkg/FspSecCore/Ia32/FspApiEntry.s @@ -297,8 +297,8 @@ CheckMainHeader: movl $MSR_IA32_PLATFORM_ID, %ecx
rdmsr
movl %edx, %ecx
- shrl $0x12, %ecx #($50-$32)
- andl $0x07, %ecx
+ shrl $0x12, %ecx # shift (50d-32d=18d=0x12) bits
+ andl $0x07, %ecx # platform id at bit[52..50]
movl $0x01, %edx
shll %cl,%edx
@@ -784,7 +784,7 @@ FspApiCommonL2: #
# Pass BFV into the PEI Core
# It uses relative address to calucate the actual boot FV base
- # For FSP impleantion with single FV, PcdFlashFvRecoveryBase and
+ # For FSP implementation with single FV, PcdFspBootFirmwareVolumeBase and
# PcdFspAreaBaseAddress are the same. For FSP with mulitple FVs,
# they are different. The code below can handle both cases.
#
diff --git a/IntelFspPkg/FspSecCore/Ia32/FspHelper.asm b/IntelFspPkg/FspSecCore/Ia32/FspHelper.asm index 8efea01aae..b991386c77 100644 --- a/IntelFspPkg/FspSecCore/Ia32/FspHelper.asm +++ b/IntelFspPkg/FspSecCore/Ia32/FspHelper.asm @@ -15,6 +15,10 @@ .model flat,C
.code
+;
+; FspInfoHeaderRelativeOff is patched during build process and initialized to offset of the AsmGetFspBaseAddress
+; from the FSP Info header.
+;
FspInfoHeaderRelativeOff PROC NEAR PUBLIC
;
; This value will be pached by the build script
@@ -22,6 +26,11 @@ FspInfoHeaderRelativeOff PROC NEAR PUBLIC DD 012345678h
FspInfoHeaderRelativeOff ENDP
+;
+; Returns FSP Base Address.
+;
+; This function gets the FSP Info Header using relative addressing and returns the FSP Base from the header structure
+;
AsmGetFspBaseAddress PROC NEAR PUBLIC
mov eax, AsmGetFspBaseAddress
sub eax, dword ptr [FspInfoHeaderRelativeOff]
@@ -30,10 +39,35 @@ AsmGetFspBaseAddress PROC NEAR PUBLIC ret
AsmGetFspBaseAddress ENDP
+;
+; No stack counter part of AsmGetFspBaseAddress. Return address is in edi.
+;
+AsmGetFspBaseAddressNoStack PROC NEAR PUBLIC
+ mov eax, AsmGetFspBaseAddress
+ sub eax, dword ptr [FspInfoHeaderRelativeOff]
+ add eax, 01Ch
+ mov eax, dword ptr [eax]
+ jmp edi
+AsmGetFspBaseAddressNoStack ENDP
+
+;
+; Returns FSP Info Header.
+;
+; This function gets the FSP Info Header using relative addressing and returns it
+;
AsmGetFspInfoHeader PROC NEAR PUBLIC
mov eax, AsmGetFspBaseAddress
sub eax, dword ptr [FspInfoHeaderRelativeOff]
ret
AsmGetFspInfoHeader ENDP
+;
+; No stack counter part of AsmGetFspInfoHeader. Return address is in edi.
+;
+AsmGetFspInfoHeaderNoStack PROC NEAR PUBLIC
+ mov eax, AsmGetFspBaseAddress
+ sub eax, dword ptr [FspInfoHeaderRelativeOff]
+ jmp edi
+AsmGetFspInfoHeaderNoStack ENDP
+
END
\ No newline at end of file diff --git a/IntelFspPkg/FspSecCore/Ia32/FspHelper.s b/IntelFspPkg/FspSecCore/Ia32/FspHelper.s index a6cf36259d..55d8ae75c0 100644 --- a/IntelFspPkg/FspSecCore/Ia32/FspHelper.s +++ b/IntelFspPkg/FspSecCore/Ia32/FspHelper.s @@ -15,6 +15,10 @@ #
#------------------------------------------------------------------------------
+#
+# FspInfoHeaderRelativeOff is patched during build process and initialized to offset of the AsmGetFspBaseAddress
+# from the FSP Info header.
+#
ASM_GLOBAL ASM_PFX(FspInfoHeaderRelativeOff)
ASM_PFX(FspInfoHeaderRelativeOff):
#
@@ -22,17 +26,46 @@ ASM_PFX(FspInfoHeaderRelativeOff): #
.long 0x012345678
-
+#
+# Returns FSP Base Address.
+#
+# This function gets the FSP Info Header using relative addressing and returns the FSP Base from the header structure
+#
ASM_GLOBAL ASM_PFX(AsmGetFspBaseAddress)
ASM_PFX(AsmGetFspBaseAddress):
mov $AsmGetFspBaseAddress, %eax
- sub $FspInfoHeaderRelativeOff, %eax
+ sub FspInfoHeaderRelativeOff, %eax
add $0x01C, %eax
mov (%eax), %eax
ret
+#
+# No stack counter part of AsmGetFspBaseAddress. Return address is in edi.
+#
+ASM_GLOBAL ASM_PFX(AsmGetFspBaseAddressNoStack)
+ASM_PFX(AsmGetFspBaseAddressNoStack):
+ mov $AsmGetFspBaseAddress, %eax
+ sub FspInfoHeaderRelativeOff, %eax
+ add $0x01C, %eax
+ mov (%eax), %eax
+ jmp *%edi
+
+#
+# Returns FSP Info Header.
+#
+# This function gets the FSP Info Header using relative addressing and returns it
+#
ASM_GLOBAL ASM_PFX(AsmGetFspInfoHeader)
ASM_PFX(AsmGetFspInfoHeader):
mov $AsmGetFspBaseAddress, %eax
- sub $FspInfoHeaderRelativeOff, %eax
+ sub FspInfoHeaderRelativeOff, %eax
ret
+
+#
+# No stack counter part of AsmGetFspInfoHeader. Return address is in edi.
+#
+ASM_GLOBAL ASM_PFX(AsmGetFspInfoHeaderNoStack)
+ASM_PFX(AsmGetFspInfoHeaderNoStack):
+ mov $AsmGetFspBaseAddress, %eax
+ sub FspInfoHeaderRelativeOff, %eax
+ jmp *%edi
|