[PATCH] IntelFsp2Pkg: TempRamInit API should preserve EBX/RBX register.


Chiu, Chasel
 

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D4395

FSP specification defines the TempRamInit API preserved register list
which including EBX/RBX, however current implementation unexpectedly
overriding EBX/RBX register that should be fixed.

Cc: Nate DeSimone <nathaniel.l.desimone@...>
Cc: Star Zeng <star.zeng@...>
Signed-off-by: Chasel Chiu <chasel.chiu@...>
---
IntelFsp2Pkg/FspSecCore/Ia32/SaveRestoreSseNasm.inc | 7 +++++++
IntelFsp2Pkg/Include/SaveRestoreSseAvxNasm.inc | 21 +++++++++++++++++=
+++-
2 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/IntelFsp2Pkg/FspSecCore/Ia32/SaveRestoreSseNasm.inc b/IntelFsp=
2Pkg/FspSecCore/Ia32/SaveRestoreSseNasm.inc
index a222f2e376..016f943b43 100644
--- a/IntelFsp2Pkg/FspSecCore/Ia32/SaveRestoreSseNasm.inc
+++ b/IntelFsp2Pkg/FspSecCore/Ia32/SaveRestoreSseNasm.inc
@@ -157,6 +157,9 @@ NextAddress:
; Use CpuId instruction (CPUID.01H:EDX.SSE[bit 25] =3D 1) to t=
est=0D
; whether the processor supports SSE instruction.=0D
;=0D
+ ; Save EBX to MM2=0D
+ ;=0D
+ movd mm2, ebx=0D
mov eax, 1=0D
cpuid=0D
bt edx, 25=0D
@@ -169,6 +172,10 @@ NextAddress:
bt ecx, 19=0D
jnc SseError=0D
%endif=0D
+ ;=0D
+ ; Restore EBX from MM2=0D
+ ;=0D
+ movd ebx, mm2=0D
=0D
;=0D
; Set OSFXSR bit (bit #9) & OSXMMEXCPT bit (bit #10)=0D
diff --git a/IntelFsp2Pkg/Include/SaveRestoreSseAvxNasm.inc b/IntelFsp2Pkg/=
Include/SaveRestoreSseAvxNasm.inc
index 38c807a311..002a5a1412 100644
--- a/IntelFsp2Pkg/Include/SaveRestoreSseAvxNasm.inc
+++ b/IntelFsp2Pkg/Include/SaveRestoreSseAvxNasm.inc
@@ -255,6 +255,10 @@ NextAddress:
; Use CpuId instruction (CPUID.01H:EDX.SSE[bit 25] =3D 1) to t=
est=0D
; whether the processor supports SSE instruction.=0D
;=0D
+ ; Save RBX to R11=0D
+ ; Save RCX to R10=0D
+ ;=0D
+ mov r11, rbx=0D
mov r10, rcx=0D
mov rax, 1=0D
cpuid=0D
@@ -266,7 +270,12 @@ NextAddress:
;=0D
bt ecx, 19=0D
jnc SseError=0D
- mov rcx, r10=0D
+ ;=0D
+ ; Restore RBX from R11=0D
+ ; Restore RCX from R10=0D
+ ;=0D
+ mov rbx, r11=0D
+ mov rcx, r10=0D
=0D
;=0D
; Set OSFXSR bit (bit #9) & OSXMMEXCPT bit (bit #10)=0D
@@ -284,6 +293,11 @@ NextAddress:
%endmacro=0D
=0D
%macro ENABLE_AVX 0=0D
+ ;=0D
+ ; Save RBX to R11=0D
+ ; Save RCX to R10=0D
+ ;=0D
+ mov r11, rbx=0D
mov r10, rcx=0D
mov eax, 1=0D
cpuid=0D
@@ -307,6 +321,11 @@ EnableAvx:
xgetbv ; result in edx:eax=0D
or eax, 00000006h ; Set XCR0 bit #1 and bit #2 to enable =
SSE state and AVX state=0D
xsetbv=0D
+ ;=0D
+ ; Restore RBX from R11=0D
+ ; Restore RCX from R10=0D
+ ;=0D
+ mov rbx, r11=0D
mov rcx, r10=0D
%endmacro=0D
=0D
--=20
2.35.0.windows.1


Nate DeSimone
 

Reviewed-by: Nate DeSimone <nathaniel.l.desimone@...>

-----Original Message-----
From: Chiu, Chasel <chasel.chiu@...>
Sent: Friday, March 31, 2023 4:16 PM
To: devel@edk2.groups.io
Cc: Chiu, Chasel <chasel.chiu@...>; Desimone, Nathaniel L <nathaniel.l.desimone@...>; Zeng, Star <star.zeng@...>
Subject: [PATCH] IntelFsp2Pkg: TempRamInit API should preserve EBX/RBX register.

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4395

FSP specification defines the TempRamInit API preserved register list which including EBX/RBX, however current implementation unexpectedly overriding EBX/RBX register that should be fixed.

Cc: Nate DeSimone <nathaniel.l.desimone@...>
Cc: Star Zeng <star.zeng@...>
Signed-off-by: Chasel Chiu <chasel.chiu@...>
---
IntelFsp2Pkg/FspSecCore/Ia32/SaveRestoreSseNasm.inc | 7 +++++++
IntelFsp2Pkg/Include/SaveRestoreSseAvxNasm.inc | 21 ++++++++++++++++++++-
2 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/IntelFsp2Pkg/FspSecCore/Ia32/SaveRestoreSseNasm.inc b/IntelFsp2Pkg/FspSecCore/Ia32/SaveRestoreSseNasm.inc
index a222f2e376..016f943b43 100644
--- a/IntelFsp2Pkg/FspSecCore/Ia32/SaveRestoreSseNasm.inc
+++ b/IntelFsp2Pkg/FspSecCore/Ia32/SaveRestoreSseNasm.inc
@@ -157,6 +157,9 @@ NextAddress:
; Use CpuId instruction (CPUID.01H:EDX.SSE[bit 25] = 1) to test
; whether the processor supports SSE instruction.
;
+ ; Save EBX to MM2
+ ;
+ movd mm2, ebx
mov eax, 1
cpuid
bt edx, 25
@@ -169,6 +172,10 @@ NextAddress:
bt ecx, 19
jnc SseError
%endif
+ ;
+ ; Restore EBX from MM2
+ ;
+ movd ebx, mm2

;
; Set OSFXSR bit (bit #9) & OSXMMEXCPT bit (bit #10)
diff --git a/IntelFsp2Pkg/Include/SaveRestoreSseAvxNasm.inc b/IntelFsp2Pkg/Include/SaveRestoreSseAvxNasm.inc
index 38c807a311..002a5a1412 100644
--- a/IntelFsp2Pkg/Include/SaveRestoreSseAvxNasm.inc
+++ b/IntelFsp2Pkg/Include/SaveRestoreSseAvxNasm.inc
@@ -255,6 +255,10 @@ NextAddress:
; Use CpuId instruction (CPUID.01H:EDX.SSE[bit 25] = 1) to test
; whether the processor supports SSE instruction.
;
+ ; Save RBX to R11
+ ; Save RCX to R10
+ ;
+ mov r11, rbx
mov r10, rcx
mov rax, 1
cpuid
@@ -266,7 +270,12 @@ NextAddress:
;
bt ecx, 19
jnc SseError
- mov rcx, r10
+ ;
+ ; Restore RBX from R11
+ ; Restore RCX from R10
+ ;
+ mov rbx, r11
+ mov rcx, r10

;
; Set OSFXSR bit (bit #9) & OSXMMEXCPT bit (bit #10)
@@ -284,6 +293,11 @@ NextAddress:
%endmacro

%macro ENABLE_AVX 0
+ ;
+ ; Save RBX to R11
+ ; Save RCX to R10
+ ;
+ mov r11, rbx
mov r10, rcx
mov eax, 1
cpuid
@@ -307,6 +321,11 @@ EnableAvx:
xgetbv ; result in edx:eax
or eax, 00000006h ; Set XCR0 bit #1 and bit #2 to enable SSE state and AVX state
xsetbv
+ ;
+ ; Restore RBX from R11
+ ; Restore RCX from R10
+ ;
+ mov rbx, r11
mov rcx, r10
%endmacro

--
2.35.0.windows.1


Chiu, Chasel
 

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Chiu, Chasel
Sent: Friday, March 31, 2023 4:16 PM
To: devel@edk2.groups.io
Cc: Chiu, Chasel <chasel.chiu@...>; Desimone, Nathaniel L
<nathaniel.l.desimone@...>; Zeng, Star <star.zeng@...>
Subject: [edk2-devel] [PATCH] IntelFsp2Pkg: TempRamInit API should preserve
EBX/RBX register.

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4395

FSP specification defines the TempRamInit API preserved register list which
including EBX/RBX, however current implementation unexpectedly overriding
EBX/RBX register that should be fixed.

Cc: Nate DeSimone <nathaniel.l.desimone@...>
Cc: Star Zeng <star.zeng@...>
Signed-off-by: Chasel Chiu <chasel.chiu@...>
---
IntelFsp2Pkg/FspSecCore/Ia32/SaveRestoreSseNasm.inc | 7 +++++++
IntelFsp2Pkg/Include/SaveRestoreSseAvxNasm.inc | 21
++++++++++++++++++++-
2 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/IntelFsp2Pkg/FspSecCore/Ia32/SaveRestoreSseNasm.inc
b/IntelFsp2Pkg/FspSecCore/Ia32/SaveRestoreSseNasm.inc
index a222f2e376..016f943b43 100644
--- a/IntelFsp2Pkg/FspSecCore/Ia32/SaveRestoreSseNasm.inc
+++ b/IntelFsp2Pkg/FspSecCore/Ia32/SaveRestoreSseNasm.inc
@@ -157,6 +157,9 @@ NextAddress:
; Use CpuId instruction (CPUID.01H:EDX.SSE[bit 25] = 1) to test ;
whether the processor supports SSE instruction. ;+ ; Save EBX to
MM2+ ;+ movd mm2, ebx mov eax, 1 cpuid
bt edx, 25@@ -169,6 +172,10 @@ NextAddress:
bt ecx, 19 jnc SseError %endif+ ;+ ; Restore EBX
from MM2+ ;+ movd ebx, mm2 ; ; Set OSFXSR bit (bit
#9) & OSXMMEXCPT bit (bit #10)diff --git
a/IntelFsp2Pkg/Include/SaveRestoreSseAvxNasm.inc
b/IntelFsp2Pkg/Include/SaveRestoreSseAvxNasm.inc
index 38c807a311..002a5a1412 100644
--- a/IntelFsp2Pkg/Include/SaveRestoreSseAvxNasm.inc
+++ b/IntelFsp2Pkg/Include/SaveRestoreSseAvxNasm.inc
@@ -255,6 +255,10 @@ NextAddress:
; Use CpuId instruction (CPUID.01H:EDX.SSE[bit 25] = 1) to test ;
whether the processor supports SSE instruction. ;+ ; Save RBX to
R11+ ; Save RCX to R10+ ;+ mov r11, rbx mov r10,
rcx mov rax, 1 cpuid@@ -266,7 +270,12 @@ NextAddress:
; bt ecx, 19 jnc SseError- mov rcx,
r10+ ;+ ; Restore RBX from R11+ ; Restore RCX from
R10+ ;+ mov rbx, r11+ mov rcx, r10 ; ; Set
OSFXSR bit (bit #9) & OSXMMEXCPT bit (bit #10)@@ -284,6 +293,11 @@
NextAddress:
%endmacro %macro ENABLE_AVX 0+ ;+ ; Save RBX to
R11+ ; Save RCX to R10+ ;+ mov r11, rbx mov r10,
rcx mov eax, 1 cpuid@@ -307,6 +321,11 @@ EnableAvx:
xgetbv ; result in edx:eax or eax, 00000006h ; Set XCR0
bit #1 and bit #2 to enable SSE state and AVX state xsetbv+ ;+ ;
Restore RBX from R11+ ; Restore RCX from R10+ ;+ mov rbx,
r11 mov rcx, r10 %endmacro --
2.35.0.windows.1



-=-=-=-=-=-=
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#102337): https://edk2.groups.io/g/devel/message/102337
Mute This Topic: https://groups.io/mt/97984838/1777047
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [chasel.chiu@...] -=-
=-=-=-=-=


Michael D Kinney
 

What compiler is being used for this IPU?

Mike

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Chiu, Chasel
Sent: Tuesday, April 4, 2023 9:51 AM
To: devel@edk2.groups.io; Chiu, Chasel <chasel.chiu@...>
Cc: Desimone, Nathaniel L <nathaniel.l.desimone@...>; Zeng, Star <star.zeng@...>
Subject: Re: [edk2-devel] [PATCH] IntelFsp2Pkg: TempRamInit API should preserve EBX/RBX register.


Patch merged:
https://github.com/tianocore/edk2/commit/af98f1fb0311d8e3cc52ab9fc544a8c8ff8f7546

Thanks,
Chasel


-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Chiu, Chasel
Sent: Friday, March 31, 2023 4:16 PM
To: devel@edk2.groups.io
Cc: Chiu, Chasel <chasel.chiu@...>; Desimone, Nathaniel L
<nathaniel.l.desimone@...>; Zeng, Star <star.zeng@...>
Subject: [edk2-devel] [PATCH] IntelFsp2Pkg: TempRamInit API should preserve
EBX/RBX register.

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4395

FSP specification defines the TempRamInit API preserved register list which
including EBX/RBX, however current implementation unexpectedly overriding
EBX/RBX register that should be fixed.

Cc: Nate DeSimone <nathaniel.l.desimone@...>
Cc: Star Zeng <star.zeng@...>
Signed-off-by: Chasel Chiu <chasel.chiu@...>
---
IntelFsp2Pkg/FspSecCore/Ia32/SaveRestoreSseNasm.inc | 7 +++++++
IntelFsp2Pkg/Include/SaveRestoreSseAvxNasm.inc | 21
++++++++++++++++++++-
2 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/IntelFsp2Pkg/FspSecCore/Ia32/SaveRestoreSseNasm.inc
b/IntelFsp2Pkg/FspSecCore/Ia32/SaveRestoreSseNasm.inc
index a222f2e376..016f943b43 100644
--- a/IntelFsp2Pkg/FspSecCore/Ia32/SaveRestoreSseNasm.inc
+++ b/IntelFsp2Pkg/FspSecCore/Ia32/SaveRestoreSseNasm.inc
@@ -157,6 +157,9 @@ NextAddress:
; Use CpuId instruction (CPUID.01H:EDX.SSE[bit 25] = 1) to test ;
whether the processor supports SSE instruction. ;+ ; Save EBX to
MM2+ ;+ movd mm2, ebx mov eax, 1 cpuid
bt edx, 25@@ -169,6 +172,10 @@ NextAddress:
bt ecx, 19 jnc SseError %endif+ ;+ ; Restore EBX
from MM2+ ;+ movd ebx, mm2 ; ; Set OSFXSR bit (bit
#9) & OSXMMEXCPT bit (bit #10)diff --git
a/IntelFsp2Pkg/Include/SaveRestoreSseAvxNasm.inc
b/IntelFsp2Pkg/Include/SaveRestoreSseAvxNasm.inc
index 38c807a311..002a5a1412 100644
--- a/IntelFsp2Pkg/Include/SaveRestoreSseAvxNasm.inc
+++ b/IntelFsp2Pkg/Include/SaveRestoreSseAvxNasm.inc
@@ -255,6 +255,10 @@ NextAddress:
; Use CpuId instruction (CPUID.01H:EDX.SSE[bit 25] = 1) to test ;
whether the processor supports SSE instruction. ;+ ; Save RBX to
R11+ ; Save RCX to R10+ ;+ mov r11, rbx mov r10,
rcx mov rax, 1 cpuid@@ -266,7 +270,12 @@ NextAddress:
; bt ecx, 19 jnc SseError- mov rcx,
r10+ ;+ ; Restore RBX from R11+ ; Restore RCX from
R10+ ;+ mov rbx, r11+ mov rcx, r10 ; ; Set
OSFXSR bit (bit #9) & OSXMMEXCPT bit (bit #10)@@ -284,6 +293,11 @@
NextAddress:
%endmacro %macro ENABLE_AVX 0+ ;+ ; Save RBX to
R11+ ; Save RCX to R10+ ;+ mov r11, rbx mov r10,
rcx mov eax, 1 cpuid@@ -307,6 +321,11 @@ EnableAvx:
xgetbv ; result in edx:eax or eax, 00000006h ; Set XCR0
bit #1 and bit #2 to enable SSE state and AVX state xsetbv+ ;+ ;
Restore RBX from R11+ ; Restore RCX from R10+ ;+ mov rbx,
r11 mov rcx, r10 %endmacro --
2.35.0.windows.1



-=-=-=-=-=-=
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#102337): https://edk2.groups.io/g/devel/message/102337
Mute This Topic: https://groups.io/mt/97984838/1777047
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [chasel.chiu@...] -=-
=-=-=-=-=