summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/northbridge/intel/haswell/mrc.asm145
-rw-r--r--src/northbridge/intel/haswell/mrc_misc.c60
-rw-r--r--src/northbridge/intel/haswell/mrc_misc.h1
3 files changed, 61 insertions, 145 deletions
diff --git a/src/northbridge/intel/haswell/mrc.asm b/src/northbridge/intel/haswell/mrc.asm
index 4a6cffcd6c..7a3f0bb994 100644
--- a/src/northbridge/intel/haswell/mrc.asm
+++ b/src/northbridge/intel/haswell/mrc.asm
@@ -8184,151 +8184,6 @@ pop esi
pop ebp
ret
-fcn_fffab280: ; not directly referenced
-push ebp
-mov ebp, esp
-push edi
-push esi
-push ebx
-lea esp, [esp - 0x2c]
-mov ebx, dword [ebp + 8]
-mov dword [ebp - 0x1c], 0
-lea eax, [ebx + 8]
-mov dword [ebp - 0x28], eax
-mov al, byte [ebx + 0x297b]
-lea edi, [ebx + 0x10b7]
-mov byte [ebx + 0x9e8], al
-mov eax, dword [ebx + 0x2974]
-mov dword [ebp - 0x2c], edi
-mov dword [ebx + 0x9e4], eax
-lea edi, [ebx + 0x2974]
-mov dword [ebp - 0x30], edi
-lea edi, [ebx + 0x9e4]
-mov dword [ebp - 0x34], edi
-
-loc_fffab2cd: ; not directly referenced
-imul eax, dword [ebp - 0x1c], 0x2fa
-imul edx, dword [ebp - 0x1c], 0x1347
-mov edi, dword [ebp - 0x2c]
-add edx, dword [ebp - 0x30]
-mov dword [ebp - 0x20], 0
-lea eax, [edi + eax + 5]
-mov dword [ebp - 0x24], eax
-imul eax, dword [ebp - 0x1c], 0x2e6
-add eax, dword [ebp - 0x34]
-lea esi, [edx + 8]
-mov ecx, dword [esi + 0xf5]
-lea edi, [eax + 5]
-mov dword [edi + 5], ecx
-mov cl, byte [esi + 0x114f]
-mov byte [edi + 9], cl
-mov cl, byte [esi + 0xf0]
-mov byte [edi + 4], cl
-mov edx, dword [edx + 8]
-mov dword [eax + 5], edx
-
-loc_fffab320: ; not directly referenced
-imul eax, dword [ebp - 0x20], 0x2a
-mov ecx, 0x2a
-lea edx, [esi + eax + 8]
-lea eax, [edi + eax + 0xa]
-call mrc_memcpy
-inc dword [ebp - 0x20]
-cmp dword [ebp - 0x20], 4
-jne short loc_fffab320 ; jne 0xfffab320
-lea edx, [esi + 0x1151]
-mov ecx, 0xfb
-lea eax, [edi + 0xb2]
-call mrc_memcpy
-mov edx, dword [ebp - 0x24]
-mov ecx, 0x1f
-add edx, 0xa1
-lea eax, [edi + 0x2a8]
-call mrc_memcpy
-lea edx, [esi + 0x124c]
-mov ecx, 0xfb
-lea eax, [edi + 0x1ad]
-call mrc_memcpy
-mov edx, dword [ebp - 0x24]
-lea eax, [edi + 0x2c7]
-add edx, 0x1f0
-mov ecx, 0x1f
-call mrc_memcpy
-inc dword [ebp - 0x1c]
-cmp dword [ebp - 0x1c], 2
-jne loc_fffab2cd ; jne 0xfffab2cd
-mov eax, dword [ebx + 0x172c]
-xor edx, edx
-mov dword [ebx + 0xfc2], eax
-mov eax, dword [ebx + 0x1730]
-mov dword [ebx + 0xfc6], eax
-mov eax, dword [ebx + 0x1734]
-mov dword [ebx + 0xfca], eax
-mov eax, dword [ebx + 0x1738]
-mov dword [ebx + 0xfce], eax
-lea eax, [ebx + 0x14]
-
-loc_fffab3df: ; not directly referenced
-lea ecx, [edx*4 + ref_fffcb80c] ; lea ecx, [edx*4 - 0x347f4]
-mov dword [ebp - 0x20], ecx
-movzx ecx, word [edx*4 + ref_fffcb80c] ; movzx ecx, word [edx*4 - 0x347f4]
-sub ecx, eax
-jmp short loc_fffab402 ; jmp 0xfffab402
-
-loc_fffab3f5: ; not directly referenced
-add esi, dword [ebx + 0x103f]
-mov esi, dword [esi]
-mov dword [eax], esi
-add eax, 4
-
-loc_fffab402: ; not directly referenced
-mov edi, dword [ebp - 0x20]
-lea esi, [eax + ecx]
-movzx edi, word [edi + 2]
-cmp esi, edi
-jbe short loc_fffab3f5 ; jbe 0xfffab3f5
-inc edx
-cmp edx, 0x5d
-jne short loc_fffab3df ; jne 0xfffab3df
-lea eax, [ebx + 0x9dc]
-call fcn_fffa9196 ; call 0xfffa9196
-mov eax, dword [ebx + 0x1005]
-mov edx, dword [ebx + 0x1037]
-mov dword [ebx + 0x9d8], eax
-mov eax, dword [ebx + 0x1001]
-mov dword [ebx + 0x9d4], eax
-mov eax, dword [ebx + 0x16c6]
-mov dword [ebx + 0xfb5], eax
-mov eax, dword [ebx + 0x16ce]
-mov dword [ebx + 0xfb9], eax
-mov al, byte [ebx + 0x16d6]
-mov byte [ebx + 0xfc1], al
-mov eax, dword [ebx + 0x16d2]
-mov dword [ebx + 0xfbd], eax
-mov al, byte [ebx + 0x1740]
-mov byte [ebx + 0xfd2], al
-mov eax, dword [ebx + 0x1749]
-mov dword [ebx + 0xfd3], eax
-mov al, byte [ebx + 0x1746]
-mov byte [ebx + 0xfd7], al
-mov eax, dword [ebx + 0x1033]
-call crc32 ; call 0xfffab210
-mov dword [ebx + 0x9e0], eax
-mov edx, 0xfd0
-mov eax, dword [ebp - 0x28]
-call crc32 ; call 0xfffab210
-mov dword [ebx + 4], eax
-lea esp, [esp + 0x2c]
-pop ebx
-xor eax, eax
-pop esi
-pop edi
-pop ebp
-ret
-
-loc_fffab4bf:
-db 0x00
-
fcn_fffab4c0: ; not directly referenced
push ebp
mov ecx, 0x20
diff --git a/src/northbridge/intel/haswell/mrc_misc.c b/src/northbridge/intel/haswell/mrc_misc.c
index 0adf671d38..8dafd0f179 100644
--- a/src/northbridge/intel/haswell/mrc_misc.c
+++ b/src/northbridge/intel/haswell/mrc_misc.c
@@ -1681,3 +1681,63 @@ int fcn_fffa948c(void *ramdata)
}
return 0;
}
+
+int fcn_fffab280(void *ramdata)
+{
+ PRINT_FUNC;
+
+ *(uint8_t *)(ramdata + 0x9e8) = *(uint8_t *)(ramdata + 0x297b);
+ *(uint32_t *)(ramdata + 0x9e4) = *(uint32_t *)(ramdata + 0x2974);
+ for (int i = 0; i < 2; i++) {
+ void *ptr0 = (ramdata + i * 0x1347 + 0x2974);
+ void *ptr1 = (ramdata + i * 0x2fa + 0x10bc);
+ void *ptr2 = (ramdata + i * 0x2e6 + 0x9e4);
+ *(uint32_t *)(ptr2 + 10) = *(uint32_t *)(ptr0 + 0xfd);
+ *(uint8_t *)(ptr2 + 0xe) = *(uint8_t *)(ptr0 + 0x1157);
+ *(uint8_t *)(ptr2 + 9) = *(uint8_t *)(ptr0 + 0xf8);
+ *(uint32_t *)(ptr2 + 5) = *(uint32_t *)(ptr0 + 8);
+ for (int j = 0; j < 4; j++) {
+ mrc_memcpy((ptr2 + j * 0x2a + 0xf),
+ (ptr0 + j * 0x2a + 0x10), 0x2a);
+ }
+ mrc_memcpy((ptr2 + 0xb7), (ptr0 + 0x1159), 0xfb);
+ mrc_memcpy((ptr2 + 0x2ad), (ptr1 + 0xa1), 0x1f);
+ mrc_memcpy((ptr2 + 0x1b2), (ptr0 + 0x1254), 0xfb);
+ mrc_memcpy((ptr2 + 0x2cc), (ptr1 + 0x1f0), 0x1f);
+ }
+ *(uint32_t *)(ramdata + 0xfc2) = *(uint32_t *)(ramdata + 0x172c);
+ *(uint32_t *)(ramdata + 0xfc6) = *(uint32_t *)(ramdata + 0x1730);
+ *(uint32_t *)(ramdata + 0xfca) = *(uint32_t *)(ramdata + 0x1734);
+ *(uint32_t *)(ramdata + 0xfce) = *(uint32_t *)(ramdata + 0x1738);
+
+ void *saved_reg = ramdata + 0x14;
+ for (int i = 0; i < 0x5d; i++) {
+ uint32_t start = ref_fffcb80c[i * 2];
+ uint32_t end = ref_fffcb80c[i * 2 + 1];
+ while (start <= end) {
+ *(uint32_t*)(saved_reg) = MCHBAR32(start);
+ start += 4;
+ saved_reg = saved_reg + 4;
+ }
+ }
+
+ void __attribute((regparm(1))) fcn_fffa9196(void *a);
+ fcn_fffa9196((ramdata + 0x9dc));
+
+ *(uint32_t *)(ramdata + 0x9d8) = *(uint32_t *)(ramdata + 0x1005);
+ *(uint32_t *)(ramdata + 0x9d4) = *(uint32_t *)(ramdata + 0x1001);
+ *(uint32_t *)(ramdata + 0xfb5) = *(uint32_t *)(ramdata + 0x16c6);
+ *(uint32_t *)(ramdata + 0xfb9) = *(uint32_t *)(ramdata + 0x16ce);
+ *(uint8_t *)(ramdata + 0xfc1) = *(uint8_t *)(ramdata + 0x16d6);
+ *(uint32_t *)(ramdata + 0xfbd) = *(uint32_t *)(ramdata + 0x16d2);
+ *(uint8_t *)(ramdata + 0xfd2) = *(uint8_t *)(ramdata + 0x1740);
+ *(uint32_t *)(ramdata + 0xfd3) = *(uint32_t *)(ramdata + 0x1749);
+ *(uint8_t *)(ramdata + 0xfd7) = *(uint8_t *)(ramdata + 0x1746);
+
+ uint32_t crc = crc32(*(void **)(ramdata + 0x1033), *(size_t *)(ramdata + 0x1037));
+ *(uint32_t *)(ramdata + 0x9e0) = crc;
+ crc = crc32((ramdata + 8), 0xfd0);
+ *(uint32_t *)(ramdata + 4) = crc;
+
+ return 0;
+}
diff --git a/src/northbridge/intel/haswell/mrc_misc.h b/src/northbridge/intel/haswell/mrc_misc.h
index 8cac26916b..fc94358407 100644
--- a/src/northbridge/intel/haswell/mrc_misc.h
+++ b/src/northbridge/intel/haswell/mrc_misc.h
@@ -60,3 +60,4 @@ int MRCABI wait_5030(void *ramdata);
int MRCABI wait_5084(void *ramdata);
int fcn_fffa7e78(void *ramdata);
int fcn_fffa948c(void *ramdata);
+int fcn_fffab280(void *ramdata);