]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/ResetVector/Ia32/SearchForSecAndPeiEntries.asm
OVMF SEC: Modify to search sections of FFS file for PE32 image.
[mirror_edk2.git] / OvmfPkg / ResetVector / Ia32 / SearchForSecAndPeiEntries.asm
index b4f734fb760491102381251d4ca984fa955a80d5..9bb0cd1fa6c8ab802217b94930dfbc1ccfc07430 100644 (file)
@@ -144,6 +144,7 @@ peiCoreEntryPointWasFound:
 ;\r
 ; Input:\r
 ;   EAX - Start of FFS file\r
+;   ECX - End of FFS file\r
 ;\r
 ; Output:\r
 ;   EAX - Entry point of PE32 (or 0 if not found)\r
@@ -154,11 +155,33 @@ peiCoreEntryPointWasFound:
 GetEntryPointOfFfsFileReturnEdx:\r
     test    eax, eax\r
     jz      getEntryPointOfFfsFileErrorReturn\r
+    add     eax, 0x18       ; EAX = Start of section\r
 \r
-    cmp     byte [eax + 0x1b], EFI_SECTION_PE32\r
-    jne     getEntryPointOfFfsFileErrorReturn\r
+getEntryPointOfFfsFileLoopForSections:\r
+    cmp     eax, ecx\r
+    jae     getEntryPointOfFfsFileErrorReturn\r
+\r
+    cmp     byte [eax + 3], EFI_SECTION_PE32\r
+    je      getEntryPointOfFfsFileFoundPe32Section\r
+\r
+    ;\r
+    ; The section type was not PE32, so move to next section\r
+    ;\r
+    mov     ebx, dword [eax]\r
+    and     ebx, 0x00ffffff\r
+    add     eax, ebx\r
+    jc      getEntryPointOfFfsFileErrorReturn\r
+\r
+    ;\r
+    ; Ensure that FFS section is 32-bit aligned\r
+    ;\r
+    add     eax, 3\r
+    jc      getEntryPointOfFfsFileErrorReturn\r
+    and     al, 0xfc\r
+    jmp     getEntryPointOfFfsFileLoopForSections\r
 \r
-    add     eax, 0x1c       ; EAX = Start of PE32 image\r
+getEntryPointOfFfsFileFoundPe32Section:\r
+    add     eax, 4       ; EAX = Start of PE32 image\r
 \r
     mov     ebx, eax\r
     cmp     word [eax], 'MZ'\r