summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIru Cai <mytbk920423@gmail.com>2018-12-14 08:33:25 +0800
committerIru Cai <mytbk920423@gmail.com>2019-11-17 15:10:42 +0800
commitff91ecb2596c58ebe1cc9325316c504773dc93b1 (patch)
treed6e116375444fa113198dbf0b76b9c08807d6463 /src
parent35ed65cdf6bb4d13d8eba29d4d1770163516631f (diff)
downloadcoreboot-ff91ecb2596c58ebe1cc9325316c504773dc93b1.tar.xz
add pei_svc
Diffstat (limited to 'src')
-rw-r--r--src/northbridge/intel/haswell/Makefile.inc4
-rw-r--r--src/northbridge/intel/haswell/mrc.asm394
-rw-r--r--src/northbridge/intel/haswell/pei_svc.asm381
3 files changed, 400 insertions, 379 deletions
diff --git a/src/northbridge/intel/haswell/Makefile.inc b/src/northbridge/intel/haswell/Makefile.inc
index 8b4e35e37b..86f5ada5a5 100644
--- a/src/northbridge/intel/haswell/Makefile.inc
+++ b/src/northbridge/intel/haswell/Makefile.inc
@@ -32,7 +32,9 @@ romstage-y += report_platform.c
smm-y += finalize.c
romstage-libs += $(obj)/mrc.o
-$(obj)/mrc.o: $(src)/northbridge/intel/haswell/mrc.asm
+romstage-libs += $(obj)/pei_svc.o
+$(obj)/%.o: $(src)/northbridge/intel/haswell/%.asm
+ echo "NASM $@"
nasm -f elf32 -o $@ $<
romstage-y += mrc_utils.c
diff --git a/src/northbridge/intel/haswell/mrc.asm b/src/northbridge/intel/haswell/mrc.asm
index 137a5f1bba..3f5255377a 100644
--- a/src/northbridge/intel/haswell/mrc.asm
+++ b/src/northbridge/intel/haswell/mrc.asm
@@ -22,6 +22,14 @@ extern mrc_sku_5da5
extern fcn_fffa0250
extern printGuid
+; PEI services
+extern PeiInstallPpi
+extern PeiLocatePpi
+extern PeiNotifyPpi
+extern PeiGetBootMode
+extern PeiGetHobList
+extern PeiCreateHob
+
mrc_entry:
mov ecx, esp
mov esp, 0xff800000
@@ -295,91 +303,6 @@ pop esi
pop ebp
ret
-fcn_fffa03fd: ; not directly referenced
-push ebp
-mov ebp, esp
-mov eax, dword [ebp + 8]
-mov eax, dword [eax]
-cmp dword [eax - 4], 0xfeadb00b
-je short loc_fffa0410 ; je 0xfffa0410
-
-loc_fffa040e: ; not directly referenced
-jmp short loc_fffa040e ; jmp 0xfffa040e
-
-loc_fffa0410: ; not directly referenced
-mov edx, dword [eax + 0x254]
-mov eax, dword [ebp + 0xc]
-mov dword [eax], edx
-xor eax, eax
-pop ebp
-ret
-
-fcn_fffa041f: ; not directly referenced
-push ebp
-mov ebp, esp
-mov eax, dword [ebp + 8]
-mov eax, dword [eax]
-cmp dword [eax - 4], 0xfeadb00b
-je short loc_fffa0432 ; je 0xfffa0432
-
-loc_fffa0430: ; not directly referenced
-jmp short loc_fffa0430 ; jmp 0xfffa0430
-
-loc_fffa0432: ; not directly referenced
-mov edx, dword [eax + 0x68]
-mov eax, dword [ebp + 0xc]
-mov dword [eax], edx
-xor eax, eax
-pop ebp
-ret
-
-fcn_fffa043e: ; not directly referenced
-push ebp
-mov ebp, esp
-push edi
-push esi
-mov eax, dword [ebp + 8]
-push ebx
-mov eax, dword [eax]
-cmp dword [eax - 4], 0xfeadb00b
-jne short loc_fffa0462 ; jne 0xfffa0462
-lea edx, [eax - 4]
-mov ebx, 3
-mov eax, dword [eax + 0x250]
-jmp short loc_fffa0464 ; jmp 0xfffa0464
-
-loc_fffa0462: ; not directly referenced
-jmp short loc_fffa0462 ; jmp 0xfffa0462
-
-loc_fffa0464: ; not directly referenced
-cmp eax, 0x13
-ja short loc_fffa0494 ; ja 0xfffa0494
-inc eax
-mov esi, dword [ebp + 0xc]
-imul ecx, eax, 0xc
-mov dword [edx + 0x254], eax
-lea edi, [edx + ecx + 0x158]
-mov ecx, ebx
-rep movsd ; rep movsd dword es:[edi], dword ptr [esi]
-mov esi, dword [ebp + 0xc]
-mov ecx, dword [esi]
-add esi, 0xc
-test ecx, ecx
-mov dword [ebp + 0xc], esi
-jns short loc_fffa0464 ; jns 0xfffa0464
-xor eax, eax
-jmp short loc_fffa0499 ; jmp 0xfffa0499
-
-loc_fffa0494: ; not directly referenced
-mov eax, 0x80000009
-
-loc_fffa0499: ; not directly referenced
-pop ebx
-pop esi
-pop edi
-pop ebp
-ret
-
fcn_fffa049e: ; not directly referenced
push ebp
mov ebp, esp
@@ -412,7 +335,7 @@ mov ebp, esp
pop ebp
ret
-fcn_fffa04e7: ; not directly referenced
+dummy_func:
push ebp
xor eax, eax
mov ebp, esp
@@ -2388,282 +2311,6 @@ pop edi
pop ebp
ret
-fcn_fffa29ba: ; not directly referenced
-push ebp
-mov ebp, esp
-push edi
-push esi
-push ebx
-lea esp, [esp - 0x1c]
-mov ecx, dword [ebp + 8]
-mov edi, dword [ebp + 0x10]
-mov edx, dword [ebp + 0xc]
-movzx eax, di
-mov esi, dword [ebp + 0x14]
-mov ebx, dword [ecx]
-cmp dword [ebx - 4], 0xfeadb00b
-jne short loc_fffa29f2 ; jne 0xfffa29f2
-add eax, 4
-mov dword [ebp - 0x1c], edx
-call mrc_alloc
-test eax, eax
-mov edx, dword [ebp - 0x1c]
-jne short loc_fffa29f4 ; jne 0xfffa29f4
-jmp short loc_fffa2a1e ; jmp 0xfffa2a1e
-
-loc_fffa29f2: ; not directly referenced
-jmp short loc_fffa29f2 ; jmp 0xfffa29f2
-
-loc_fffa29f4: ; not directly referenced
-lea ecx, [eax + 4]
-mov dword [esi], ecx
-mov word [eax + 4], dx
-mov edx, dword [esi]
-mov word [edx + 2], di
-mov edx, dword [esi]
-mov dword [edx + 4], 0
-mov edx, dword [ebx + 0x254]
-mov dword [eax], edx
-mov dword [ebx + 0x254], eax
-xor eax, eax
-jmp short loc_fffa2a23 ; jmp 0xfffa2a23
-
-loc_fffa2a1e: ; not directly referenced
-mov eax, 0x80000009
-
-loc_fffa2a23: ; not directly referenced
-lea esp, [esp + 0x1c]
-pop ebx
-pop esi
-pop edi
-pop ebp
-ret
-
-fcn_fffa2a76: ; not directly referenced
-push ebp
-mov ebp, esp
-push edi
-push esi
-push ebx
-lea esp, [esp - 0x1c]
-mov edx, dword [ebp + 8]
-mov eax, dword [ebp + 0xc]
-mov edx, dword [edx]
-cmp dword [edx - 4], 0xfeadb00b
-jne short loc_fffa2aa4 ; jne 0xfffa2aa4
-lea ecx, [edx - 4]
-mov edx, dword [edx + 0x15c]
-mov dword [ebp - 0x20], edx
-mov dword [ebp - 0x1c], ecx
-xor edx, edx
-jmp short loc_fffa2aea ; jmp 0xfffa2aea
-
-loc_fffa2aa4: ; not directly referenced
-jmp short loc_fffa2aa4 ; jmp 0xfffa2aa4
-
-loc_fffa2aa6: ; not directly referenced
-imul ecx, edx, 0xc
-mov ebx, dword [ebp - 0x1c]
-lea edi, [ebx + ecx + 0x70]
-mov ebx, dword [eax]
-mov ecx, dword [edi + 4]
-mov esi, dword [ecx + 4]
-cmp dword [eax + 4], esi
-jne short loc_fffa2ad7 ; jne 0xfffa2ad7
-cmp ebx, dword [ecx]
-jne short loc_fffa2ad7 ; jne 0xfffa2ad7
-mov esi, dword [eax + 8]
-mov ebx, dword [eax + 0xc]
-xor esi, dword [ecx + 8]
-xor ebx, dword [ecx + 0xc]
-or esi, ebx
-sete cl
-movzx ecx, cl
-jmp short loc_fffa2ad9 ; jmp 0xfffa2ad9
-
-loc_fffa2ad7: ; not directly referenced
-xor ecx, ecx
-
-loc_fffa2ad9: ; not directly referenced
-test ecx, ecx
-je short loc_fffa2ae9 ; je 0xfffa2ae9
-mov eax, dword [ebp + 0x18]
-mov edx, dword [edi + 8]
-mov dword [eax], edx
-xor eax, eax
-jmp short loc_fffa2af9 ; jmp 0xfffa2af9
-
-loc_fffa2ae9: ; not directly referenced
-inc edx
-
-loc_fffa2aea: ; not directly referenced
-cmp edx, dword [ebp - 0x20]
-jl short loc_fffa2aa6 ; jl 0xfffa2aa6
-call printGuid
-mov eax, 0x8000000e
-
-loc_fffa2af9: ; not directly referenced
-lea esp, [esp + 0x1c]
-pop ebx
-pop esi
-pop edi
-pop ebp
-ret
-
-fcn_fffa2b02: ; not directly referenced
-push ebp
-mov ebp, esp
-push edi
-push esi
-push ebx
-lea esp, [esp - 0x1c]
-mov edx, dword [ebp + 8]
-mov ebx, dword [edx]
-cmp dword [ebx - 4], 0xfeadb00b
-jne short loc_fffa2b1f ; jne 0xfffa2b1f
-sub ebx, 4
-jmp short loc_fffa2b21 ; jmp 0xfffa2b21
-
-loc_fffa2b1f: ; not directly referenced
-jmp short loc_fffa2b1f ; jmp 0xfffa2b1f
-
-loc_fffa2b21: ; not directly referenced
-mov edi, dword [ebx + 0x160]
-xor esi, esi
-mov dword [ebp - 0x1c], edi
-jmp short loc_fffa2b87 ; jmp 0xfffa2b87
-
-loc_fffa2b2e: ; not directly referenced
-mov edx, dword [ebp + 0xc]
-mov eax, dword [edx + 4]
-imul edx, esi, 0xc
-mov edi, dword [eax + 4]
-mov edx, dword [ebx + edx + 0x74]
-cmp dword [edx + 4], edi
-mov ecx, dword [edx]
-jne short loc_fffa2b5f ; jne 0xfffa2b5f
-cmp ecx, dword [eax]
-jne short loc_fffa2b5f ; jne 0xfffa2b5f
-mov ecx, dword [edx + 8]
-mov edx, dword [edx + 0xc]
-xor ecx, dword [eax + 8]
-xor edx, dword [eax + 0xc]
-or ecx, edx
-sete al
-movzx eax, al
-jmp short loc_fffa2b61 ; jmp 0xfffa2b61
-
-loc_fffa2b5f: ; not directly referenced
-xor eax, eax
-
-loc_fffa2b61: ; not directly referenced
-test eax, eax
-je short loc_fffa2b86 ; je 0xfffa2b86
-push eax
-push eax
-push ref_fffc9eec ; push 0xfffc9eec
-push ref_fffcc505 ; push 0xfffcc505
-call mrc_printk ; call 0xfffa1253
-mov edx, dword [ebp + 0xc]
-mov eax, dword [edx + 4]
-call printGuid
-add esp, 0x10
-jmp short loc_fffa2b8c ; jmp 0xfffa2b8c
-
-loc_fffa2b86: ; not directly referenced
-inc esi
-
-loc_fffa2b87: ; not directly referenced
-cmp esi, dword [ebp - 0x1c]
-jne short loc_fffa2b2e ; jne 0xfffa2b2e
-
-loc_fffa2b8c: ; not directly referenced
-cmp esi, dword [ebx + 0x160]
-jne short loc_fffa2bc0 ; jne 0xfffa2bc0
-cmp esi, 0x13
-jbe short loc_fffa2bb7 ; jbe 0xfffa2bb7
-push eax
-push eax
-push ref_fffc9eec ; push 0xfffc9eec
-push ref_fffcc519 ; push 0xfffcc519
-call mrc_printk ; call 0xfffa1253
-add esp, 0x10
-mov eax, 0x80000009
-jmp near loc_fffa2c49 ; jmp 0xfffa2c49
-
-loc_fffa2bb7: ; not directly referenced
-lea eax, [esi + 1]
-mov dword [ebx + 0x160], eax
-
-loc_fffa2bc0: ; not directly referenced
-imul esi, esi, 0xc
-mov ecx, 3
-lea eax, [ebx + esi + 0x70]
-mov esi, dword [ebp + 0xc]
-mov edi, eax
-rep movsd ; rep movsd dword es:[edi], dword ptr [esi]
-xor esi, esi
-jmp short loc_fffa2c2c ; jmp 0xfffa2c2c
-
-loc_fffa2bd7: ; not directly referenced
-imul eax, esi, 0xc
-mov edi, dword [ebp + 0xc]
-lea ecx, [ebx + eax + 0x164]
-mov eax, dword [edi + 4]
-mov edx, dword [ecx + 4]
-mov edi, dword [edx]
-mov dword [ebp - 0x1c], edi
-mov edi, dword [eax + 4]
-cmp dword [edx + 4], edi
-jne short loc_fffa2c14 ; jne 0xfffa2c14
-mov edi, dword [ebp - 0x1c]
-cmp edi, dword [eax]
-jne short loc_fffa2c14 ; jne 0xfffa2c14
-mov edi, dword [edx + 8]
-mov edx, dword [edx + 0xc]
-xor edi, dword [eax + 8]
-xor edx, dword [eax + 0xc]
-or edi, edx
-sete al
-movzx eax, al
-jmp short loc_fffa2c16 ; jmp 0xfffa2c16
-
-loc_fffa2c14: ; not directly referenced
-xor eax, eax
-
-loc_fffa2c16: ; not directly referenced
-test eax, eax
-je short loc_fffa2c2b ; je 0xfffa2c2b
-mov eax, dword [ebp + 0xc]
-push edi
-push dword [eax + 8]
-push ecx
-push dword [ebp + 8]
-call dword [ecx + 8] ; ucall
-add esp, 0x10
-
-loc_fffa2c2b: ; not directly referenced
-inc esi
-
-loc_fffa2c2c: ; not directly referenced
-cmp esi, dword [ebx + 0x254]
-jb short loc_fffa2bd7 ; jb 0xfffa2bd7
-mov edx, dword [ebp + 0xc]
-mov eax, dword [edx]
-add edx, 0xc
-test eax, eax
-mov dword [ebp + 0xc], edx
-jns loc_fffa2b21 ; jns 0xfffa2b21
-xor eax, eax
-
-loc_fffa2c49: ; not directly referenced
-lea esp, [ebp - 0xc]
-pop ebx
-pop esi
-pop edi
-pop ebp
-ret
-
do_raminit:
push ebp
xor edx, edx
@@ -3197,19 +2844,19 @@ mov byte [ebp - 0x62f], 1
lea eax, [ebp - 0x5d4]
mov dword [ebp - 0x278], 0xfeadb00b
mov dword [ebp - 0x200], eax
-mov dword [ebp - 0x25c], fcn_fffa2b02 ; mov dword [ebp - 0x25c], 0xfffa2b02
+mov dword [ebp - 0x25c], PeiInstallPpi
lea eax, [ebp - 0x526]
-mov dword [ebp - 0x254], fcn_fffa2a76 ; mov dword [ebp - 0x254], 0xfffa2a76
+mov dword [ebp - 0x254], PeiLocatePpi
mov dword [ebp - 0x1f4], eax
-mov dword [ebp - 0x250], fcn_fffa043e ; mov dword [ebp - 0x250], 0xfffa043e
+mov dword [ebp - 0x250], PeiNotifyPpi
lea eax, [ebp - 0x5dc]
-mov dword [ebp - 0x24c], fcn_fffa041f ; mov dword [ebp - 0x24c], 0xfffa041f
+mov dword [ebp - 0x24c], PeiGetBootMode
mov dword [ebp - 0x1e8], eax
-mov dword [ebp - 0x244], fcn_fffa03fd ; mov dword [ebp - 0x244], 0xfffa03fd
+mov dword [ebp - 0x244], PeiGetHobList
lea eax, [ebp - 0x4c0]
-mov dword [ebp - 0x240], fcn_fffa29ba ; mov dword [ebp - 0x240], 0xfffa29ba
+mov dword [ebp - 0x240], PeiCreateHob
mov dword [ebp - 0x1dc], eax
-mov dword [ebp - 0x230], fcn_fffa04e7 ; mov dword [ebp - 0x230], 0xfffa04e7
+mov dword [ebp - 0x230], dummy_func
lea eax, [ebp - 0x565]
mov dword [ebp - 0x224], memcpy ; mov dword [ebp - 0x224], 0xfffa1178
mov dword [ebp - 0x1d0], eax
@@ -53189,9 +52836,6 @@ dd fcn_fffc5b3c
dd fcn_fffc5b27
dd fcn_fffc5b14
-ref_fffc9eec:
-db 'install_ppi',0x00
-
ref_fffc9ef8:
dd 0x05010400
dd 0x07030602
@@ -55774,12 +55418,6 @@ dd loc_fffc85f0
ref_fffcc46a:
db 'Copy SPD for Channel %d Dimm %d',0x0a,0x00
-ref_fffcc505:
-db '%s: overwrite GUID ',0x00
-
-ref_fffcc519:
-db '%s: no room for a new PPI',0x0a,0x00
-
ref_fffcc534:
db 'System Agent: Starting up...',0x0a,0x00
diff --git a/src/northbridge/intel/haswell/pei_svc.asm b/src/northbridge/intel/haswell/pei_svc.asm
new file mode 100644
index 0000000000..364b1d1407
--- /dev/null
+++ b/src/northbridge/intel/haswell/pei_svc.asm
@@ -0,0 +1,381 @@
+global PeiInstallPpi
+global PeiLocatePpi
+global PeiNotifyPpi
+global PeiGetBootMode
+global PeiGetHobList
+global PeiCreateHob
+
+extern mrc_alloc
+extern mrc_printk
+extern printGuid
+
+PeiGetHobList:
+push ebp
+mov ebp, esp
+mov eax, dword [ebp + 8]
+mov eax, dword [eax]
+cmp dword [eax - 4], 0xfeadb00b
+je short loc_fffa0410
+
+loc_fffa040e:
+jmp short loc_fffa040e
+
+loc_fffa0410:
+mov edx, dword [eax + 0x254]
+mov eax, dword [ebp + 0xc]
+mov dword [eax], edx
+xor eax, eax
+pop ebp
+ret
+
+PeiGetBootMode:
+push ebp
+mov ebp, esp
+mov eax, dword [ebp + 8]
+mov eax, dword [eax]
+cmp dword [eax - 4], 0xfeadb00b
+je short loc_fffa0432
+
+loc_fffa0430:
+jmp short loc_fffa0430
+
+loc_fffa0432:
+mov edx, dword [eax + 0x68]
+mov eax, dword [ebp + 0xc]
+mov dword [eax], edx
+xor eax, eax
+pop ebp
+ret
+
+PeiCreateHob:
+push ebp
+mov ebp, esp
+push edi
+push esi
+push ebx
+lea esp, [esp - 0x1c]
+mov ecx, dword [ebp + 8]
+mov edi, dword [ebp + 0x10]
+mov edx, dword [ebp + 0xc]
+movzx eax, di
+mov esi, dword [ebp + 0x14]
+mov ebx, dword [ecx]
+cmp dword [ebx - 4], 0xfeadb00b
+jne short loc_fffa29f2
+add eax, 4
+mov dword [ebp - 0x1c], edx
+call mrc_alloc
+test eax, eax
+mov edx, dword [ebp - 0x1c]
+jne short loc_fffa29f4
+jmp short loc_fffa2a1e
+
+loc_fffa29f2:
+jmp short loc_fffa29f2
+
+loc_fffa29f4:
+lea ecx, [eax + 4]
+mov dword [esi], ecx
+mov word [eax + 4], dx
+mov edx, dword [esi]
+mov word [edx + 2], di
+mov edx, dword [esi]
+mov dword [edx + 4], 0
+mov edx, dword [ebx + 0x254]
+mov dword [eax], edx
+mov dword [ebx + 0x254], eax
+xor eax, eax
+jmp short loc_fffa2a23
+
+loc_fffa2a1e:
+mov eax, 0x80000009
+
+loc_fffa2a23:
+lea esp, [esp + 0x1c]
+pop ebx
+pop esi
+pop edi
+pop ebp
+ret
+
+PeiNotifyPpi:
+push ebp
+mov ebp, esp
+push edi
+push esi
+mov eax, dword [ebp + 8]
+push ebx
+mov eax, dword [eax]
+cmp dword [eax - 4], 0xfeadb00b
+jne short loc_fffa0462
+lea edx, [eax - 4]
+mov ebx, 3
+mov eax, dword [eax + 0x250]
+jmp short loc_fffa0464
+
+loc_fffa0462:
+jmp short loc_fffa0462
+
+loc_fffa0464:
+cmp eax, 0x13
+ja short loc_fffa0494
+inc eax
+mov esi, dword [ebp + 0xc]
+imul ecx, eax, 0xc
+mov dword [edx + 0x254], eax
+lea edi, [edx + ecx + 0x158]
+mov ecx, ebx
+rep movsd
+mov esi, dword [ebp + 0xc]
+mov ecx, dword [esi]
+add esi, 0xc
+test ecx, ecx
+mov dword [ebp + 0xc], esi
+jns short loc_fffa0464
+xor eax, eax
+jmp short loc_fffa0499
+
+loc_fffa0494:
+mov eax, 0x80000009
+
+loc_fffa0499:
+pop ebx
+pop esi
+pop edi
+pop ebp
+ret
+
+PeiLocatePpi:
+push ebp
+mov ebp, esp
+push edi
+push esi
+push ebx
+lea esp, [esp - 0x1c]
+mov edx, dword [ebp + 8]
+mov eax, dword [ebp + 0xc]
+mov edx, dword [edx]
+cmp dword [edx - 4], 0xfeadb00b
+jne short loc_fffa2aa4
+lea ecx, [edx - 4]
+mov edx, dword [edx + 0x15c]
+mov dword [ebp - 0x20], edx
+mov dword [ebp - 0x1c], ecx
+xor edx, edx
+jmp short loc_fffa2aea
+
+loc_fffa2aa4:
+jmp short loc_fffa2aa4
+
+loc_fffa2aa6:
+imul ecx, edx, 0xc
+mov ebx, dword [ebp - 0x1c]
+lea edi, [ebx + ecx + 0x70]
+mov ebx, dword [eax]
+mov ecx, dword [edi + 4]
+mov esi, dword [ecx + 4]
+cmp dword [eax + 4], esi
+jne short loc_fffa2ad7
+cmp ebx, dword [ecx]
+jne short loc_fffa2ad7
+mov esi, dword [eax + 8]
+mov ebx, dword [eax + 0xc]
+xor esi, dword [ecx + 8]
+xor ebx, dword [ecx + 0xc]
+or esi, ebx
+sete cl
+movzx ecx, cl
+jmp short loc_fffa2ad9
+
+loc_fffa2ad7:
+xor ecx, ecx
+
+loc_fffa2ad9:
+test ecx, ecx
+je short loc_fffa2ae9
+mov eax, dword [ebp + 0x18]
+mov edx, dword [edi + 8]
+mov dword [eax], edx
+xor eax, eax
+jmp short loc_fffa2af9
+
+loc_fffa2ae9:
+inc edx
+
+loc_fffa2aea:
+cmp edx, dword [ebp - 0x20]
+jl short loc_fffa2aa6
+call printGuid
+mov eax, 0x8000000e
+
+loc_fffa2af9:
+lea esp, [esp + 0x1c]
+pop ebx
+pop esi
+pop edi
+pop ebp
+ret
+
+PeiInstallPpi:
+push ebp
+mov ebp, esp
+push edi
+push esi
+push ebx
+lea esp, [esp - 0x1c]
+mov edx, dword [ebp + 8]
+mov ebx, dword [edx]
+cmp dword [ebx - 4], 0xfeadb00b
+jne short loc_fffa2b1f
+sub ebx, 4
+jmp short loc_fffa2b21
+
+loc_fffa2b1f:
+jmp short loc_fffa2b1f
+
+loc_fffa2b21:
+mov edi, dword [ebx + 0x160]
+xor esi, esi
+mov dword [ebp - 0x1c], edi
+jmp short loc_fffa2b87
+
+loc_fffa2b2e:
+mov edx, dword [ebp + 0xc]
+mov eax, dword [edx + 4]
+imul edx, esi, 0xc
+mov edi, dword [eax + 4]
+mov edx, dword [ebx + edx + 0x74]
+cmp dword [edx + 4], edi
+mov ecx, dword [edx]
+jne short loc_fffa2b5f
+cmp ecx, dword [eax]
+jne short loc_fffa2b5f
+mov ecx, dword [edx + 8]
+mov edx, dword [edx + 0xc]
+xor ecx, dword [eax + 8]
+xor edx, dword [eax + 0xc]
+or ecx, edx
+sete al
+movzx eax, al
+jmp short loc_fffa2b61
+
+loc_fffa2b5f:
+xor eax, eax
+
+loc_fffa2b61:
+test eax, eax
+je short loc_fffa2b86
+push eax
+push eax
+push ref_fffc9eec
+push ref_fffcc505
+call mrc_printk
+mov edx, dword [ebp + 0xc]
+mov eax, dword [edx + 4]
+call printGuid
+add esp, 0x10
+jmp short loc_fffa2b8c
+
+loc_fffa2b86:
+inc esi
+
+loc_fffa2b87:
+cmp esi, dword [ebp - 0x1c]
+jne short loc_fffa2b2e
+
+loc_fffa2b8c:
+cmp esi, dword [ebx + 0x160]
+jne short loc_fffa2bc0
+cmp esi, 0x13
+jbe short loc_fffa2bb7
+push eax
+push eax
+push ref_fffc9eec
+push ref_fffcc519
+call mrc_printk
+add esp, 0x10
+mov eax, 0x80000009
+jmp near loc_fffa2c49
+
+loc_fffa2bb7:
+lea eax, [esi + 1]
+mov dword [ebx + 0x160], eax
+
+loc_fffa2bc0:
+imul esi, esi, 0xc
+mov ecx, 3
+lea eax, [ebx + esi + 0x70]
+mov esi, dword [ebp + 0xc]
+mov edi, eax
+rep movsd
+xor esi, esi
+jmp short loc_fffa2c2c
+
+loc_fffa2bd7:
+imul eax, esi, 0xc
+mov edi, dword [ebp + 0xc]
+lea ecx, [ebx + eax + 0x164]
+mov eax, dword [edi + 4]
+mov edx, dword [ecx + 4]
+mov edi, dword [edx]
+mov dword [ebp - 0x1c], edi
+mov edi, dword [eax + 4]
+cmp dword [edx + 4], edi
+jne short loc_fffa2c14
+mov edi, dword [ebp - 0x1c]
+cmp edi, dword [eax]
+jne short loc_fffa2c14
+mov edi, dword [edx + 8]
+mov edx, dword [edx + 0xc]
+xor edi, dword [eax + 8]
+xor edx, dword [eax + 0xc]
+or edi, edx
+sete al
+movzx eax, al
+jmp short loc_fffa2c16
+
+loc_fffa2c14:
+xor eax, eax
+
+loc_fffa2c16:
+test eax, eax
+je short loc_fffa2c2b
+mov eax, dword [ebp + 0xc]
+push edi
+push dword [eax + 8]
+push ecx
+push dword [ebp + 8]
+call dword [ecx + 8]
+add esp, 0x10
+
+loc_fffa2c2b:
+inc esi
+
+loc_fffa2c2c:
+cmp esi, dword [ebx + 0x254]
+jb short loc_fffa2bd7
+mov edx, dword [ebp + 0xc]
+mov eax, dword [edx]
+add edx, 0xc
+test eax, eax
+mov dword [ebp + 0xc], edx
+jns loc_fffa2b21
+xor eax, eax
+
+loc_fffa2c49:
+lea esp, [ebp - 0xc]
+pop ebx
+pop esi
+pop edi
+pop ebp
+ret
+
+ref_fffc9eec:
+db 'install_ppi',0x00
+
+ref_fffcc505:
+db '%s: overwrite GUID ',0x00
+
+ref_fffcc519:
+db '%s: no room for a new PPI',0x0a,0x00
+