diff options
author | Iru Cai <mytbk920423@gmail.com> | 2019-11-16 12:53:50 +0800 |
---|---|---|
committer | Iru Cai <mytbk920423@gmail.com> | 2019-11-17 15:10:47 +0800 |
commit | 40da44f5b70185e99c0f36f0205c7d9f30a75a2a (patch) | |
tree | 992bf67c22f79051b1ce72893683d20a41e7306a | |
parent | fe8c781ae425a189d53bec3b78f2100110961c2a (diff) | |
download | coreboot-40da44f5b70185e99c0f36f0205c7d9f30a75a2a.tar.xz |
fcn_fffb8689 from ghidra
-rw-r--r-- | src/northbridge/intel/haswell/mrc.asm | 332 | ||||
-rw-r--r-- | src/northbridge/intel/haswell/mrc_misc.c | 152 | ||||
-rw-r--r-- | src/northbridge/intel/haswell/mrc_misc.h | 40 |
3 files changed, 221 insertions, 303 deletions
diff --git a/src/northbridge/intel/haswell/mrc.asm b/src/northbridge/intel/haswell/mrc.asm index d6703c77a3..812871f723 100644 --- a/src/northbridge/intel/haswell/mrc.asm +++ b/src/northbridge/intel/haswell/mrc.asm @@ -107,7 +107,6 @@ global fcn_fffb5cbc global fcn_fffb8040 global fcn_fffb85ca global fcn_fffb8625 -global fcn_fffb8689 global fcn_fffb89f8 global fcn_fffb8d2d global fcn_fffba408 @@ -181,7 +180,6 @@ extern frag_fffba341 extern freq_sel ;; misc -extern fcn_fffbd29a global fcn_fffb2d76 global fcn_fffb1d24 global fcn_fffb2062 @@ -192,6 +190,37 @@ extern do_smbus_op extern udiv64 extern ref_fffcbc04 +global fcn_fffbd356 +global fcn_fffbd30a +global fcn_fffbd1e7 +global fcn_fffbd184 +global fcn_fffbd1b3 +global fcn_fffbd106 +global fcn_fffbd29a +global fcn_fffbd213 +global fcn_fffbd0e4 +global fcn_fffbd0c8 +global fcn_fffbd046 +global fcn_fffbd01d + +global fcn_fffbce60 +global fcn_fffb73ef +global fcn_fffb6f52 +global fcn_fffbcc31 +global fcn_fffbc869 +global fcn_fffbc643 +global fcn_fffbc441 +global fcn_fffb7633 +global fcn_fffbc277 +global fcn_fffbc075 +global fcn_fffbbe9c +global fcn_fffbca4d +global fcn_fffbbcd4 +global fcn_fffbbb0c +global fcn_fffb7e5c +global fcn_fffb7c94 +global fcn_fffb7acc +global fcn_fffb7866 ;; mrc_entry: @@ -24691,266 +24720,6 @@ call fcn_fffb03ba ; call 0xfffb03ba leave ret -fcn_fffb8689: ; not directly referenced -push ebp -mov ebp, esp -push edi -push esi -lea edi, [ebp - 0x60] -push ebx -lea esp, [esp - 0x9c] -mov ebx, dword [ebp + 8] -mov dword [ebp - 0x74], 0 -mov dword [ebp - 0x80], 0 -mov dword [ebp - 0x78], 0 -mov dword [ebp - 0x7c], 0x16 -mov dword [ebp - 0x6c], edi -lea eax, [ebx + 0x10b7] -lea edx, [ebx + 0x2974] -mov dword [ebp - 0x8c], eax -mov dword [ebp - 0x90], edx - -loc_fffb86d3: ; not directly referenced -imul edx, dword [ebp - 0x74], 0x2fa -mov eax, dword [ebp - 0x8c] -mov ecx, dword [ebp - 0x90] -mov dword [ebp - 0x70], 0 -mov dword [ebp - 0x88], edx -lea eax, [eax + edx + 5] -mov dword [ebp - 0x94], eax -imul eax, dword [ebp - 0x74], 0x1347 -mov dword [ebp - 0x9c], eax -lea ecx, [ecx + eax + 8] -mov dword [ebp - 0x98], ecx - -loc_fffb8714: ; not directly referenced -imul eax, dword [ebp - 0x70], 0x14f -mov edi, dword [ebp - 0x94] -cmp dword [edi + eax + 8], 1 -ja loc_fffb8880 ; ja 0xfffb8880 -mov edx, dword [ebp - 0x88] -mov esi, ref_fffcbb8c ; mov esi, 0xfffcbb8c -mov ecx, 0xc -mov edi, dword [ebp - 0x6c] -rep movsd ; rep movsd dword es:[edi], dword ptr [esi] -lea eax, [eax + edx + 0x10c0] -mov ecx, dword [ebp - 0x9c] -lea esi, [ebx + eax + 0x28] -imul eax, dword [ebp - 0x70], 0xfb -lea eax, [eax + ecx + 0x3ab0] -lea edi, [ebx + eax] -xor eax, eax -lea edx, [edi + 0x1d] -mov dword [edi + 0x1d], 3 -mov dword [ebp - 0x84], edx - -loc_fffb8775: ; not directly referenced -mov dl, byte [esi + eax] -inc eax -test dl, dl -jne short loc_fffb87ae ; jne 0xfffb87ae -cmp eax, 0x100 -jne short loc_fffb8775 ; jne 0xfffb8775 -jmp near loc_fffb8880 ; jmp 0xfffb8880 - -loc_fffb8789: ; not directly referenced -push eax -push dword [ebp - 0x84] -movzx eax, dl -mov byte [ebp - 0xa0], dl -push esi -push ebx -call dword [ebp + eax*4 - 0x60] ; ucall -mov dl, byte [ebp - 0xa0] -and eax, 1 -inc edx -add esp, 0x10 -jmp short loc_fffb87b5 ; jmp 0xfffb87b5 - -loc_fffb87ae: ; not directly referenced -xor edx, edx -mov eax, 1 - -loc_fffb87b5: ; not directly referenced -cmp dl, 0xb -setbe cl -test cl, al -jne short loc_fffb8789 ; jne 0xfffb8789 -test eax, eax -jne short loc_fffb87cf ; jne 0xfffb87cf -mov dword [edi + 0x1d], 1 -jmp near loc_fffb8880 ; jmp 0xfffb8880 - -loc_fffb87cf: ; not directly referenced -imul eax, dword [ebp - 0x70], 0x14f -mov ecx, dword [ebp - 0x88] -mov dword [edi + 0x1d], 2 -mov edx, 0xb -lea esi, [eax + ecx + 0x10a0] -add esi, ebx -mov ecx, dword [ebp - 0x84] -add ecx, 0xdb -lea eax, [esi + 0xbd] -call crc16 ; call 0xfffb8646 -cmp dword [esi + 0x24], 1 -jne short loc_fffb8815 ; jne 0xfffb8815 -mov dword [edi + 0x1d], 1 - -loc_fffb8815: ; not directly referenced -imul eax, dword [ebp - 0x70], 0xfb -mov edi, dword [ebp - 0x98] -mov edx, dword [ebx + 0x1749] -test edx, edx -lea eax, [edi + eax + 0x1151] -jne short loc_fffb8841 ; jne 0xfffb8841 -mov edx, dword [eax + 0xc5] -mov dword [ebx + 0x1749], edx -jmp short loc_fffb8853 ; jmp 0xfffb8853 - -loc_fffb8841: ; not directly referenced -cmp edx, dword [eax + 0xc5] -mov edx, 0x19 -cmove edx, dword [ebp - 0x7c] -mov dword [ebp - 0x7c], edx - -loc_fffb8853: ; not directly referenced -cmp dword [ebp - 0x78], 0 -jne short loc_fffb8864 ; jne 0xfffb8864 -mov eax, dword [eax + 0xc9] -mov dword [ebp - 0x78], eax -jmp short loc_fffb8873 ; jmp 0xfffb8873 - -loc_fffb8864: ; not directly referenced -mov edx, dword [ebp - 0x78] -cmp edx, dword [eax + 0xc9] -jne loc_fffb89db ; jne 0xfffb89db - -loc_fffb8873: ; not directly referenced -cmp dword [ebp - 0x7c], 0x19 -je loc_fffb89ed ; je 0xfffb89ed -inc dword [ebp - 0x80] - -loc_fffb8880: ; not directly referenced -inc dword [ebp - 0x70] -cmp dword [ebp - 0x70], 2 -jne loc_fffb8714 ; jne 0xfffb8714 -inc dword [ebp - 0x74] -cmp dword [ebp - 0x74], 2 -jne loc_fffb86d3 ; jne 0xfffb86d3 -cmp dword [ebp - 0x80], 0 -je loc_fffb89ed ; je 0xfffb89ed -lea edi, [ebp - 0x60] -mov esi, ref_fffcbbbc ; mov esi, 0xfffcbbbc -mov ecx, 0x12 -mov eax, 1 -rep movsd ; rep movsd dword es:[edi], dword ptr [esi] -jmp short loc_fffb88d8 ; jmp 0xfffb88d8 - -loc_fffb88ba: ; not directly referenced -sub esp, 0xc -mov byte [ebp - 0xa0], cl -movzx eax, cl -push ebx -call dword [ebp + eax*4 - 0x60] ; ucall -mov cl, byte [ebp - 0xa0] -and eax, 1 -inc ecx -add esp, 0x10 - -loc_fffb88d8: ; not directly referenced -cmp cl, 0x11 -setbe dl -test dl, al -jne short loc_fffb88ba ; jne 0xfffb88ba -test eax, eax -je loc_fffb89ed ; je 0xfffb89ed -lea edi, [ebx + 0x2974] -mov byte [ebx + 0x1740], 1 -mov dword [ebp - 0x70], 0 -mov dword [ebp - 0x74], edi - -loc_fffb8901: ; not directly referenced -imul eax, dword [ebp - 0x70], 0x1347 -mov edx, dword [ebp - 0x74] -lea eax, [edx + eax + 8] -xor edx, edx -mov byte [eax + 0xf0], 1 - -loc_fffb8918: ; not directly referenced -imul ecx, edx, 0xfb -lea ecx, [eax + ecx + 0x1150] -mov edi, dword [ecx + 1] -lea esi, [ecx + 1] -dec edi -cmp edi, 1 -ja short loc_fffb8937 ; ja 0xfffb8937 -inc dword [eax + 0xf5] - -loc_fffb8937: ; not directly referenced -cmp dword [ecx + 1], 2 -jne short loc_fffb8989 ; jne 0xfffb8989 -mov cl, byte [esi + 0xdd] -mov byte [ebp - 0x78], 0 -lea edi, [ecx - 1] -mov ecx, edi -cmp cl, 1 -ja short loc_fffb8960 ; ja 0xfffb8960 -and edi, 0xff -mov cl, byte [edi + ref_fffcbc9d] ; mov cl, byte [edi - 0x34363] -mov byte [ebp - 0x78], cl - -loc_fffb8960: ; not directly referenced -movzx edi, byte [ebp - 0x78] -lea ecx, [edx + edx] -shl edi, cl -mov ecx, edi -or byte [eax + 0x114f], cl -mov cl, byte [esi + 0xbc] -and byte [eax + 0xf0], cl -mov cl, byte [esi + 0xbc] -and byte [ebx + 0x1740], cl - -loc_fffb8989: ; not directly referenced -inc edx -cmp edx, 2 -jne short loc_fffb8918 ; jne 0xfffb8918 -cmp dword [eax + 0xf5], 0 -je short loc_fffb89b9 ; je 0xfffb89b9 -cmp byte [eax + 0x114f], 0 -je short loc_fffb89b9 ; je 0xfffb89b9 -imul eax, dword [ebp - 0x70], 0x1347 -mov edi, dword [ebp - 0x74] -inc byte [ebx + 0x297b] -mov dword [edi + eax + 8], 2 - -loc_fffb89b9: ; not directly referenced -inc dword [ebp - 0x70] -cmp dword [ebp - 0x70], 2 -jne loc_fffb8901 ; jne 0xfffb8901 -jmp short loc_fffb89e4 ; jmp 0xfffb89e4 - -loc_fffb89c8: ; not directly referenced -mov dword [ebx + 0x2974], 2 -mov dword [ebp - 0x7c], 0 -jmp short loc_fffb89ed ; jmp 0xfffb89ed - -loc_fffb89db: ; not directly referenced -mov dword [ebp - 0x7c], 0x19 -jmp short loc_fffb89ed ; jmp 0xfffb89ed - -loc_fffb89e4: ; not directly referenced -cmp byte [ebx + 0x297b], 0 -jne short loc_fffb89c8 ; jne 0xfffb89c8 - -loc_fffb89ed: ; not directly referenced -mov eax, dword [ebp - 0x7c] -lea esp, [ebp - 0xc] -pop ebx -pop esi -pop edi -pop ebp -ret - fcn_fffb89f8: ; not directly referenced push ebp mov ebp, esp @@ -46263,40 +46032,6 @@ dd 0x0bb80bb8 dd 0x00000000 dd 0x00000000 -ref_fffcbb8c: -dd fcn_fffbd356 -dd fcn_fffbd30a -dd fcn_fffbd1e7 -dd fcn_fffbd184 -dd fcn_fffbd1b3 -dd fcn_fffbd106 -dd fcn_fffbd29a -dd fcn_fffbd213 -dd fcn_fffbd0e4 -dd fcn_fffbd0c8 -dd fcn_fffbd046 -dd fcn_fffbd01d - -ref_fffcbbbc: -dd fcn_fffbce60 -dd fcn_fffb73ef -dd fcn_fffb6f52 -dd fcn_fffbcc31 -dd fcn_fffbc869 -dd fcn_fffbc643 -dd fcn_fffbc441 -dd fcn_fffb7633 -dd fcn_fffbc277 -dd fcn_fffbc075 -dd fcn_fffbbe9c -dd fcn_fffbca4d -dd fcn_fffbbcd4 -dd fcn_fffbbb0c -dd fcn_fffb7e5c -dd fcn_fffb7c94 -dd fcn_fffb7acc -dd fcn_fffb7866 - ref_fffcbc04: dd 0xffffffff @@ -46342,11 +46077,6 @@ dd 0x00000000 dd 0x00000000 db 0x00 -ref_fffcbc9d: -db 0x01 -db 0x03 -db 0x00 - ref_fffcbcd0: dd loc_fffb9240 dd loc_fffb917c diff --git a/src/northbridge/intel/haswell/mrc_misc.c b/src/northbridge/intel/haswell/mrc_misc.c index b0c6eca251..bbd642e26f 100644 --- a/src/northbridge/intel/haswell/mrc_misc.c +++ b/src/northbridge/intel/haswell/mrc_misc.c @@ -75,8 +75,7 @@ uint8_t __attribute((regparm(1))) pci_setup_bridge(uint8_t bus) return (r == 0)?bus:r; } -int fcn_fffbd29a(u32 a0, void * a1, void * a2); -int fcn_fffbd29a(u32 a0, void * a1, void * a2) +int fcn_fffbd29a(void * a0, void * a1, void * a2) { u32 b1 = (*(u8*)(a1 + 5) >> 3) & 7; u32 *wb = (u32*)(a2 + 0xd5); @@ -1103,3 +1102,152 @@ loc_fffa79d5: *(uint32_t*)(ramdata + 0x16ca) = 2500000; return 0; } + +static const callback3_t ref_fffcbb8c[] = { + fcn_fffbd356, fcn_fffbd30a, fcn_fffbd1e7, fcn_fffbd184, fcn_fffbd1b3, fcn_fffbd106, + fcn_fffbd29a, fcn_fffbd213, fcn_fffbd0e4, fcn_fffbd0c8, fcn_fffbd046, fcn_fffbd01d}; + +static const callback_t ref_fffcbbbc[] = { + fcn_fffbce60, fcn_fffb73ef, fcn_fffb6f52, fcn_fffbcc31, fcn_fffbc869, fcn_fffbc643, + fcn_fffbc441, fcn_fffb7633, fcn_fffbc277, fcn_fffbc075, fcn_fffbbe9c, fcn_fffbca4d, + fcn_fffbbcd4, fcn_fffbbb0c, fcn_fffb7e5c, fcn_fffb7c94, fcn_fffb7acc, fcn_fffb7866}; + +static const uint8_t ref_fffcbc9d[] = {1, 3, 0}; + +int fcn_fffb8689(void *ramdata) +{ + char *pcVar1; + char cVar2; + int iVar3; + uint32_t uVar4; + void * ptr5; + int iVar8; + int iVar9; + void * ptr9; + int local_84; + int local_80; + int local_7c; + int local_78; + int local_74; + void *local_64[21]; + + PRINT_FUNC; + + local_78 = 0; + local_84 = 0; + local_7c = 0; + local_80 = 0x16; + do { + iVar8 = local_78 * 0x2fa; + local_74 = 0; + do { + if (*(uint32_t *)(ramdata + local_74 * 0x14f + iVar8 + 0x10c4) < 2) { + memcpy(local_64, ref_fffcbb8c, sizeof(callback3_t) * 12); + ptr9 = ramdata + local_74 * 0x14f + 0x10e8 + iVar8; + ptr5 = ramdata + local_74 * 0xfb + 0x3ab0 + local_78 * 0x1347; + iVar3 = 0; + *(uint32_t *)(ptr5 + 0x1d) = 3; + loc_fffb8775: + pcVar1 = (char *)(ptr9 + iVar3); + iVar3 = iVar3 + 1; + if (*pcVar1 == '\0') + goto code_r0x0002376f; + uVar4 = 1; + for (int k = 0; k < 12 && uVar4 != 0; k++) { + uVar4 = ((callback3_t)local_64[k])(ramdata, ptr9, ptr5 + 0x1d) & 1; + } + if (uVar4 == 0) { + *(uint32_t *)(ptr5 + 0x1d) = 1; + } else { + *(uint32_t *)(ptr5 + 0x1d) = 2; + ptr9 = ramdata + local_74 * 0x14f + 0x10a0 + iVar8; + crc16((uint8_t *)(ptr9 + 0xbd), 0xb, + (uint16_t *)(ptr5 + 0xf8)); + if (*(int *)(ptr9 + 0x24) == 1) { + *(uint32_t *)(ptr5 + 0x1d) = 1; + } + ptr5 = ramdata + local_74 * 0xfb + local_78 * 0x1347 + + 0x3acd; + if (*(int *)(ramdata + 0x1749) == 0) { + *(uint32_t *)(ramdata + 0x1749) = + *(uint32_t *)(ptr5 + 0xc5); + iVar9 = local_80; + } else { + iVar9 = 0x19; + if (*(int *)(ramdata + 0x1749) + == *(int *)(ptr5 + 0xc5)) { + iVar9 = local_80; + } + } + local_80 = iVar9; + if (local_7c == 0) { + local_7c = *(int *)(ptr5 + 0xc9); + } else { + if (local_7c != *(int *)(ptr5 + 0xc9)) { + return 0x19; + } + } + if (local_80 == 0x19) { + return 0x19; + } + local_84 = local_84 + 1; + } + } + loc_fffb8880: + local_74 = local_74 + 1; + } while (local_74 != 2); + local_78 = local_78 + 1; + if (local_78 == 2) { + if (local_84 != 0) { + memcpy(local_64, ref_fffcbbbc, sizeof(callback_t) * 18); + uVar4 = 1; + for (int k = 0; k < 18 && uVar4 != 0; k++) { + uVar4 = (((callback_t)local_64[k])(ramdata)) & 1; + } + if (uVar4 != 0) { + *(uint8_t *)(ramdata + 0x1740) = 1; + for (int i = 0; i < 2; i++) { + void *ptr8 = ramdata + i * 0x1347 + 0x297c; + *(uint8_t *)(ptr8 + 0xf0) = 1; + for (int j = 0; j < 2; j++) { + void *ptr10 = ptr8 + 0x1150 + j * 0xfb; + if (*(int *)(ptr10 + 1) - 1U < 2) { + *(int *)(ptr8 + 0xf5) += 1; + } + if (*(int *)(ptr10 + 1) == 2) { + uint8_t bVar12 = (*(uint8_t *)(ptr10 + 0xde) - 1); + if (bVar12 < 2) { + cVar2 = ref_fffcbc9d[bVar12]; + } else { + cVar2 = 0; + } + *(uint8_t *)(ptr8 + 0x114f) |= + (cVar2 << (j * 2)); + *(uint8_t *)(ptr8 + 0xf0) &= + *(uint8_t *)(ptr10 + 0xbd); + *(uint8_t *)(ramdata + 0x1740) &= + *(uint8_t *)(ptr10 + 0xbd); + } + } + if ((*(int *)(ptr8 + 0xf5) != 0) + && (*(char *)(ptr8 + 0x114f) != '\0')) { + *(char *)(ramdata + 0x297b) += 1; + *(uint32_t *)(ramdata + + i * 0x1347 + + 0x297c) = 2; + } + } + if (*(char *)(ramdata + 0x297b) != '\0') { + *(uint32_t *)(ramdata + 0x2974) = 2; + local_80 = 0; + } + } + } + return local_80; + } + } while (true); +code_r0x0002376f: + if (iVar3 == 0x100) + goto loc_fffb8880; + goto loc_fffb8775; +} diff --git a/src/northbridge/intel/haswell/mrc_misc.h b/src/northbridge/intel/haswell/mrc_misc.h index 0d0a781ac1..3afc1aacfd 100644 --- a/src/northbridge/intel/haswell/mrc_misc.h +++ b/src/northbridge/intel/haswell/mrc_misc.h @@ -14,3 +14,43 @@ uint64_t udiv64(uint64_t, uint64_t); int fcn_fffaa6af(void *ram_data); int fcn_fffa78a0(void *ramdata); + +typedef int (*callback_t)(void *); +typedef int (*callback3_t)(void *, void *, void *); + +#define DECL_CB1(f) int f(void *) +#define DECL_CB3(f) int f(void *, void *, void *) + +DECL_CB3(fcn_fffbd356); +DECL_CB3(fcn_fffbd30a); +DECL_CB3(fcn_fffbd1e7); +DECL_CB3(fcn_fffbd184); +DECL_CB3(fcn_fffbd1b3); +DECL_CB3(fcn_fffbd106); +DECL_CB3(fcn_fffbd29a); +DECL_CB3(fcn_fffbd213); +DECL_CB3(fcn_fffbd0e4); +DECL_CB3(fcn_fffbd0c8); +DECL_CB3(fcn_fffbd046); +DECL_CB3(fcn_fffbd01d); + +DECL_CB1(fcn_fffbce60); +DECL_CB1(fcn_fffb73ef); +DECL_CB1(fcn_fffb6f52); +DECL_CB1(fcn_fffbcc31); +DECL_CB1(fcn_fffbc869); +DECL_CB1(fcn_fffbc643); +DECL_CB1(fcn_fffbc441); +DECL_CB1(fcn_fffb7633); +DECL_CB1(fcn_fffbc277); +DECL_CB1(fcn_fffbc075); +DECL_CB1(fcn_fffbbe9c); +DECL_CB1(fcn_fffbca4d); +DECL_CB1(fcn_fffbbcd4); +DECL_CB1(fcn_fffbbb0c); +DECL_CB1(fcn_fffb7e5c); +DECL_CB1(fcn_fffb7c94); +DECL_CB1(fcn_fffb7acc); +DECL_CB1(fcn_fffb7866); + +int fcn_fffb8689(void *ramdata); |