// === Function at 0xffd7f7a1 === EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) { int v2; // eax int v3; // ecx void *v4; // ecx int v5; // ecx int v6; // eax int v7; // eax int v8; // eax unsigned __int64 v10; // [esp-Ch] [ebp-10h] if ( (sub_FFD9165B(1024068) & 0x80u) == 0 ) /*0xffd7f7b0*/ { sub_FFD9168B(); /*0xffd7f7b2*/ v2 = sub_FFD9164F(); /*0xffd7f7b7*/ *(_BYTE *)(v2 + 1024068) |= 0x80u; /*0xffd7f7c3*/ } sub_FFD7F9AF(64, (int)"SiInitPrePolicy() Start\n"); /*0xffd7f88f*/ sub_FFD7FD72(0); /*0xffd7f898*/ sub_FFD7FBC7(v3, __rdtsc()); /*0xffd7f8a3*/ sub_FFD816C4(); /*0xffd7f8a8*/ sub_FFD7F9AF(64, (int)"PchInitPrePolicy() - Start\n"); /*0xffd7f8b4*/ sub_FFD87EED(); /*0xffd7f8b9*/ sub_FFD880D2(); /*0xffd7f8be*/ sub_FFD87D42(); /*0xffd7f8c3*/ sub_FFD8155F(); /*0xffd7f8c8*/ sub_FFD8B940(v4); /*0xffd7f8cd*/ sub_FFD7F9AF(64, (int)"PchInitPrePolicy() - End\n"); /*0xffd7f8d9*/ v10 = __rdtsc(); /*0xffd7f8e5*/ sub_FFD7FC48(v5, v10, HIDWORD(v10)); /*0xffd7f8e7*/ v6 = sub_FFD8AD54(); /*0xffd7f8ec*/ v7 = (*(int (__cdecl **)(int, void *))(*(_DWORD *)v6 + 36))(v6, &unk_FFD97FEC); /*0xffd7f8f9*/ if ( v7 < 0 ) /*0xffd7f901*/ { sub_FFD7F9AF(0x80000000, (int)"\nASSERT_EFI_ERROR (Status = %r)\n", v7); /*0xffd7f90e*/ v8 = sub_FFD7F97E(); /*0xffd7f916*/ if ( v8 ) /*0xffd7f91d*/ (*(void (__cdecl **)(const char *, int, const char *))(v8 + 4))( /*0xffd7f92e*/ "e:\\hs\\PurleySktPkg\\SouthClusterLbg\\SiInit\\Pei\\SiInitPreMem.c", 155, "!EFI_ERROR (Status)"); } sub_FFD7F9AF(64, (int)"SiInitPrePolicy() - End\n"); /*0xffd7f93b*/ return 0; /*0xffd7f947*/ } // === Function at 0xffd7f97e === int sub_FFD7F97E() { int v0; // eax _BYTE v2[4]; // [esp+0h] [ebp-8h] BYREF int v3; // [esp+4h] [ebp-4h] BYREF v0 = sub_FFD8AD54(); /*0xffd7f983*/ if ( (*(int (__cdecl **)(int, void *, _DWORD, _BYTE *, int *))(*(_DWORD *)v0 + 32))(v0, &unk_FFD97EAC, 0, v2, &v3) >= 0 ) /*0xffd7f9a2*/ return v3; /*0xffd7f9a8*/ else return 0; /*0xffd7f9a4*/ } // === Function at 0xffd7f9af === int sub_FFD7F9AF(int a1, int a2, ...) { int result; // eax int (__cdecl **v3)(int, int, char *); // esi va_list va; // [esp+10h] [ebp+Ch] BYREF va_start(va, a2); result = sub_FFD7F97E(); /*0xffd7f9b0*/ v3 = (int (__cdecl **)(int, int, char *))result; /*0xffd7f9b5*/ if ( result ) /*0xffd7f9b9*/ { result = sub_FFD8AD05(); /*0xffd7f9bb*/ if ( (result & a1) != 0 ) /*0xffd7f9c6*/ return (*v3)(a1, a2, (char *)va); /*0xffd7f9d2*/ } return result; /*0xffd7f9d7*/ } // === Function at 0xffd7f9d9 === int __fastcall sub_FFD7F9D9(int a1, int a2, const char *PeiServices____((void__)_0)) { int result; // eax result = sub_FFD7F97E(); /*0xffd7f9df*/ if ( result ) /*0xffd7f9e6*/ return (*(int (__cdecl **)(int, int, const char *))(result + 4))(a1, a2, PeiServices____((void__)_0)); /*0xffd7f9ee*/ return result; /*0xffd7f9f4*/ } // === Function at 0xffd7fa46 === unsigned int __fastcall sub_FFD7FA46(unsigned int a1) { unsigned int v2; // eax unsigned __int64 v3; // rtt v2 = (3579545 * (unsigned __int64)a1) >> 32; /*0xffd7fa6c*/ LODWORD(v3) = 3579545 * a1; /*0xffd7fa7c*/ HIDWORD(v3) = v2 % 0xF4240; /*0xffd7fa7c*/ sub_FFD7F9F7(v3 / 0xF4240, v2 / 0xF4240); /*0xffd7fa81*/ return a1; /*0xffd7fa88*/ } // === Function at 0xffd7fa8d === int __fastcall sub_FFD7FA8D(int *a1, int *a2) { int v4; // eax int v5; // eax int v6; // eax int v7; // edi int v8; // eax int result; // eax int v10; // eax int v11; // eax if ( !a1 ) /*0xffd7fa9d*/ { v4 = sub_FFD7F97E(); /*0xffd7fa9f*/ if ( v4 ) /*0xffd7faa6*/ (*(void (__cdecl **)(const char *, int, const char *))(v4 + 4))( /*0xffd7fab0*/ "e:\\hs\\MdeModulePkg\\Library\\PeiPerformanceLib\\PeiPerformanceLib.c", 57, "PeiPerformanceLog != ((void *) 0)"); } if ( !a2 ) /*0xffd7fab8*/ { v5 = sub_FFD7F97E(); /*0xffd7faba*/ if ( v5 ) /*0xffd7fac1*/ (*(void (__cdecl **)(const char *, int, const char *))(v5 + 4))( /*0xffd7facb*/ "e:\\hs\\MdeModulePkg\\Library\\PeiPerformanceLib\\PeiPerformanceLib.c", 58, "PeiPerformanceIdArray != ((void *) 0)"); } v6 = sub_FFD8CE7C(&unk_FFD97F9C); /*0xffd7fad8*/ if ( v6 ) /*0xffd7fadf*/ { *a1 = v6 + 24; /*0xffd7fae9*/ v7 = sub_FFD8CE7C(&unk_FFD97ECC); /*0xffd7faf0*/ if ( !v7 ) /*0xffd7faf4*/ { v8 = sub_FFD7F97E(); /*0xffd7faf6*/ if ( v8 ) /*0xffd7fafd*/ (*(void (__cdecl **)(const char *, int, const char *))(v8 + 4))( /*0xffd7fb07*/ "e:\\hs\\MdeModulePkg\\Library\\PeiPerformanceLib\\PeiPerformanceLib.c", 72, "GuidHob != ((void *) 0)"); } result = v7 + 24; /*0xffd7fb0d*/ } else { v10 = sub_FFD8CF46(&unk_FFD97F9C, 40008); /*0xffd7fb1b*/ *a1 = v10; /*0xffd7fb22*/ *a1 = sub_FFD8D4C8(v10, 40008); /*0xffd7fb2b*/ v11 = sub_FFD8CF46(&unk_FFD97ECC, 4000); /*0xffd7fb39*/ *a2 = v11; /*0xffd7fb40*/ result = sub_FFD8D4C8(v11, 4000); /*0xffd7fb44*/ } *a2 = result; /*0xffd7fb4a*/ return result; /*0xffd7fb49*/ } // === Function at 0xffd7fb51 === int __thiscall sub_FFD7FB51(unsigned int *this) { int v2; // esi unsigned int v3; // eax int v4; // ebx int v5; // ebp unsigned int v7; // [esp+8h] [ebp-4h] v2 = 0; /*0xffd7fb56*/ v3 = *this; /*0xffd7fb58*/ v7 = *this; /*0xffd7fb5a*/ if ( *this ) /*0xffd7fb58*/ { while ( 1 ) /*0xffd7fb68*/ { v4 = v3 - v2 - 1; /*0xffd7fb68*/ v5 = 40 * v4; /*0xffd7fb69*/ if ( !*((_QWORD *)this + 5 * v4 + 5) /*0xffd7fba8*/ && *(_UNKNOWN **)((char *)this + v5 + 8) == &unk_FFD97F8C && *(unsigned int *)((char *)this + v5 + 12) == (*(this + 10 * v4 + 11) | *(this + 10 * v4 + 10)) && !sub_FFD8D0FF(7) && !sub_FFD8D0FF(7) ) { break; /*0xffd7fba8*/ } v3 = v7; /*0xffd7fbb2*/ if ( ++v2 >= v7 ) /*0xffd7fbb9*/ return v2; /*0xffd7fbb9*/ } return v4; /*0xffd7fbbd*/ } return v2; /*0xffd7fbc1*/ } // === Function at 0xffd7fbc7 === int __cdecl sub_FFD7FBC7(int a1, __int64 a2) { _DWORD *v2; // ecx int v3; // edx int v5; // edi int v6; // esi int v7; // eax int v8; // edx unsigned __int64 v9; // rax int v10; // [esp+8h] [ebp-8h] BYREF _DWORD *v11; // [esp+Ch] [ebp-4h] BYREF sub_FFD7FA8D((int *)&v11, &v10); /*0xffd7fbd4*/ v2 = v11; /*0xffd7fbd9*/ v3 = *v11; /*0xffd7fbdc*/ if ( *v11 < 0x3E8u ) /*0xffd7fbe4*/ { v5 = HIDWORD(a2); /*0xffd7fbfe*/ v6 = 10 * v3; /*0xffd7fc04*/ *v11 = v3 + 1; /*0xffd7fc07*/ v2[v6 + 3] = 0; /*0xffd7fc0b*/ v2[v6 + 10] = 0; /*0xffd7fc0f*/ v2[v6 + 11] = 0; /*0xffd7fc13*/ v7 = v10; /*0xffd7fc17*/ v2[v6 + 2] = &unk_FFD97F8C; /*0xffd7fc1a*/ *(_DWORD *)(v7 + 4 * v3) = 20704; /*0xffd7fc22*/ v8 = a2; /*0xffd7fc29*/ if ( !a2 ) /*0xffd7fc30*/ { v9 = __rdtsc(); /*0xffd7fc32*/ v5 = HIDWORD(v9); /*0xffd7fc34*/ v8 = v9; /*0xffd7fc36*/ } v2[v6 + 8] = v8; /*0xffd7fc38*/ v2[v6 + 9] = v5; /*0xffd7fc3e*/ return 0; /*0xffd7fc3c*/ } else { sub_FFD7F9AF(0x80000000, (int)"PEI performance log array out of resources\n"); /*0xffd7fbf0*/ return -2147483639; /*0xffd7fbf7*/ } } // === Function at 0xffd7fc48 === int __cdecl sub_FFD7FC48(int a1, unsigned __int64 a2) { unsigned __int64 v2; // kr00_8 unsigned int *v3; // ebx unsigned int v4; // eax int v6; // [esp+Ch] [ebp-4h] BYREF v2 = a2; /*0xffd7fc54*/ if ( !a2 ) /*0xffd7fc59*/ v2 = __rdtsc(); /*0xffd7fc5f*/ sub_FFD7FA8D((int *)&a2 + 1, &v6); /*0xffd7fc67*/ v3 = (unsigned int *)HIDWORD(a2); /*0xffd7fc6c*/ v4 = sub_FFD7FB51((unsigned int *)HIDWORD(a2)); /*0xffd7fc74*/ if ( v4 >= *v3 ) /*0xffd7fc7e*/ return -2147483634; /*0xffd7fc80*/ *(_QWORD *)&v3[10 * v4 + 10] = v2; /*0xffd7fc8b*/ return 0; /*0xffd7fc94*/ } // === Function at 0xffd7fc9b === int sub_FFD7FC9B() { int v0; // eax int v2; // esi int v3; // eax int v4; // [esp+4h] [ebp-4h] BYREF sub_FFD8C2A0(0xEFu, 0x2234u, 4, &v4); /*0xffd7fcb0*/ if ( v4 < 0 ) /*0xffd7fcbf*/ { sub_FFD7F9AF(0x80000000, (int)"TraceHubBaseSet Error. DMIC.SRL is set.\n"); /*0xffd7fcc7*/ v0 = sub_FFD7F97E(); /*0xffd7fcce*/ if ( v0 ) /*0xffd7fcd5*/ (*(void (__cdecl **)(const char *, int, const char *))(v0 + 4))( /*0xffd7fce3*/ "e:\\hs\\PurleySktPkg\\SouthClusterLbg\\Library\\PeiDxeSmmTraceHubInitLib\\PeiDxeSmmTraceHubInitLib.c", 64, "((BOOLEAN)(0==1))"); return -2147483645; /*0xffd7fcee*/ } v2 = sub_FFD8CBBA(0, 31, 7); /*0xffd7fcfd*/ if ( (unsigned __int16)sub_FFD8CCA5((unsigned __int16 *)v2) == 0xFFFF ) /*0xffd7fd0e*/ { v3 = sub_FFD7F97E(); /*0xffd7fd10*/ if ( v3 ) /*0xffd7fd17*/ (*(void (__cdecl **)(const char *, int, const char *))(v3 + 4))( /*0xffd7fd20*/ "e:\\hs\\PurleySktPkg\\SouthClusterLbg\\Library\\PeiDxeSmmTraceHubInitLib\\PeiDxeSmmTraceHubInitLib.c", 74, "((BOOLEAN)(0==1))"); return -2147483645; /*0xffd7fd20*/ } *(_DWORD *)(v2 + 112) = -32768000; /*0xffd7fd2c*/ *(_DWORD *)(v2 + 116) = 0; /*0xffd7fd2f*/ sub_FFD8C497(4, -32768000); /*0xffd7fd40*/ sub_FFD8C497(4, 0); /*0xffd7fd50*/ sub_FFD8C5F6(255, 2); /*0xffd7fd63*/ return 0; /*0xffd7fd6d*/ } // === Function at 0xffd7fd72 === int __fastcall sub_FFD7FD72(char a1) { int v2; // esi int result; // eax unsigned int v4; // [esp+Ch] [ebp-4h] BYREF sub_FFD7F9AF(64, (int)"TraceHubInitialize() - Start\n"); /*0xffd7fd84*/ sub_FFD8C909(&v4); /*0xffd7fd8c*/ *(_BYTE *)(v4 + 1488) = 0; /*0xffd7fd9b*/ v2 = sub_FFD8CBBA(0, 31, 7); /*0xffd7fdb0*/ if ( (unsigned __int16)sub_FFD8CCA5((unsigned __int16 *)v2) == 0xFFFF ) /*0xffd7fdc1*/ return sub_FFD7F9AF(64, (int)"TraceHubInitialize() - End. TraceHub device is not present \n"); /*0xffd7fdc8*/ if ( (*(_DWORD *)(v2 + 4) & 2) != 0 ) /*0xffd7fdd2*/ { sub_FFD7F9AF(64, (int)"TraceHubInitialize() - End. Early init done already \n"); /*0xffd7fdda*/ sub_FFD7F9AF(64, (int)"TraceHubInitialize() - FW_LBAR = 0x%08x\n", *(_DWORD *)(v2 + 112)); /*0xffd7fde9*/ sub_FFD7F9AF(64, (int)"TraceHubInitialize() - MTB_LBAR = 0x%08x\n", *(_DWORD *)(v2 + 16)); /*0xffd7fdfb*/ sub_FFD7F9AF(64, (int)"TraceHubInitialize() - SW_LBAR = 0x%08x\n", *(_DWORD *)(v2 + 24)); /*0xffd7fe0d*/ result = MEMORY[0xFE1000E0]; /*0xffd7fe1a*/ if ( (MEMORY[0xFE1000E0] & 0x1000000) != 0 ) /*0xffd7fe21*/ return sub_FFD7F9AF(64, (int)"TraceHubInitialize() - Trace Hub enabled due to SCRPD0.24\n"); /*0xffd7fe2c*/ } else { sub_FFD7F9AF(64, (int)"TraceHubInitialize() - Setting MTB_BAR\n"); /*0xffd7fe37*/ *(_DWORD *)(v2 + 16) = -32505856; /*0xffd7fe3e*/ *(_DWORD *)(v2 + 20) = 0; /*0xffd7fe47*/ *(_BYTE *)(v2 + 4) |= 2u; /*0xffd7fe4f*/ if ( (MEMORY[0xFE1000E0] & 0x1000000) != 0 || a1 ) /*0xffd7fe62*/ { MEMORY[0xFE1000CC] = 357000000; /*0xffd7fe91*/ *(_BYTE *)(v2 + 4) = 0; /*0xffd7fe9c*/ sub_FFD7F9AF(64, (int)"TraceHubInitialize() - Setting SW_BAR\n"); /*0xffd7fe9f*/ *(_DWORD *)(v2 + 24) = -31457280; /*0xffd7fea9*/ *(_DWORD *)(v2 + 28) = 0; /*0xffd7feb1*/ sub_FFD7F9AF(64, (int)"TraceHubInitialize() - Setting FW_BAR\n"); /*0xffd7feb8*/ sub_FFD7FC9B(); /*0xffd7febd*/ sub_FFD7F9AF(64, (int)"TraceHubInitialize() - Enabling MSE and BME\n"); /*0xffd7fec8*/ *(_BYTE *)(v2 + 4) |= 6u; /*0xffd7fed8*/ sub_FFD7F9AF(64, (int)"TraceHubInitialize () Assigned BARs:\n"); /*0xffd7fedb*/ sub_FFD7F9AF(64, (int)"TraceHubInitialize () FW_LBAR = 0x%08x\n", *(_DWORD *)(v2 + 112)); /*0xffd7feea*/ sub_FFD7F9AF(64, (int)"TraceHubInitialize () MTB_LBAR = 0x%08x\n", *(_DWORD *)(v2 + 16)); /*0xffd7fefc*/ sub_FFD7F9AF(64, (int)"TraceHubInitialize () SW_LBAR = 0x%08x\n", *(_DWORD *)(v2 + 24)); /*0xffd7ff0e*/ return sub_FFD7F9AF(64, (int)"TraceHubInitialize () - End\n"); /*0xffd7ff1c*/ } else { *(_BYTE *)(v2 + 4) = 0; /*0xffd7fe6a*/ sub_FFD7F9AF(64, (int)"TraceHubInitialize() - Clearing MTB_BAR\n"); /*0xffd7fe6d*/ *(_DWORD *)(v2 + 16) = 0; /*0xffd7fe78*/ return sub_FFD7F9AF( /*0xffd7fe7f*/ 64, (int)"TraceHubInitialize() - End. STT disconnected and Trace Hub requested to be disable\n"); } } return result; /*0xffd7ff23*/ } // === Function at 0xffd80210 === int sub_FFD80210() { int v0; // eax int v1; // eax unsigned __int8 *v2; // esi int v3; // edi unsigned int i; // ebp unsigned int v5; // ecx unsigned int v6; // edx unsigned int v7; // ebx unsigned __int8 v8; // cl unsigned int v9; // ebx int v10; // ebx unsigned int v11; // eax int result; // eax int v13; // [esp+0h] [ebp-24h] BYREF int v14; // [esp+4h] [ebp-20h] int v15; // [esp+8h] [ebp-1Ch] _DWORD *v16; // [esp+Ch] [ebp-18h] BYREF int n10; // [esp+10h] [ebp-14h] int v18; // [esp+14h] [ebp-10h] BYREF int v19; // [esp+18h] [ebp-Ch] BYREF unsigned int v20; // [esp+1Ch] [ebp-8h] unsigned int v21; // [esp+20h] [ebp-4h] v13 = 0; /*0xffd80213*/ v0 = sub_FFD8AD54(); /*0xffd80217*/ if ( (*(int (__cdecl **)(int, int, _DWORD **))(*(_DWORD *)v0 + 76))(v0, 4, &v16) ) /*0xffd80226*/ { v1 = sub_FFD7F97E(); /*0xffd80230*/ if ( v1 ) /*0xffd80237*/ (*(void (__cdecl **)(const char *, int, const char *))(v1 + 4))( /*0xffd80248*/ "e:\\hs\\PurleySktPkg\\SouthClusterLbg\\LibraryPrivate\\PeiPchInitLib\\PchInitPreMem.c", 456, "Status == 0"); } *v16 = 0; /*0xffd80255*/ v2 = (unsigned __int8 *)&unk_FFD980CC; /*0xffd80258*/ v15 = 0; /*0xffd8025d*/ n10 = 10; /*0xffd80263*/ do { v3 = 0; /*0xffd8026b*/ for ( i = 0; i < 0xC00; i += 512 ) { v5 = 0; /*0xffd80272*/ v6 = i + *((_DWORD *)v2 + 2); /*0xffd80274*/ v14 = 0; /*0xffd80276*/ v21 = v6; /*0xffd8027a*/ if ( v2[v3 + 1] ) { while ( 1 ) /*0xffd80288*/ { v7 = v5; /*0xffd80288*/ v8 = *v2; /*0xffd8028e*/ v9 = v6 + 32 * v7; /*0xffd80294*/ v20 = v9; /*0xffd8029b*/ sub_FFD8C2A0(v8, v9, 4, &v18); /*0xffd8029f*/ sub_FFD8C2A0(*v2, v9, 4, &v19); /*0xffd802b0*/ v10 = v18; /*0xffd802b5*/ if ( v18 == v19 ) /*0xffd802c0*/ { v13 = v18; /*0xffd802dd*/ } else { sub_FFD8C2A0(*v2, v20, 4, &v13); /*0xffd802d0*/ v10 = v13; /*0xffd802d5*/ } if ( v10 ) /*0xffd802e3*/ break; /*0xffd802e3*/ v11 = v2[v3 + 1]; /*0xffd802e9*/ v5 = v14 + 1; /*0xffd802ee*/ v6 = v21; /*0xffd802ef*/ v14 = v5; /*0xffd802f3*/ if ( v5 >= v11 ) /*0xffd802f9*/ goto LABEL_14; /*0xffd802f9*/ } *v16 |= (v10 & 7) << v15; /*0xffd80311*/ sub_FFD7F9AF(0x80000000, (int)"ERROR: Internal fabric error detected!! "); sub_FFD7F9AF( /*0xffd80331*/ 0x80000000, (int)"PSF PID:0x%x, RSx/PortGroup:0x%x, Port:0x%x, Channel:0, error bits:0x%x\n", *v2, v3, v14, v10); } LABEL_14: ++v3; /*0xffd8033f*/ } v15 += 3; /*0xffd8034c*/ v2 += 12; /*0xffd80351*/ --n10; /*0xffd80354*/ } while ( n10 ); result = sub_FFD8CFB4(&unk_FFD97F6C, 4); /*0xffd8036a*/ if ( !result ) /*0xffd80376*/ { result = sub_FFD7F97E(); /*0xffd80378*/ if ( result ) /*0xffd8037f*/ return (*(int (__cdecl **)(const char *, int, const char *))(result + 4))( /*0xffd80390*/ "e:\\hs\\PurleySktPkg\\SouthClusterLbg\\LibraryPrivate\\PeiPchInitLib\\PchInitPreMem.c", 504, "HobPtr != 0"); } return result; /*0xffd80396*/ } // === Function at 0xffd8040b === int __thiscall sub_FFD8040B(_BYTE *this) { int v3; // [esp+8h] [ebp-8h] BYREF sub_FFD8C578(-983041, 0); /*0xffd80425*/ if ( (*(this + 3504) & 1) != 0 ) /*0xffd80434*/ { sub_FFD8C578(-1, 16); /*0xffd8047a*/ LABEL_6: MEMORY[0xFE0005D0] = 0x80000000; /*0xffd80481*/ return sub_FFD8C578(-1, 1); /*0xffd80481*/ } if ( (*(this + 3504) & 2) != 0 ) /*0xffd8043d*/ { sub_FFD8C2A0(0xB8u, 4u, 4, &v3); /*0xffd8044a*/ if ( (v3 & 0x600) != 0 ) /*0xffd8045d*/ goto LABEL_6; /*0xffd8045d*/ } sub_FFD8C578(-17, 1); /*0xffd80468*/ return sub_FFD8C578(-1, 1); /*0xffd8049b*/ } // === Function at 0xffd804a1 === int __thiscall sub_FFD804A1(_BYTE *this) { int v2; // eax if ( (unsigned __int8)sub_FFD8D59A() ) { sub_FFD7F9AF(64, (int)"DWR: PchMiscInit() End\n"); } else { sub_FFD8BE68(); /*0xffd804c0*/ v2 = sub_FFD8CBBA(0, 31, 2); /*0xffd804ce*/ *(_DWORD *)(v2 + 172) &= ~0x100000u; /*0xffd804e5*/ if ( *(this + 1) ) /*0xffd804f0*/ sub_FFD8C5F6(255, 8); /*0xffd80506*/ else sub_FFD8C5F6(247, 0); /*0xffd804fd*/ sub_FFD8C578(-1793, 8207); /*0xffd80521*/ sub_FFD8C578(-1, 0x80000000); /*0xffd80535*/ sub_FFD8C5F6(223, 0); /*0xffd80556*/ } return 0; /*0xffd8055d*/ } // === Function at 0xffd80563 === int __thiscall sub_FFD80563(int this) { int v2; // ebx unsigned int v3; // esi v2 = sub_FFD8CBBA(0, 31, 1); /*0xffd80574*/ if ( (*(_DWORD *)(this + 2727) & 2) != 0 ) /*0xffd8057f*/ sub_FFD8CCD3( /*0xffd805aa*/ v2 + 112, (*(_DWORD *)(this + 2727) >> 21) & 7 | (unsigned __int16)(8 * ((32 * *(unsigned __int8 *)(this + 2728)) | HIWORD(*(_DWORD *)(this + 2727)) & 0x1F))); v3 = *(_DWORD *)(this + 2731); /*0xffd805af*/ if ( !v3 ) /*0xffd805b7*/ v3 = -19922944; /*0xffd805b9*/ *(_BYTE *)(v2 + 96) = *(_BYTE *)(v2 + 96) & 0xFC | (v3 >> 12) & 3 | 0x80; /*0xffd805d0*/ if ( (*(_BYTE *)(this + 2727) & 1) != 0 ) /*0xffd805dd*/ *(_DWORD *)(v3 + 16) |= 1u; /*0xffd805e5*/ sub_FFD8CF04(v3, 0); /*0xffd805ed*/ return sub_FFD8D005(v3, 0); /*0xffd805ff*/ } // === Function at 0xffd80603 === int __thiscall sub_FFD80603(int this) { unsigned __int8 n0x2C; // bl int v3; // ecx unsigned __int16 *v4; // edi unsigned __int8 v6; // [esp+Fh] [ebp-1h] sub_FFD7F9AF(64, (int)"ProgramSvidSid() Start\n"); /*0xffd80613*/ sub_FFD8BE68(); /*0xffd8061a*/ if ( (unsigned __int8)sub_FFD8D59A() ) { sub_FFD7F9AF(64, (int)"DWR: ProgramSvidSid() End\n"); } else { n0x2C = 0; /*0xffd8062f*/ if ( *(_WORD *)(this + 8) || *(_WORD *)(this + 10) ) /*0xffd80637*/ { do /*0xffd80693*/ { v3 = 3 * n0x2C; /*0xffd80640*/ v6 = byte_FFD97FFE[v3]; /*0xffd80658*/ v4 = (unsigned __int16 *)sub_FFD8CBBA(0, byte_FFD97FFC[v3], byte_FFD97FFD[v3]); /*0xffd80667*/ if ( (unsigned __int16)sub_FFD8CCA5(v4) == 0x8086 ) /*0xffd80678*/ *(_DWORD *)((char *)v4 + v6) = *(_DWORD *)(this + 8); /*0xffd8068b*/ ++n0x2C; /*0xffd8068e*/ } while ( n0x2C < 0x2Cu ); /*0xffd80693*/ } sub_FFD7F9AF(64, (int)"ProgramSvidSid() End\n"); /*0xffd8069c*/ } return 0; /*0xffd806a3*/ } // === Function at 0xffd806ac === int __thiscall sub_FFD806AC(char *this) { char *this_1; // ebx unsigned int v2; // ebp int v3; // eax unsigned int n3; // esi unsigned int v5; // edi _DWORD *v6; // ebx int v7; // edx int v10; // [esp+18h] [ebp-Ch] int v11; // [esp+1Ch] [ebp-8h] int v12; // [esp+20h] [ebp-4h] v10 = 0; /*0xffd806b9*/ this_1 = this; /*0xffd806ba*/ v11 = 0; /*0xffd806c0*/ v12 = 0; /*0xffd806c1*/ v2 = (unsigned __int8)sub_FFD8BFFD(); /*0xffd806c7*/ if ( (v2 & 0xFFFFFFF8) > 0x18 ) /*0xffd806d2*/ { v3 = sub_FFD7F97E(); /*0xffd806d4*/ if ( v3 ) /*0xffd806db*/ (*(void (__cdecl **)(const char *, int, const char *))(v3 + 4))( /*0xffd806ec*/ "e:\\hs\\PurleySktPkg\\SouthClusterLbg\\LibraryPrivate\\PeiPchInitLib\\PchInitPreMem.c", 958, "(MaxPciePortNum / 8) <= 3"); } n3 = 0; /*0xffd806f2*/ v5 = 0; /*0xffd806f4*/ if ( v2 ) /*0xffd806f8*/ { v6 = this_1 + 28; /*0xffd806fa*/ do /*0xffd8072a*/ { if ( (*v6 & 0x800) != 0 ) /*0xffd80705*/ v7 = (unsigned __int16)*v6 >> 12; /*0xffd8070a*/ else v7 = 0; /*0xffd8070f*/ v6 += 25; /*0xffd8071e*/ *(&v10 + (v5 >> 3)) |= v7 << (4 * (v5 & 7)); /*0xffd80723*/ ++v5; /*0xffd80727*/ } while ( v5 < v2 ); /*0xffd8072a*/ this_1 = this; /*0xffd8072c*/ } v12 |= (*(_DWORD *)(this_1 + 2755) & 0xFFFFFF80) << 21; /*0xffd80747*/ sub_FFD7F9AF(64, (int)"DRCRM: 0x%08x 0x%08x 0x%08x\n", v10, v11, v12); do /*0xffd80779*/ sub_FFD8C497(4, *(&v10 + n3++)); /*0xffd8076e*/ while ( n3 < 3 ); /*0xffd80779*/ return sub_FFD8C578(-1, -2147254272); /*0xffd8078e*/ } // === 0xffd80796 === {"addr":"0xffd80796","code":"// positive sp value has been detected, the output may be wrong!\nint __thiscall sub_FFD80796(int this)\n{\n int v2; // ebx\n int v3; // esi\n int v4; // ebp\n int v5; // eax\n int v6; // eax\n int v7; // eax\n int v8; // eax\n int v9; // eax\n int v10; // eax\n int v11; // eax\n int v12; // eax\n bool v13; // zf\n char v14; // bl\n _BYTE *v15; // eax\n int n3; // ecx\n int v17; // edx\n int v18; // eax\n int v19; // edx\n int v20; // eax\n int v21; // eax\n int v22; // eax\n int v23; // eax\n int v24; // eax\n int v25; // eax\n int v26; // eax\n int v27; // eax\n int v28; // ecx\n _DWORD v30[3]; // [esp+4h] [ebp-14h] BYREF\n int v31; // [esp+10h] [ebp-8h] BYREF\n\n sub_FFD7F9AF(64, (int)\"PchOnPolicyInstalled() - Start\\n\"); /*0xffd807ab*/\n v2 = sub_FFD8CBBA(0, 31, 0); /*0xffd807c1*/\n v3 = sub_FFD8CBBA(0, 31, 2); /*0xffd807d5*/\n v4 = sub_FFD8CBBA(0, 31, 5); /*0xffd807e1*/\n v5 = sub_FFD8C632(*(_WORD *)(this + 2)); /*0xffd807e3*/\n if ( v5 < 0 ) /*0xffd807ea*/\n {\n sub_FFD7F9AF(0x8000... [6904 chars total]","refs":[{"addr":"0xffd7f9af","name":"sub_FFD7F9AF"},{"addr":"0xffd921d4","name":"aPchonpolicyins","string":"PchOnPolicyInstalled() - Start\n"},{"addr":"0xffd8cbba","name":"sub_FFD8CBBA"},{"addr":"0xffd8c632","name":"sub_FFD8C632"},{"addr":"0xffd9192c","name":"aAssertEfiError","string":"\nASSERT_EFI_ERROR (Status = %r)\n"},{"addr":"0xffd7f97e","name":"sub_FFD7F97E"},{"addr":"0xffd91f24","name":"aEHsPurleysktpk_1","string":"e:\\hs\\PurleySktPkg\\SouthClusterLbg\\LibraryPrivate\\PeiPchInitLib\\PchInitPreMem.c"},{"addr":"0xffd91950","name":"aEfiErrorStatus","string":"!EFI_ERROR (Status)"},{"addr":"0xffd8c80a","name":"sub_FFD8C80A"},{"addr":"0xffd94584","name":"aWdtUsageMismat","string":"(WDT) Usage mismatched with policy\n"}]}Output truncated. Run: curl -o .ida-mcp/8ab907f0-29ca-41a0-9d6b-fa48fe5810b5.json http://127.0.0.1:13432/output/8ab907f0-29ca-41a0-9d6b-fa48fe5810b5.json // === 0xffd80ba6 === {"addr":"0xffd80ba6","code":"int __thiscall sub_FFD80BA6(int *this)\n{\n int v2; // esi\n int v3; // edi\n int v4; // ebx\n int v5; // ebp\n int n2_1; // ebx\n int v7; // ebx\n __int16 v8; // si\n int v9; // ebx\n int v10; // eax\n int v11; // eax\n int v12; // eax\n int v14; // [esp+10h] [ebp-54h] BYREF\n int v15; // [esp+14h] [ebp-50h] BYREF\n int v16; // [esp+18h] [ebp-4Ch] BYREF\n int n2; // [esp+1Ch] [ebp-48h]\n int v18; // [esp+20h] [ebp-44h] BYREF\n int v19; // [esp+24h] [ebp-40h] BYREF\n int v20; // [esp+28h] [ebp-3Ch] BYREF\n int v21; // [esp+2Ch] [ebp-38h] BYREF\n int v22; // [esp+30h] [ebp-34h]\n int v23; // [esp+34h] [ebp-30h] BYREF\n int n704654080; // [esp+38h] [ebp-2Ch]\n int n671099136; // [esp+3Ch] [ebp-28h]\n int n637544192; // [esp+40h] [ebp-24h]\n int n603989248; // [esp+44h] [ebp-20h]\n int n570434304; // [esp+48h] [ebp-1Ch]\n int n536879360; // [esp+4Ch] [ebp-18h]\n int n637544192_1; // [esp+50h] [ebp-14h]\n int n603989248_1; // [esp+54h] [ebp-10h]\n int n570434304_1; // [esp+58h] [ebp-Ch]\n i... [12460 chars total]","refs":[{"addr":"0xffd8be68","name":"sub_FFD8BE68"},{"addr":"0xffd7f9af","name":"sub_FFD7F9AF"},{"addr":"0xffd92214","name":"aPchearlydisabl","string":"PchEarlyDisabledDeviceHandling() - Start\n"},{"addr":"0xffd92240","name":"aPchpwrmbaseRPc","string":"PchPwrmBase + R_PCH_PWRM_FUSE_DIS_RD_2 = %x\n"},{"addr":"0xffd8c2a0","name":"sub_FFD8C2A0"},{"addr":"0xffd92270","name":"aSpaControllerP","string":"SPA Controller PCD Value = %x\n"},{"addr":"0xffd92290","name":"aSpbControllerP","string":"SPB Controller PCD Value = %x\n"},{"addr":"0xffd922b0","name":"aSpcControllerP","string":"SPC Controller PCD Value = %x\n"},{"addr":"0xffd922d0","name":"aSpdControllerP","string":"SPD Controller PCD Value = %x\n"},{"addr":"0xffd922f0","name":"aSpeControllerP","string":"SPE Controller PCD Value = %x\n"}]}Output truncated. Run: curl -o .ida-mcp/7508e8c4-5a63-42fa-96dc-a63404b02de7.json http://127.0.0.1:13432/output/7508e8c4-5a63-42fa-96dc-a63404b02de7.json // === Function at 0xffd813d1 === int __thiscall sub_FFD813D1(int *this) { int v2; // eax int v3; // edi unsigned __int8 v4; // al unsigned __int8 v5; // al unsigned __int8 v6; // al unsigned __int8 v7; // al sub_FFD7F9AF(64, (int)"PchEarlyInit() - Start\n"); /*0xffd813df*/ sub_FFD82723(); /*0xffd813e4*/ sub_FFD81769(); /*0xffd813e9*/ sub_FFD8C497(2, 1); /*0xffd813fc*/ sub_FFD8C5F6(255, 3); /*0xffd81414*/ sub_FFD8C578(-2, 0); /*0xffd81425*/ v2 = sub_FFD8CBBA(0, 31, 1); /*0xffd81431*/ *(_DWORD *)(v2 + 128) = 0; /*0xffd8143b*/ *(_DWORD *)(v2 + 132) = 0; /*0xffd81441*/ *(_DWORD *)(v2 + 136) = 0; /*0xffd81447*/ *(_DWORD *)(v2 + 140) = 0; /*0xffd8144d*/ *(_DWORD *)(v2 + 144) = 0; /*0xffd81453*/ *(_DWORD *)(v2 + 148) = 61440; /*0xffd81459*/ *(_DWORD *)(v2 + 152) = 16; /*0xffd81463*/ *(_DWORD *)(v2 + 156) = 0; /*0xffd8146d*/ *(_BYTE *)(v2 + 244) |= 1u; /*0xffd8147d*/ v3 = sub_FFD8CBBA(0, 31, 2); /*0xffd8148d*/ if ( (*(_BYTE *)(v3 + 164) & 4) != 0 ) /*0xffd81499*/ { __outbyte(0x74u, 0xAu); /*0xffd814a3*/ v4 = __inbyte(0x74u); /*0xffd814a4*/ __outbyte(0x75u, v4 & 0x8F | 0x60); /*0xffd814af*/ __outbyte(0x74u, 0xBu); /*0xffd814b5*/ v5 = __inbyte(0x75u); /*0xffd814b9*/ __outbyte(0x75u, v5 | 0x80); /*0xffd814bc*/ __outbyte(0x74u, 0xAu); /*0xffd814c2*/ v6 = __inbyte(0x75u); /*0xffd814c6*/ __outbyte(0x75u, v6 & 0x8F | 0x20); /*0xffd814cb*/ __outbyte(0x74u, 0xBu); /*0xffd814d1*/ v7 = __inbyte(0x75u); /*0xffd814d5*/ __outbyte(0x75u, v7 & 0x7F); /*0xffd814d8*/ } *(this + 4) = 16; /*0xffd814d9*/ *(_DWORD *)(v3 + 172) &= ~0x100000u; /*0xffd814ed*/ *(this + 53) = 0; /*0xffd814f3*/ *(this + 61) = 0; /*0xffd814f9*/ sub_FFD80BA6(this); /*0xffd814ff*/ sub_FFD905CC(); /*0xffd81504*/ sub_FFD8C497(4, 0); /*0xffd81518*/ sub_FFD8C497(4, 18875648); /*0xffd8152c*/ sub_FFD8C497(4, 0); /*0xffd81539*/ sub_FFD8C497(4, 18875648); /*0xffd81545*/ return sub_FFD7F9AF(64, (int)"PchEarlyInit() - End\n"); /*0xffd81559*/ } // === Function at 0xffd8155f === int sub_FFD8155F() { int v0; // eax int v1; // esi int v2; // eax int v3; // eax int v4; // esi int v5; // eax int *v7; // [esp+10h] [ebp-4h] BYREF sub_FFD7F9AF(64, (int)"PchInitPreMem() - Start\n"); /*0xffd8156b*/ if ( !(unsigned __int8)sub_FFD8BDC8() ) /*0xffd81572*/ { sub_FFD7F9AF(0x80000000, (int)"PCH SKU is not supported due to no proper PCH LPC found!\n"); /*0xffd8158b*/ v0 = sub_FFD7F97E(); /*0xffd81592*/ if ( v0 ) /*0xffd81599*/ (*(void (__cdecl **)(const char *, int, const char *))(v0 + 4))( /*0xffd815a6*/ "e:\\hs\\PurleySktPkg\\SouthClusterLbg\\LibraryPrivate\\PeiPchInitLib\\PchInitPreMem.c", 1948, "((BOOLEAN)(0==1))"); } v1 = sub_FFD8CBBA(0, 31, 1); /*0xffd815b8*/ if ( (*(_DWORD *)(v1 + 16) & 0xFF000000) == 0 ) /*0xffd815c4*/ { sub_FFD7F9AF(64, (int)"SBREG should be programmed before here\n"); /*0xffd815cd*/ *(_DWORD *)(v1 + 16) = -50331648; /*0xffd815d2*/ *(_BYTE *)(v1 + 4) |= 2u; /*0xffd815e0*/ } sub_FFD8C632(0x500u); /*0xffd815e8*/ sub_FFD8C80A(); /*0xffd815ed*/ sub_FFD8C99B(); /*0xffd815f2*/ sub_FFD8C909((unsigned int *)&v7); /*0xffd815fb*/ sub_FFD7F9AF(64, (int)"PCH PWRM Base needs to be programmed before here\n"); /*0xffd81607*/ if ( !v7 ) /*0xffd81613*/ { v2 = sub_FFD7F97E(); /*0xffd81615*/ if ( v2 ) /*0xffd8161c*/ (*(void (__cdecl **)(const char *, int, const char *))(v2 + 4))( /*0xffd81629*/ "e:\\hs\\PurleySktPkg\\SouthClusterLbg\\LibraryPrivate\\PeiPchInitLib\\PchInitPreMem.c", 1993, "PchPwrmBase != 0"); } if ( (unsigned __int8)sub_FFD8D59A() ) { sub_FFD7F9AF(0x80000000, (int)"DWR: DWR detected - install PPI\n"); if ( sub_FFD7F948(&unk_FFD98084) >= 0 ) sub_FFD7F9AF(0x80000000, (int)"DWR: DWR PPI has been installed\n"); else sub_FFD7F9AF(0x80000000, (int)"ERROR: Can't install DWR PPI\n"); } sub_FFD80210(); /*0xffd81667*/ sub_FFD813D1(v7); /*0xffd81670*/ v3 = sub_FFD7F948(&unk_FFD980AC); /*0xffd8167a*/ v4 = v3; /*0xffd8167f*/ if ( v3 < 0 ) /*0xffd81683*/ { sub_FFD7F9AF(0x80000000, (int)"\nASSERT_EFI_ERROR (Status = %r)\n", v3); /*0xffd8168c*/ v5 = sub_FFD7F97E(); /*0xffd81694*/ if ( v5 ) /*0xffd8169b*/ (*(void (__cdecl **)(const char *, int, const char *))(v5 + 4))( /*0xffd816a8*/ "e:\\hs\\PurleySktPkg\\SouthClusterLbg\\LibraryPrivate\\PeiPchInitLib\\PchInitPreMem.c", 2007, "!EFI_ERROR (Status)"); } sub_FFD7F9AF(64, (int)"PchInitPreMem() - End\n"); /*0xffd816b5*/ return v4; /*0xffd816bc*/ } // === Function at 0xffd816c4 === int sub_FFD816C4() { int v0; // esi int v1; // ecx __int16 v2; // ax double v4; // [esp-4h] [ebp-34h] double v5; // [esp-4h] [ebp-34h] double v6; // [esp-4h] [ebp-34h] _BYTE v7[32]; // [esp+Ch] [ebp-24h] BYREF int p_n32; // [esp+2Ch] [ebp-4h] BYREF v0 = sub_FFD8CBBA(0, 31, 0); /*0xffd816db*/ p_n32 = 32; /*0xffd816e3*/ sub_FFD8BE68(); /*0xffd816e6*/ sub_FFD8C111(&p_n32); /*0xffd816f1*/ LODWORD(v4) = v7; /*0xffd816fa*/ sub_FFD7F9AF(64, (int)"PCH Series : %a\n", v4); p_n32 = 32; /*0xffd8170a*/ sub_FFD8BB3A(v1); /*0xffd81712*/ sub_FFD8C06D(&p_n32); /*0xffd8171d*/ LODWORD(v5) = v7; /*0xffd81726*/ sub_FFD7F9AF(64, (int)"PCH Stepping : %a\n", v5); p_n32 = 32; /*0xffd81736*/ v2 = sub_FFD8CCA5((unsigned __int16 *)(v0 + 2)); /*0xffd81740*/ sub_FFD8C1B5(v2, v7, &p_n32); /*0xffd8174a*/ LODWORD(v6) = v7; /*0xffd81753*/ return sub_FFD7F9AF(64, (int)"PCH SKU : %a\n", v6); } // === Function at 0xffd821b8 === int __fastcall sub_FFD821B8(int a1, char a2, int a3, unsigned __int8 n2) { unsigned __int8 n2_1; // bh char v5; // bl int v7; // edi int v8; // eax __int16 v9; // si int v10; // edx unsigned __int8 v11; // bl char v12; // al char v13; // al char n2_2; // [esp+11h] [ebp-3h] BYREF char v16; // [esp+12h] [ebp-2h] char v17; // [esp+13h] [ebp-1h] BYREF n2_1 = n2; /*0xffd821ba*/ v5 = 0; /*0xffd821be*/ v16 = a2; /*0xffd821c0*/ if ( n2 == 1 ) { sub_FFD7F9AF(64, (int)"EarlyConfigurePchHSata() - First Controller - Start\n"); /*0xffd821d5*/ v7 = sub_FFD8CBBA(0, 23, 0); /*0xffd821e9*/ sub_FFD8C019(); /*0xffd821eb*/ } else { if ( n2 != 2 ) { sub_FFD7F9AF(0x80000000, (int)"Error: Invalid SATA controller!\n"); return -2147483646; /*0xffd8244e*/ } sub_FFD7F9AF(64, (int)"EarlyConfigurePchHSata() - Second Controller - Start\n"); /*0xffd82202*/ v7 = sub_FFD8CBBA(0, 17, 5); /*0xffd82216*/ } v8 = sub_FFD8CBBA(0, 31, 0); /*0xffd8221f*/ v9 = sub_FFD8CCA5((unsigned __int16 *)(v8 + 2)); /*0xffd8222d*/ if ( !(unsigned __int8)sub_FFD8D58A() ) /*0xffd82230*/ { if ( n2_1 == 1 ) /*0xffd8223c*/ v5 = sub_FFD81814(); /*0xffd82243*/ if ( n2_1 != 2 ) /*0xffd82248*/ goto LABEL_14; /*0xffd82248*/ v11 = 0; /*0xffd8224a*/ while ( 1 ) /*0xffd82253*/ { sub_FFD8E7BA(v11, &n2); /*0xffd82253*/ sub_FFD8E062(n2, &v17, &n2_2); /*0xffd82266*/ if ( n2_2 == 2 ) /*0xffd82271*/ break; /*0xffd82271*/ if ( ++v11 >= 6u ) /*0xffd82278*/ { v5 = 0; /*0xffd8227a*/ goto LABEL_14; /*0xffd8227c*/ } } } v5 = 1; /*0xffd8227e*/ LABEL_14: if ( (*(_BYTE *)a1 & 1) != 0 && (v5 || *(_DWORD *)(a1 + 4)) ) /*0xffd8228e*/ { *(_BYTE *)(v7 + 160) = -104; /*0xffd82298*/ *(_DWORD *)(v7 + 164) = *(_DWORD *)(v7 + 164) & 0xFFFFFE00 | 0x183; /*0xffd822ad*/ *(_BYTE *)(v7 + 160) = -104; /*0xffd822b3*/ *(_DWORD *)(v7 + 164) |= 0x8000u; /*0xffd822c5*/ *(_BYTE *)(v7 + 160) = -92; /*0xffd822cb*/ *(_DWORD *)(v7 + 164) |= 0x40u; /*0xffd822db*/ if ( v9 == -24254 /*0xffd8237d*/ || v9 == -24253 || v9 == -24252 || v9 == -24251 || v9 == -24250 || v9 == -24249 || v9 == -24248 || v9 == -24256 || v9 == -24255 || v9 == -24243 || v9 == -24242 || v9 == -24241 || v9 == -25280 || v9 == -25279 || v9 == -25278 || v9 == -25277 || v9 == -25274 || v9 == -25272 ) { *(_BYTE *)(v7 + 160) = -100; /*0xffd8237f*/ *(_DWORD *)(v7 + 164) |= 0x400000u; /*0xffd82391*/ } *(_BYTE *)(v7 + 160) = -100; /*0xffd82397*/ *(_DWORD *)(v7 + 164) = *(_DWORD *)(v7 + 164) & 0xDF63E013 | 0x209C0224; /*0xffd823ae*/ if ( n2_1 == 1 ) /*0xffd823b7*/ { *(_BYTE *)(v7 + 160) = -100; /*0xffd823b9*/ *(_DWORD *)(v7 + 164) |= 0x40000000u; /*0xffd823cb*/ } v12 = *(_BYTE *)(v7 + 156) | 0x20; /*0xffd823d7*/ if ( *(_DWORD *)(a1 + 4) == 1 ) /*0xffd823dd*/ { if ( (*(_BYTE *)(a1 + 76) & 1) != 0 ) /*0xffd823e5*/ v12 = *(_BYTE *)(v7 + 156) & 0x1F | 0xA0; /*0xffd823e7*/ else v12 = *(_BYTE *)(v7 + 156) & 0x1F | 0x60; /*0xffd823eb*/ } if ( v16 ) /*0xffd823f2*/ v13 = v12 & 0xE1 | 6; /*0xffd823f6*/ else v13 = v12 & 0xE8 | 0x10; /*0xffd823fc*/ *(_BYTE *)(v7 + 156) = v13 & 0xF8 | 6; /*0xffd8240d*/ sub_FFD8CC4F(v7 + 148, 255); /*0xffd82413*/ sub_FFD7FA46(2u); /*0xffd8241b*/ sub_FFD7F9AF(64, (int)"EarlyConfigurePchHSata() End\n"); /*0xffd82427*/ return 0; /*0xffd8242c*/ } else { LOBYTE(v10) = n2_1; /*0xffd82434*/ sub_FFD81FF5(a3, v10); /*0xffd82436*/ return 0; /*0xffd8243b*/ } } // === Function at 0xffd8245b === int __cdecl sub_FFD8245B(int n2) { int v1; // ecx int v2; // ebx int v3; // edi int v4; // esi unsigned int n6; // ebp int v6; // eax unsigned __int8 n6_1; // cl int v8; // eax v2 = 0; /*0xffd82460*/ v3 = v1; /*0xffd8246c*/ if ( (_BYTE)n2 == 1 ) /*0xffd8246e*/ { sub_FFD7F9AF(64, (int)"ConfigurePchHSata() - First Controller - Start\n"); /*0xffd82477*/ v4 = sub_FFD8CBBA(0, 23, 0); /*0xffd8248a*/ n6 = (unsigned __int8)sub_FFD8C019(); /*0xffd82491*/ } else { sub_FFD7F9AF(64, (int)"ConfigurePchHSata() - Second Controller - Start\n"); /*0xffd8249d*/ v4 = sub_FFD8CBBA(0, 17, 5); /*0xffd824b1*/ n6 = 6; /*0xffd824b5*/ } v6 = sub_FFD8CBBA(0, 31, 0); /*0xffd824bc*/ sub_FFD8CCA5((unsigned __int16 *)(v6 + 2)); /*0xffd824c5*/ sub_FFD81B92(n2); /*0xffd824d4*/ if ( (*(_BYTE *)v3 & 8) != 0 ) /*0xffd824dd*/ { n6_1 = 0; /*0xffd824e3*/ if ( n6 ) /*0xffd824e7*/ { v8 = 0; /*0xffd824e9*/ do /*0xffd82506*/ { if ( (*(_BYTE *)(v3 + 8 * v8 + 12) & 1) != 0 && (*(_DWORD *)(v3 + 8 * v8 + 12) & 0x40000A) != 0 ) /*0xffd824fa*/ v2 |= 1 << v8; /*0xffd824fc*/ v8 = ++n6_1; /*0xffd82501*/ } while ( n6_1 < n6 ); /*0xffd82506*/ } *(_BYTE *)(v4 + 160) = -112; /*0xffd82508*/ *(_DWORD *)(v4 + 164) |= (unsigned __int8)~(_BYTE)v2; /*0xffd82521*/ *(_BYTE *)(v4 + 160) = 0x80; /*0xffd8252c*/ *(_DWORD *)(v4 + 164) |= v2 << 16; /*0xffd8253b*/ *(_BYTE *)(v4 + 160) = -116; /*0xffd82541*/ *(_DWORD *)(v4 + 164) |= 0xFF00FFu; /*0xffd82550*/ *(_BYTE *)(v4 + 160) = -96; /*0xffd82556*/ *(_DWORD *)(v4 + 164) = *(_DWORD *)(v4 + 164) & 0xFF037FFF | 0x588000; /*0xffd8256d*/ *(_BYTE *)(v4 + 160) = -124; /*0xffd82573*/ *(_DWORD *)(v4 + 164) |= 0xFF00FFu; /*0xffd82582*/ *(_BYTE *)(v4 + 160) = -92; /*0xffd82588*/ *(_DWORD *)(v4 + 164) |= 0x4000u; /*0xffd8259a*/ *(_BYTE *)(v4 + 160) = -52; /*0xffd825a0*/ *(_DWORD *)(v4 + 164) = -2009296895; /*0xffd825a7*/ *(_BYTE *)(v4 + 160) = -48; /*0xffd825b1*/ *(_DWORD *)(v4 + 164) = *(_DWORD *)(v4 + 164) & 0xFFFF0000 | 0x8828; /*0xffd825c8*/ *(_BYTE *)(v4 + 160) = -56; /*0xffd825ce*/ *(_DWORD *)(v4 + 164) |= 8u; /*0xffd825de*/ *(_BYTE *)(v4 + 160) = -56; /*0xffd825e4*/ *(_DWORD *)(v4 + 164) |= 1u; /*0xffd825f4*/ *(_BYTE *)(v4 + 160) = -56; /*0xffd825fa*/ *(_DWORD *)(v4 + 164) |= 2u; /*0xffd8260a*/ } *(_BYTE *)(v4 + 160) = -88; /*0xffd82610*/ *(_DWORD *)(v4 + 164) &= 0xFFF0FFFF; /*0xffd82622*/ *(_BYTE *)(v4 + 160) = -44; /*0xffd82628*/ *(_DWORD *)(v4 + 164) = *(_DWORD *)(v4 + 164) & 0xC0C0E0E0 | 0x2C1E1108; /*0xffd8263f*/ *(_BYTE *)(v4 + 158) &= ~1u; /*0xffd8264d*/ if ( *(_DWORD *)(v3 + 4) == 1 ) /*0xffd82657*/ *(_BYTE *)(v4 + 158) |= 1u; /*0xffd82661*/ if ( (_BYTE)n2 == 1 ) /*0xffd8266c*/ return sub_FFD7F9AF(64, (int)"ConfigurePchHSata() - First Controller - End\n"); /*0xffd82673*/ else return sub_FFD7F9AF(64, (int)"ConfigurePchHSata() - Second Controller - End\n"); /*0xffd8267c*/ } // === Function at 0xffd826ae === bool __fastcall sub_FFD826AE(int a1, int a2, char a3) { int v5; // eax int v6; // ecx int n17; // [esp+Ch] [ebp-10h] BYREF int v9; // [esp+10h] [ebp-Ch] int v10; // [esp+14h] [ebp-8h] BYREF char n2; // [esp+1Bh] [ebp-1h] v5 = sub_FFD8AD54(); /*0xffd826bb*/ (*(void (__cdecl **)(int, int *))(*(_DWORD *)v5 + 40))(v5, &n17); /*0xffd826c7*/ n2 = *(_BYTE *)(100 * a2 + a1 + 5); /*0xffd826d6*/ sub_FFD8D75C(&v10); /*0xffd826dd*/ v6 = sub_FFD8CBBA(0, v9, v10); /*0xffd826f3*/ return (!n2 || n2 == 2) && n17 == 17 && (*(_BYTE *)(v6 + 76) & 0xFu) >= 3 && a3 == 1; /*0xffd8271c*/ } // === Function at 0xffd82c71 === int sub_FFD82C71() { unsigned int i; // edi int v1; // ebx unsigned __int16 v2; // ax char v4; // [esp+10h] [ebp-8h] int v5; // [esp+14h] [ebp-4h] BYREF sub_FFD7F9AF(64, (int)"PciERWORegInit() Start\n"); /*0xffd82c81*/ if ( (unsigned __int8)sub_FFD8D59A() ) { sub_FFD7F9AF(64, (int)"DWR: PciERWORegInit() End\n"); } else { sub_FFD8BE68(); /*0xffd82c9b*/ for ( i = 0; i < (unsigned __int8)sub_FFD8BFFD(); ++i ) /*0xffd82ca2*/ { sub_FFD8D75C(&v5); /*0xffd82cb4*/ v1 = sub_FFD8CBBA(0, v4, v5); /*0xffd82cc8*/ if ( (unsigned __int16)sub_FFD8CCA5((unsigned __int16 *)v1) != 0xFFFF ) /*0xffd82cd9*/ { v2 = sub_FFD8CCA5((unsigned __int16 *)(v1 + 68)); /*0xffd82cde*/ sub_FFD8CCD3(v1 + 68, v2); /*0xffd82ce9*/ *(_DWORD *)(v1 + 76) = *(_DWORD *)(v1 + 76); /*0xffd82cf1*/ *(_DWORD *)(v1 + 84) = *(_DWORD *)(v1 + 84); /*0xffd82cf7*/ *(_DWORD *)(v1 + 216) |= 0x800000u; /*0xffd82d05*/ } } sub_FFD7F9AF(64, (int)"PciERWORegInit() End\n"); /*0xffd82d1f*/ } return 0; /*0xffd82d26*/ } // === Function at 0xffd82d2f === int __fastcall sub_FFD82D2F(int a1, int a2) { unsigned __int8 i_1; // al unsigned int i_2; // esi unsigned int i; // ebx int v5; // eax int v6; // edi unsigned int j; // esi int v8; // ebp unsigned int n0x96; // ebp unsigned int i_3; // esi unsigned int k; // ebp int v12; // esi unsigned int n0x96_2; // ebp unsigned int i_4; // esi unsigned int n0x96_1; // [esp+14h] [ebp-60h] BYREF unsigned int v17; // [esp+18h] [ebp-5Ch] int v18; // [esp+1Ch] [ebp-58h] int v19; // [esp+20h] [ebp-54h] _DWORD v20[20]; // [esp+24h] [ebp-50h] v18 = a2; /*0xffd82d36*/ v19 = a1; /*0xffd82d3a*/ if ( (unsigned __int8)sub_FFD8D59A() ) { sub_FFD7F9AF(64, (int)"DWR: PchPcieRpSpeedChange() End\n"); } else { i_1 = sub_FFD8BFFD(); /*0xffd82d5a*/ i_2 = 0; /*0xffd82d5f*/ for ( i = i_1; i_2 < i; ++i_2 ) /*0xffd82d66*/ { v20[i_2] = 0; /*0xffd82d68*/ if ( sub_FFD8D75C(&n0x96_1) >= 0 ) /*0xffd82d80*/ { v20[i_2] = sub_FFD8CBBA(0, v17, n0x96_1); /*0xffd82db2*/ } else { v5 = sub_FFD7F97E(); /*0xffd82d82*/ if ( v5 ) /*0xffd82d89*/ (*(void (__cdecl **)(const char *, int, const char *))(v5 + 4))( /*0xffd82d9a*/ "e:\\hs\\PurleySktPkg\\SouthClusterLbg\\LibraryPrivate\\PeiPchInitLib\\PchRootPorts.c", 822, "((BOOLEAN)(0==1))"); } } v6 = 0; /*0xffd82dbb*/ for ( j = 0; j < i; ++j ) /*0xffd82dc1*/ { v8 = v20[j]; /*0xffd82dc3*/ if ( v8 ) /*0xffd82dc9*/ { if ( (unsigned __int16)sub_FFD8CCA5((unsigned __int16 *)v20[j]) != 0xFFFF ) /*0xffd82dda*/ { v17 = *(_DWORD *)(v8 + 76) & 0xF; /*0xffd82de2*/ if ( v17 > 1 && !sub_FFD826AE(v19 + 28, j, *(_BYTE *)(j + v18)) ) /*0xffd82dfd*/ { sub_FFD8CC85(v17); /*0xffd82e13*/ if ( (sub_FFD8CCA5((unsigned __int16 *)(v8 + 90)) & 0x40) != 0 ) /*0xffd82e23*/ { sub_FFD8CC4F(v8 + 80, 32); /*0xffd82e2b*/ v6 |= 1 << j; /*0xffd82e30*/ } } } } } n0x96 = 0; /*0xffd82e38*/ n0x96_1 = 0; /*0xffd82e3a*/ if ( v6 ) /*0xffd82e40*/ { do /*0xffd82e90*/ { if ( n0x96 >= 0x96 ) /*0xffd82e4c*/ break; /*0xffd82e4c*/ sub_FFD7FA46(0x64u); /*0xffd82e51*/ i_3 = 0; /*0xffd82e56*/ if ( i ) /*0xffd82e5a*/ { do /*0xffd82e83*/ { if ( ((1 << i_3) & v6) != 0 && (sub_FFD8CCA5((unsigned __int16 *)(v20[i_3] + 82)) & 0x2000) != 0 ) /*0xffd82e7b*/ v6 &= ~(1 << i_3); /*0xffd82e7d*/ ++i_3; /*0xffd82e80*/ } while ( i_3 < i ); /*0xffd82e83*/ n0x96 = n0x96_1; /*0xffd82e85*/ } n0x96_1 = ++n0x96; /*0xffd82e8a*/ } while ( v6 ); /*0xffd82e90*/ if ( v6 ) /*0xffd82e94*/ { for ( k = 0; k < i; ++k ) /*0xffd82e9e*/ { if ( ((1 << k) & v6) != 0 ) /*0xffd82ea9*/ { v12 = v20[k]; /*0xffd82eab*/ sub_FFD8CC85(1); /*0xffd82eb9*/ sub_FFD8CC4F(v12 + 80, 32); /*0xffd82ec5*/ } } n0x96_2 = 0; /*0xffd82ecf*/ n0x96_1 = 0; /*0xffd82ed1*/ do /*0xffd82f1f*/ { if ( n0x96_2 >= 0x96 ) /*0xffd82edb*/ break; /*0xffd82edb*/ sub_FFD7FA46(0x64u); /*0xffd82ee0*/ i_4 = 0; /*0xffd82ee5*/ if ( i ) /*0xffd82ee9*/ { do /*0xffd82f12*/ { if ( ((1 << i_4) & v6) != 0 && (sub_FFD8CCA5((unsigned __int16 *)(v20[i_4] + 82)) & 0x2000) != 0 ) /*0xffd82f0a*/ v6 &= ~(1 << i_4); /*0xffd82f0c*/ ++i_4; /*0xffd82f0f*/ } while ( i_4 < i ); /*0xffd82f12*/ n0x96_2 = n0x96_1; /*0xffd82f14*/ } n0x96_1 = ++n0x96_2; /*0xffd82f19*/ } while ( v6 ); /*0xffd82f1f*/ } } } return 0; /*0xffd82f21*/ } // === Function at 0xffd82f2b === bool __fastcall sub_FFD82F2B(int a1, unsigned __int8 a2, unsigned __int16 *a3) { char v5; // bl unsigned int v7; // ebp unsigned __int8 v8; // al unsigned __int16 *v9; // ecx unsigned int *v11; // [esp+1Ch] [ebp+4h] v5 = 0; /*0xffd82f40*/ *(_DWORD *)(a3 + 1) = 0xFFFF; /*0xffd82f42*/ *a3 = -1; /*0xffd82f49*/ if ( (sub_FFD8CCA5((unsigned __int16 *)(a1 + 90)) & 0x40) == 0 ) /*0xffd82f56*/ return 0; /*0xffd82f58*/ *(_DWORD *)(a1 + 24) = *(_DWORD *)(a1 + 24) & 0xFF0000FF | ((a2 | (a2 << 8)) << 8); /*0xffd82f7c*/ v11 = (unsigned int *)sub_FFD8CBBA(a2, 0, 0); /*0xffd82f8b*/ sub_FFD8CCD3(v11, 0); /*0xffd82f8f*/ v7 = *v11; /*0xffd82f94*/ *(_DWORD *)a3 = *v11; /*0xffd82f9c*/ if ( v7 != -1 ) /*0xffd82fa6*/ { v8 = sub_FFD90A71(0, HIWORD(v7)); /*0xffd82fb0*/ if ( v8 ) /*0xffd82fb9*/ { v9 = (unsigned __int16 *)((char *)v11 + v8 + 12); /*0xffd82fc5*/ v5 = *(_BYTE *)v9 & 0xF; /*0xffd82fc9*/ *((_BYTE *)a3 + 5) = ((unsigned __int16)sub_FFD8CCA5(v9) >> 4) & 0x3F; /*0xffd82fd7*/ } *((_BYTE *)a3 + 4) = v5; /*0xffd82fda*/ } *(_DWORD *)(a1 + 24) &= 0xFF0000FF; /*0xffd82fe5*/ sub_FFD7F9AF( 64, (int)"VID: %04X DID: %04X MLS: %d MLW: %d\n", *a3, a3[1], *((unsigned __int8 *)a3 + 4), *((unsigned __int8 *)a3 + 5)); return v7 != -1; /*0xffd83012*/ } // === Function at 0xffd83019 === int sub_FFD83019() { int result; // eax int v1; // eax int v2; // esi int v3; // eax int *v4; // eax int *v5; // esi int v6; // ecx int v7; // eax int v8; // esi int v9; // eax _DWORD v10[2]; // [esp+0h] [ebp-10h] BYREF char v11[8]; // [esp+8h] [ebp-8h] BYREF result = sub_FFD8D59A(); /*0xffd8301c*/ if ( (_BYTE)result ) { sub_FFD7F9AF(0x80000000, (int)"\nDirtyWarmResetExecute() - Start\n"); /*0xffd83037*/ v1 = sub_FFD85F37(); /*0xffd8303c*/ v2 = sub_FFD8D921(v1); /*0xffd83048*/ if ( sub_FFD82F2B(v2, 2u, (unsigned __int16 *)v11) ) { *(_DWORD *)(v2 + 24) = *(_DWORD *)(v2 + 24) & 0xFF0000FF | 0x20200; /*0xffd83083*/ v3 = sub_FFD8CBBA(2u, 0, 0); /*0xffd83086*/ sub_FFD8CCD3(v3, 0); /*0xffd83090*/ } else { sub_FFD7F9AF(0x80000000, (int)"ERROR: DirtyWarmReset: can't get end point device available...\n"); } v4 = (int *)sub_FFD8CC10(); /*0xffd83099*/ v5 = v4; /*0xffd8309e*/ v6 = *v4; /*0xffd830a8*/ if ( (*v4 & 0x2000000) != 0 && v6 != -1 ) /*0xffd830b5*/ *v4 = v6 | 0x4000000; /*0xffd830b9*/ sub_FFD7F9AF(64, (int)"DWR: Sending DirtyWarmReset Notification ...\n"); sub_FFD7F948(&unk_FFD93FB4); /*0xffd830cc*/ sub_FFD7F9AF(64, (int)"DWR: DirtyWarmReset Notification completed\n"); if ( (*v5 & 0x2000000) != 0 && *v5 != -1 ) { sub_FFD7F9AF(64, (int)"\nDWR: Stalling in DWR flow to allow error collection.\n"); while ( (*v5 & 0x4000000) != 0 ) /*0xffd83100*/ ; /*0xffd830fc*/ } v7 = sub_FFD8AD54(); /*0xffd83102*/ v8 = (*(int (__cdecl **)(int, void *, _DWORD, _DWORD, _DWORD *))(*(_DWORD *)v7 + 32))(v7, &unk_FFD97FAC, 0, 0, v10); /*0xffd8311c*/ if ( v8 < 0 ) { sub_FFD7F9AF(0x80000000, (int)"\nDWR: ERROR: Can't get reset PPI\n"); sub_FFD7F9AF(0x80000000, (int)"\nASSERT_EFI_ERROR (Status = %r)\n", v8); /*0xffd83142*/ v9 = sub_FFD7F97E(); /*0xffd8314a*/ if ( v9 ) /*0xffd83151*/ (*(void (__cdecl **)(const char *, int, const char *))(v9 + 4))( /*0xffd83162*/ "e:\\hs\\PurleySktPkg\\SouthClusterLbg\\LibraryPrivate\\PeiPchInitLib\\PchRootPorts.c", 1104, "!EFI_ERROR (Status)"); } else { (*(void (__cdecl **)(_DWORD, int))v10[0])(v10[0], 5); /*0xffd8312a*/ } sub_FFD7F9AF(0x80000000, (int)"\nDWR: Waiting for reset.\n"); v10[1] = 0; /*0xffd83175*/ while ( 1 ) /*0xffd83179*/ ; /*0xffd83179*/ } return result; /*0xffd83182*/ } // === Function at 0xffd83186 === int __thiscall sub_FFD83186(char *this) { int v2; // eax int v3; // eax int v4; // eax int v5; // eax int v6; // esi double v8; // [esp-4h] [ebp-20h] int v9; // [esp+14h] [ebp-8h] BYREF v2 = sub_FFD8D75C(&v9); /*0xffd8319f*/ if ( v2 < 0 ) /*0xffd831b1*/ { sub_FFD7F9AF(0x80000000, (int)"\nASSERT_EFI_ERROR (Status = %r)\n", v2); /*0xffd831be*/ v3 = sub_FFD7F97E(); /*0xffd831c6*/ if ( v3 ) /*0xffd831cd*/ (*(void (__cdecl **)(const char *, int, const char *))(v3 + 4))( /*0xffd831d6*/ "e:\\hs\\PurleySktPkg\\SouthClusterLbg\\LibraryPrivate\\PeiPchInitLib\\PchRootPorts.c", 1132, "!EFI_ERROR (Status)"); } v4 = sub_FFD9041E(&v9); /*0xffd831e8*/ if ( v4 < 0 ) /*0xffd831f0*/ { sub_FFD7F9AF(0x80000000, (int)"\nASSERT_EFI_ERROR (Status = %r)\n", v4); /*0xffd831fd*/ v5 = sub_FFD7F97E(); /*0xffd83205*/ if ( v5 ) /*0xffd8320c*/ (*(void (__cdecl **)(const char *, int, const char *))(v5 + 4))( /*0xffd83215*/ "e:\\hs\\PurleySktPkg\\SouthClusterLbg\\LibraryPrivate\\PeiPchInitLib\\PchRootPorts.c", 1135, "!EFI_ERROR (Status)"); } v6 = (unsigned __int16)v9 >> 14; /*0xffd83225*/ LODWORD(v8) = off_FFD93F7C[v6]; // "4x1" /*0xffd83228*/ sub_FFD7F9AF(64, (int)"PCIe SP%c is %a\n", this + 65, v8); /*0xffd83237*/ return v6; /*0xffd83241*/ } // === Function at 0xffd83249 === int sub_FFD83249() { int n2; // esi char *n3_1; // edi int v2; // ebx int v3; // eax int v4; // eax int v5; // eax int v6; // eax unsigned int i; // ebp int v8; // eax int v9; // ecx int v10; // esi int v12; // [esp+14h] [ebp-30h] int v13; // [esp+1Ch] [ebp-28h] int n2_2; // [esp+28h] [ebp-1Ch] int v15; // [esp+2Ch] [ebp-18h] unsigned int n3; // [esp+30h] [ebp-14h] int n2_1; // [esp+34h] [ebp-10h] int n4; // [esp+38h] [ebp-Ch] int n4_1; // [esp+3Ch] [ebp-8h] int n4_2; // [esp+40h] [ebp-4h] sub_FFD7F9AF(64, (int)"PchConfigurePsfGrantCountsForPcie() Start\n"); /*0xffd83257*/ n2 = sub_FFD8BE68(); /*0xffd83263*/ n2_2 = n2; /*0xffd83265*/ if ( n2 == 2 ) /*0xffd8326c*/ n3 = 3; /*0xffd8326e*/ else n3 = 5; /*0xffd83288*/ n3_1 = 0; /*0xffd832a0*/ v2 = 0; /*0xffd832a2*/ v15 = 0; /*0xffd832a6*/ do /*0xffd8341f*/ { v3 = sub_FFD83186(n3_1); /*0xffd832ad*/ if ( !v3 ) /*0xffd832b5*/ { n2_1 = 1; /*0xffd83325*/ n4 = 1; /*0xffd83329*/ goto LABEL_16; /*0xffd83329*/ } v4 = v3 - 1; /*0xffd832b7*/ if ( !v4 ) /*0xffd832ba*/ { n2_1 = 2; /*0xffd83313*/ n4 = 4; /*0xffd8331b*/ LABEL_16: n4_2 = 1; /*0xffd8332d*/ n4_1 = 1; /*0xffd83331*/ goto LABEL_17; /*0xffd83331*/ } v5 = v4 - 1; /*0xffd832bc*/ if ( v5 ) /*0xffd832bf*/ { if ( v5 != 1 ) /*0xffd832c4*/ { v6 = sub_FFD7F97E(); /*0xffd832c6*/ if ( v6 ) /*0xffd832cd*/ (*(void (__cdecl **)(const char *, int, const char *))(v6 + 4))( /*0xffd832e2*/ "e:\\hs\\PurleySktPkg\\SouthClusterLbg\\LibraryPrivate\\PeiPchInitLib\\PchRootPorts.c", 1230, "((BOOLEAN)(0==1))"); goto LABEL_23; /*0xffd832e8*/ } n2_1 = 4; /*0xffd832ed*/ n4_1 = 4; /*0xffd832f1*/ } else { n2_1 = 2; /*0xffd832f7*/ n4_1 = 2; /*0xffd832ff*/ } n4 = 4; /*0xffd83307*/ n4_2 = 4; /*0xffd8330b*/ LABEL_17: for ( i = 0; i < 4; ++i ) /*0xffd83335*/ { if ( n2 == 2 ) /*0xffd8333a*/ { v8 = (unsigned __int8)byte_FFD93FCC[v2]; /*0xffd83343*/ v12 = (unsigned __int8)byte_FFD93FCD[v2]; /*0xffd8334a*/ v9 = (unsigned __int8)byte_FFD93F44[4 * (_DWORD)n3_1 + i]; /*0xffd8334e*/ } else { v8 = (unsigned __int8)byte_FFD93F8C[v2]; /*0xffd8335f*/ v12 = (unsigned __int8)byte_FFD93F8D[v2]; /*0xffd83366*/ v9 = (unsigned __int8)byte_FFD93F5C[4 * (_DWORD)n3_1 + i]; /*0xffd8336a*/ } v10 = *(&n2_1 + i); /*0xffd83372*/ v13 = v9; /*0xffd8337f*/ sub_FFD7F9AF(64, (int)"DGCR%d = %d\n", v8, v10); /*0xffd83387*/ sub_FFD8C578(-32, v10); /*0xffd8339f*/ sub_FFD7F9AF(64, (int)"DGCR%d = %d\n", v12, v10); /*0xffd833b0*/ sub_FFD8C578(-32, v10); /*0xffd833c8*/ sub_FFD7F9AF(64, (int)"PG1_TGT%d = %d\n", v13, v10); /*0xffd833d9*/ sub_FFD8C578(-32, v10); /*0xffd833f4*/ n2 = n2_2; /*0xffd833f9*/ v2 += 2; /*0xffd833ff*/ } v2 = v15; /*0xffd8340c*/ LABEL_23: ++n3_1; /*0xffd83413*/ v2 += 8; /*0xffd83414*/ v15 = v2; /*0xffd83417*/ } while ( (unsigned int)n3_1 < n3 ); /*0xffd8341f*/ return sub_FFD7F9AF(64, (int)"PchConfigurePsfGrantCountsForPcie() End\n"); /*0xffd83433*/ } // === 0xffd85246 === {"addr":"0xffd85246","code":"int __fastcall sub_FFD85246(int a1, int a2, int a3)\n{\n int n15000_6; // edi\n int v5; // ebx\n int n15000_5; // esi\n unsigned __int8 v7; // al\n int v8; // ebp\n _DWORD *n15000_8; // ebp\n int v10; // edi\n int v11; // esi\n unsigned __int8 v12; // al\n int v13; // edi\n unsigned int v14; // eax\n int v15; // ecx\n unsigned __int8 v16; // al\n int v17; // esi\n int v18; // eax\n bool v19; // zf\n unsigned __int16 *i; // ecx\n int v21; // ecx\n _WORD *n15000_7; // esi\n int v23; // edi\n int v24; // edx\n int v25; // ebx\n int v26; // esi\n int v27; // eax\n int j; // ebx\n int n15000_3; // edi\n int v30; // eax\n unsigned int j_1; // ecx\n int v32; // esi\n unsigned int v33; // edx\n int v34; // edx\n char *v35; // edi\n int v36; // ecx\n char v37; // al\n int v38; // ebx\n int v39; // edi\n int v40; // esi\n int n15000_4; // edx\n unsigned int v42; // ecx\n int v43; // eax\n int v44; // eax\n unsigned __int8 v46; // [esp+10h] [ebp-48h]\n unsigned __int8 v47; // [esp+11h] [ebp-47h]\n ... [11197 chars total]","refs":[{"addr":"0xffd7f9af","name":"sub_FFD7F9AF"},{"addr":"0xffd93d94","name":"aPchinitrootpor","string":"PchInitRootPorts() Start\n"},{"addr":"0xffd93db0","name":"aDwrPchinitroot","string":"DWR: PchInitRootPorts() End\n"},{"addr":"0xffd8d59a","name":"sub_FFD8D59A"},{"addr":"0xffd8cbba","name":"sub_FFD8CBBA"},{"addr":"0xffd8c76f","name":"sub_FFD8C76F"},{"addr":"0xffd8bffd","name":"sub_FFD8BFFD"},{"addr":"0xffd8d921","name":"sub_FFD8D921"},{"addr":"0xffd834e9","name":"sub_FFD834E9"},{"addr":"0xffd839ac","name":"sub_FFD839AC"}]}Output truncated. Run: curl -o .ida-mcp/0dd08b46-6856-4525-99b0-6ec7e22c3ec6.json http://127.0.0.1:13432/output/0dd08b46-6856-4525-99b0-6ec7e22c3ec6.json // === Function at 0xffd85f37 === int sub_FFD85F37() { int v0; // eax int v1; // eax int v2; // esi int v3; // eax _DWORD v5[2]; // [esp+8h] [ebp-8h] BYREF v0 = sub_FFD8AD54(); /*0xffd85f3e*/ v1 = (*(int (__cdecl **)(int, void *, _DWORD, _DWORD, _DWORD *))(*(_DWORD *)v0 + 32))(v0, &unk_FFD97EEC, 0, 0, v5); /*0xffd85f53*/ v2 = v1; /*0xffd85f56*/ if ( v1 < 0 ) { sub_FFD7F9AF(0x80000000, (int)"ERROR: DWR Can't find PCH Policy (Status: %r)\n", v1); sub_FFD7F9AF(0x80000000, (int)"\nASSERT_EFI_ERROR (Status = %r)\n", v2); /*0xffd85f78*/ v3 = sub_FFD7F97E(); /*0xffd85f80*/ if ( v3 ) /*0xffd85f88*/ (*(void (__cdecl **)(const char *, int, const char *))(v3 + 4))( /*0xffd85f99*/ "e:\\hs\\PurleySktPkg\\SouthClusterLbg\\LibraryPrivate\\PeiPchInitLib\\PchRootPorts.c", 4100, "!EFI_ERROR (Status)"); v5[1] = 0; /*0xffd85f9f*/ while ( 1 ) /*0xffd85fa2*/ ; /*0xffd85fa2*/ } return (unsigned __int8)(*(_DWORD *)(v5[0] + 2975) >> 18); /*0xffd85faa*/ } // === Function at 0xffd860b8 === int __thiscall sub_FFD860B8(int this) { int v2; // esi int v3; // edi int v4; // eax _DWORD *v5; // eax int n8; // edx int v8; // [esp+14h] [ebp-8h] BYREF int n17; // [esp+18h] [ebp-4h] BYREF sub_FFD7F9AF(64, (int)"ConfigureXhci() - Start\n"); /*0xffd860c8*/ v2 = *(_DWORD *)(this + 3510); /*0xffd860cd*/ sub_FFD8BE68(); /*0xffd860d9*/ v3 = sub_FFD8CBBA(0, 20, 0); /*0xffd860f1*/ sub_FFD8C76F(&v8); /*0xffd860f3*/ *(_DWORD *)(v3 + 16) = v2; /*0xffd860fd*/ sub_FFD8CC4F(v3 + 4, 6); /*0xffd86101*/ if ( (*(_BYTE *)(this + 2263) & 2) != 0 ) /*0xffd86109*/ *(_DWORD *)(v2 + 33004) |= 1u; /*0xffd86114*/ v4 = sub_FFD8AD54(); /*0xffd8611a*/ (*(void (__cdecl **)(int, int *))(*(_DWORD *)v4 + 40))(v4, &n17); /*0xffd86127*/ if ( n17 == 17 ) /*0xffd86133*/ sub_FFD86747(this + 2263); /*0xffd86137*/ else sub_FFD85FBC(); /*0xffd8613e*/ sub_FFD861FF(this, v2, v3); /*0xffd86148*/ sub_FFD8701A(this, v2); /*0xffd86151*/ sub_FFD7F9AF(64, (int)"xHCI: XhciPostInitDone Start\n"); *(_DWORD *)(v2 + 32992) &= ~0x10000u; /*0xffd86174*/ *(_DWORD *)(v3 + 80) = 265186911; /*0xffd8617c*/ sub_FFD7F9AF(64, (int)"xHCI: XhciPostInitDone End\n"); if ( (*(_BYTE *)(this + 2263) & 4) != 0 ) /*0xffd8618e*/ { sub_FFD86E37(this + 2263, v3); /*0xffd86194*/ } else { sub_FFD7F9AF(0x80000000, (int)"Clear Over-Current registers\n"); /*0xffd861a5*/ v5 = (_DWORD *)(v3 + 208); /*0xffd861ae*/ n8 = 8; /*0xffd861b4*/ do /*0xffd861c8*/ { *(v5 - 8) = 0; /*0xffd861b5*/ *v5++ = 0; /*0xffd861bc*/ --n8; /*0xffd861c5*/ } while ( n8 ); /*0xffd861c8*/ } sub_FFD8687F(this + 2263, v2); /*0xffd861ce*/ sub_FFD8CC6A(v3 + 4, 65529); /*0xffd861db*/ *(_DWORD *)(v3 + 16) = 0; /*0xffd861e7*/ sub_FFD7F9AF(64, (int)"ConfigureXhciPreMem () - End\n"); /*0xffd861ee*/ return 0; /*0xffd861f5*/ } // === Function at 0xffd8690c === int __fastcall sub_FFD8690C(int a1, int a2) { int v2; // ebp int n15_1; // ebx unsigned __int8 i_4; // cl unsigned __int8 i_1; // al unsigned __int64 v6; // rdi int v7; // ebx int v8; // ebp _DWORD *v9; // eax _DWORD *v10; // esi unsigned int v11; // ecx int result; // eax int v13; // [esp-8h] [ebp-34h] char v14; // [esp+11h] [ebp-1Bh] BYREF unsigned __int8 i; // [esp+12h] [ebp-1Ah] unsigned __int8 i_3; // [esp+13h] [ebp-19h] unsigned int n1342177280; // [esp+14h] [ebp-18h] BYREF int v18; // [esp+18h] [ebp-14h] int v19; // [esp+1Ch] [ebp-10h] int n15; // [esp+20h] [ebp-Ch] BYREF unsigned int i_2; // [esp+24h] [ebp-8h] BYREF unsigned int v22; // [esp+28h] [ebp-4h] BYREF v2 = a2; /*0xffd86913*/ v19 = a1; /*0xffd86915*/ v18 = a2; /*0xffd86920*/ sub_FFD7F9AF(64, (int)"xHCI: Usb2AfeProgramming Start\n"); sub_FFD8BE68(); /*0xffd86929*/ sub_FFD8BB3A(v13); /*0xffd8692e*/ sub_FFD8C909(&v22); /*0xffd86937*/ n15_1 = sub_FFD8CBBA(0, 31, 2); /*0xffd8694b*/ n15 = n15_1; /*0xffd86951*/ sub_FFD8ADCC(202, 6, 16427, 0, 0, 0, &n1342177280, &v14, 6); /*0xffd86970*/ n1342177280 |= 0x400000u; /*0xffd86975*/ sub_FFD8ADCC(202, 7, 16427, 0, 1u, 0, &n1342177280, &v14, 7); /*0xffd86999*/ sub_FFD8A1DE(n1342177280, v2, n15_1); /*0xffd869a9*/ sub_FFD8ADCC(202, 6, 16385, 0, 0, 0, &n1342177280, &v14, 6); /*0xffd869cc*/ n1342177280 |= 0x3000000u; /*0xffd869d8*/ sub_FFD8ADCC(202, 7, 16385, 0, 1u, 0, &n1342177280, &v14, 7); /*0xffd869f5*/ sub_FFD8A1DE(n1342177280, v2, n15_1); /*0xffd86a05*/ sub_FFD8ADCC(202, 6, 28672, 0, 0, 0, &n1342177280, &v14, 6); /*0xffd86a2a*/ n1342177280 = (unsigned __int16)n1342177280 | 0x50500000; /*0xffd86a41*/ sub_FFD8ADCC(202, 7, 28672, 0, 1u, 0, &n1342177280, &v14, 7); /*0xffd86a59*/ sub_FFD8A1DE(n1342177280, v2, n15_1); /*0xffd86a69*/ n1342177280 = 1342177280; /*0xffd86a71*/ sub_FFD8ADCC(202, 7, 28724, 0, 1u, 0, &n1342177280, &v14, 7); /*0xffd86a95*/ sub_FFD8A1DE(n1342177280, v2, n15_1); /*0xffd86aa5*/ n1342177280 = 175176950; /*0xffd86aad*/ sub_FFD8ADCC(202, 7, 28728, 0, 1u, 0, &n1342177280, &v14, 7); /*0xffd86ad3*/ sub_FFD8A1DE(n1342177280, v2, n15_1); /*0xffd86ae3*/ n1342177280 = 532398080; /*0xffd86aeb*/ sub_FFD8ADCC(202, 7, 28732, 0, 1u, 0, &n1342177280, &v14, 7); /*0xffd86b0f*/ sub_FFD8A1DE(n1342177280, v2, n15_1); /*0xffd86b1f*/ n1342177280 = 34432; /*0xffd86b27*/ sub_FFD8ADCC(202, 7, 32516, 0, 1u, 0, &n1342177280, &v14, 7); /*0xffd86b4d*/ sub_FFD8A1DE(n1342177280, v2, n15_1); /*0xffd86b5d*/ n1342177280 = 67251212; /*0xffd86b65*/ sub_FFD8ADCC(202, 7, 28712, 0, 1u, 0, &n1342177280, &v14, 7); /*0xffd86b8b*/ sub_FFD8A1DE(n1342177280, v2, n15_1); /*0xffd86b9b*/ n1342177280 = 184552192; /*0xffd86ba9*/ sub_FFD8ADCC(202, 7, 32515, 0, 1u, 0, &n1342177280, &v14, 7); /*0xffd86bc9*/ sub_FFD8A1DE(n1342177280, v2, n15_1); /*0xffd86bd9*/ i_4 = sub_FFD8C035(); /*0xffd86be6*/ i_1 = 1; /*0xffd86be8*/ i_3 = i_4; /*0xffd86bea*/ for ( i = 1; i_1 <= i_3; i = i_1 ) /*0xffd86bf4*/ { i_2 = i_1; /*0xffd86c07*/ v6 = (unsigned __int64)(i_1 | 0x40u) << 8; /*0xffd86c25*/ sub_FFD8ADCC(202, 6, v6, SHIDWORD(v6), 0, 0, &n1342177280, &v14, 6); /*0xffd86c2c*/ v7 = 2 * i; /*0xffd86c3d*/ n1342177280 = n1342177280 & 0xFFFF80FF /*0xffd86c87*/ | ((*(_BYTE *)(v19 + 16 * i - 3) & 7 | (8 * (*(_BYTE *)(v19 + 16 * i - 4) & 7 | (8 * (*(_BYTE *)(v19 + 16 * i - 1) & 1))))) << 8) | 0xFC000010; sub_FFD8ADCC(202, 7, v6, SHIDWORD(v6), 1u, 0, &n1342177280, &v14, 7); /*0xffd86c93*/ sub_FFD8A1DE(n1342177280, v18, n15); /*0xffd86ca9*/ v8 = (unsigned __int64)i_2 >> 24; /*0xffd86cb9*/ LODWORD(v6) = i_2 << 8; /*0xffd86cbd*/ HIDWORD(v6) = (i_2 << 8) | 0x4026; /*0xffd86cca*/ n1342177280 = 0; /*0xffd86cd8*/ sub_FFD8ADCC(202, 6, SHIDWORD(v6), v8, 0, 0, &n1342177280, &v14, 6); /*0xffd86ce2*/ n1342177280 ^= (n1342177280 ^ (*(unsigned __int8 *)(v19 + 8 * v7 - 2) << 23)) & 0x1800000; /*0xffd86d0b*/ sub_FFD8ADCC(202, 7, SHIDWORD(v6), v8, 1u, 0, &n1342177280, &v14, 7); /*0xffd86d22*/ n15_1 = n15; /*0xffd86d27*/ sub_FFD8A1DE(n1342177280, v18, n15); /*0xffd86d39*/ LODWORD(v6) = v6 | 0x4008; /*0xffd86d47*/ sub_FFD8ADCC(202, 6, v6, v8, 0, 0, &n1342177280, &v14, 6); /*0xffd86d61*/ n1342177280 = n1342177280 & 0xFFFFC17F | 0x1A80; /*0xffd86d7c*/ sub_FFD8ADCC(202, 7, v6, v8, 1u, 0, &n1342177280, &v14, 7); /*0xffd86d94*/ v2 = v18; /*0xffd86d99*/ sub_FFD8A1DE(n1342177280, v18, n15_1); /*0xffd86da8*/ i_1 = i + 1; /*0xffd86db4*/ } if ( sub_FFD8BE68() == 2 ) /*0xffd86dcc*/ { i_3 = sub_FFD89FDC(&i_2); /*0xffd86ddd*/ v9 = (_DWORD *)sub_FFD8A048(); /*0xffd86de1*/ v10 = v9; /*0xffd86de6*/ if ( v9 ) /*0xffd86dea*/ { v11 = i_2 + *v9; /*0xffd86df2*/ n15 = 15; /*0xffd86df8*/ sub_FFD8D51B(v11, &n15, 4); /*0xffd86e00*/ *v10 += 4; /*0xffd86e05*/ if ( i_3 == 1 ) /*0xffd86e0e*/ sub_FFD8A02F(n15_1); /*0xffd86e12*/ } } sub_FFD8A2C4(v2, n15_1); /*0xffd86e1b*/ result = *(_DWORD *)(v22 + 24) | 0x20000000; /*0xffd86e2a*/ *(_DWORD *)(v22 + 24) = result; /*0xffd86e2f*/ return result; /*0xffd86e24*/ } // === Function at 0xffd879ed === int __thiscall sub_FFD879ED(_DWORD *this) { unsigned __int8 i; // bl int v3; // ecx int v5; // [esp-4h] [ebp-20h] unsigned __int8 v6; // [esp+11h] [ebp-Bh] char v7; // [esp+12h] [ebp-Ah] BYREF char v8; // [esp+13h] [ebp-9h] BYREF _BYTE v9[2]; // [esp+14h] [ebp-8h] BYREF sub_FFD7F9AF(64, (int)"XhciUsb3Tune() Start\n"); /*0xffd879fd*/ for ( i = 0; i < (unsigned __int8)sub_FFD8C051(); ++i ) /*0xffd87a06*/ { if ( (*(_BYTE *)(this + 4 * i + 67) & 0x81) != 0 ) /*0xffd87a22*/ { sub_FFD8E3BE(); /*0xffd87a2c*/ sub_FFD8E062(v6, &v8, &v7); /*0xffd87a41*/ v3 = v5; /*0xffd87a4b*/ if ( v7 == 1 ) /*0xffd87a4c*/ { LOBYTE(v3) = v6; /*0xffd87a56*/ sub_FFD8EBC8(v3, v9); /*0xffd87a58*/ if ( (*(this + 4 * i + 67) & 1) != 0 ) /*0xffd87a6e*/ sub_FFD8C578(-4128769, (*(this + 4 * i + 67) & 0x7E) << 15); /*0xffd87a85*/ if ( (*(this + 4 * i + 67) & 0x80u) != 0 ) /*0xffd87a95*/ sub_FFD8C578(-4128769, (*(this + 4 * i + 67) & 0x3F00) << 8); /*0xffd87aae*/ sub_FFD8C578(-3, 0); /*0xffd87ac9*/ sub_FFD8C578(-1, 2); /*0xffd87ad6*/ } } } return sub_FFD7F9AF(64, (int)"XhciUsb3Tune() End\n"); /*0xffd87afb*/ } // === Function at 0xffd87b03 === int __thiscall sub_FFD87B03(int this) { int v2; // edi int v3; // ebx int v5; // ebp unsigned int n0x3E8; // esi unsigned int i; // ebp int n2; // esi int n35; // edi unsigned int v10; // [esp+10h] [ebp-4h] BYREF v2 = *(_DWORD *)(this + 3510); /*0xffd87b11*/ v3 = sub_FFD8CBBA(0, 20, 1); /*0xffd87b1d*/ if ( (unsigned __int16)sub_FFD8CCA5((unsigned __int16 *)v3) == 0xFFFF ) { sub_FFD7F9AF(64, (int)"xDCI: Pci device NOT found\n"); return -2147483634; /*0xffd87b3e*/ } else { v5 = sub_FFD8CBBA(0, 20, 0); /*0xffd87b63*/ sub_FFD8C578(-1, 63); /*0xffd87b65*/ sub_FFD8C5B5(); /*0xffd87b6a*/ if ( (*(_BYTE *)(this + 2683) & 1) != 0 ) { *(_DWORD *)(v5 + 16) = v2; /*0xffd87cfb*/ sub_FFD8CC4F(v5 + 4, 2); /*0xffd87cfe*/ *(_DWORD *)(v2 + 32984) &= 0xFFCFFFFF; /*0xffd87d11*/ sub_FFD8CC6A(v5 + 4, 65533); /*0xffd87d1e*/ *(_DWORD *)(v5 + 16) = 0; /*0xffd87d2b*/ sub_FFD8CC85(4); /*0xffd87d34*/ } else { sub_FFD7F9AF(64, (int)"xDCI: Device disabled\n"); *(_DWORD *)(v5 + 16) = v2; /*0xffd87b91*/ sub_FFD8CC4F(v5 + 4, 2); /*0xffd87b95*/ *(_DWORD *)(v2 + 32984) |= 0x200000u; /*0xffd87ba5*/ n0x3E8 = 0; /*0xffd87bb6*/ *(_DWORD *)(v2 + 32984) &= ~0x100000u; /*0xffd87bb8*/ while ( (*(_DWORD *)(v2 + 32988) & 0x20000000) == 0 && n0x3E8 < 0x3E8 ) /*0xffd87bc6*/ { sub_FFD7FA46(0x64u); /*0xffd87bcb*/ ++n0x3E8; /*0xffd87bd0*/ } *(_DWORD *)(v2 + 32984) = *(_DWORD *)(v2 + 32984) & 0xFFFFFFFC | 1; /*0xffd87bf4*/ sub_FFD8CC6A(v5 + 4, 65533); /*0xffd87bfa*/ *(_DWORD *)(v5 + 16) = 0; /*0xffd87c01*/ *(_DWORD *)(v3 + 16) = v2; /*0xffd87c0c*/ sub_FFD8CC4F(v3 + 4, 2); /*0xffd87c0f*/ *(_DWORD *)(v2 + 49424) |= 2u; /*0xffd87c23*/ *(_DWORD *)(v2 + 49664) |= 0x40u; /*0xffd87c32*/ *(_DWORD *)(v2 + 49856) |= 0x8000000u; /*0xffd87c46*/ sub_FFD8CC4F(v2 + 1112088, 3); /*0xffd87c4c*/ for ( i = 0; (sub_FFD8CCA5((unsigned __int16 *)(v2 + 1112080)) & 0xF00) == 0 && i < 0x3E8; ++i ) /*0xffd87c51*/ sub_FFD7FA46(0x64u); /*0xffd87c60*/ sub_FFD8CC6A(v3 + 4, 65533); /*0xffd87c80*/ *(_DWORD *)(v3 + 16) = 0; /*0xffd87c85*/ *(_DWORD *)(v3 + 132) |= 3u; /*0xffd87c95*/ n2 = sub_FFD8BE68(); /*0xffd87ca0*/ n35 = sub_FFD8BB3A(); /*0xffd87ca7*/ sub_FFD8C578(-1, 256); /*0xffd87cc4*/ sub_FFD8C909(&v10); /*0xffd87ccf*/ if ( n2 == 2 && n35 >= 35 ) /*0xffd87cdc*/ *(_DWORD *)(v10 + 1576) |= 0x1000000u; /*0xffd87ced*/ } return 0; /*0xffd87d3a*/ } } // === Function at 0xffd87d42 === int sub_FFD87D42() { int v0; // eax int v1; // eax _DWORD *v2; // edi int v4; // eax int v5; // esi int v6; // eax sub_FFD7F9AF(64, (int)"InstallPchSpi() Start\n"); /*0xffd87d4c*/ v0 = sub_FFD8CBBA(0, 31, 5); /*0xffd87d58*/ *(_DWORD *)(v0 + 16) = -33488896; /*0xffd87d60*/ *(_DWORD *)(v0 + 4) |= 2u; /*0xffd87d6d*/ v1 = sub_FFD8ADB0(104); /*0xffd87d73*/ v2 = (_DWORD *)v1; /*0xffd87d78*/ if ( !v1 ) /*0xffd87d7c*/ return -2147483639; /*0xffd87d7e*/ sub_FFD8F09A((_DWORD *)(v1 + 12)); /*0xffd87d88*/ *v2 = -2147483632; /*0xffd87d90*/ v2[1] = &unk_FFD97EBC; /*0xffd87d98*/ v2[2] = v2 + 5; /*0xffd87d9f*/ v4 = sub_FFD7F948(v2); /*0xffd87da2*/ v5 = v4; /*0xffd87da7*/ if ( v4 < 0 ) /*0xffd87dab*/ { sub_FFD7F9AF(0x80000000, (int)"\nASSERT_EFI_ERROR (Status = %r)\n", v4); /*0xffd87db8*/ v6 = sub_FFD7F97E(); /*0xffd87dc0*/ if ( v6 ) /*0xffd87dc7*/ (*(void (__cdecl **)(const char *, int, const char *))(v6 + 4))( /*0xffd87dd8*/ "e:\\hs\\PurleySktPkg\\SouthClusterLbg\\LibraryPrivate\\PeiPchInitLib\\PchSpi.c", 130, "!EFI_ERROR (Status)"); } sub_FFD7F9AF(64, (int)"SPI PPI Installed\n"); /*0xffd87de5*/ sub_FFD7F9AF(64, (int)"InstallPchSpi() End\n"); /*0xffd87df1*/ return v5; /*0xffd87dfb*/ } // === Function at 0xffd87dff === int __thiscall sub_FFD87DFF(_BYTE *this) { int result; // eax int v3; // esi int n128; // ecx _DWORD v5[4]; // [esp+8h] [ebp-10h] BYREF result = sub_FFD7F9AF(64, (int)"ConfigureLpcOnPolicy()\n"); /*0xffd87e0f*/ if ( (*(this + 3514) & 1) == 0 ) /*0xffd87e1d*/ { sub_FFD7F9AF(64, (int)"Disable EnhancePort8xhDecoding\n"); /*0xffd87e26*/ sub_FFD8D48A(v5, 16); /*0xffd87e33*/ result = sub_FFD8CA98(v5); /*0xffd87e3b*/ v3 = 0; /*0xffd87e40*/ while ( 1 ) /*0xffd87e42*/ { n128 = v5[v3]; /*0xffd87e42*/ if ( (_WORD)n128 == 128 && (n128 & 0x7FFF0000) == 0x100000 ) /*0xffd87e59*/ break; /*0xffd87e59*/ if ( (unsigned int)++v3 >= 4 ) /*0xffd87e5f*/ return result; /*0xffd87e5f*/ } *(_DWORD *)(sub_FFD8CBBA(0, 31, 0) + 4 * v3 + 132) = 0; /*0xffd87e83*/ return sub_FFD8C497(4, 0); /*0xffd87e8d*/ } return result; /*0xffd87e94*/ } // === Function at 0xffd87e99 === bool sub_FFD87E99() { int v0; // esi int n5120; // eax bool result; // al unsigned __int16 v3; // [esp+4h] [ebp-4h] BYREF sub_FFD8C76F(&v3); /*0xffd87ea1*/ v0 = v3; /*0xffd87ea6*/ result = 0; /*0xffd87ee2*/ if ( (sub_FFD8CD06(v3) & 0x8000u) != 0 ) /*0xffd87eb9*/ { n5120 = sub_FFD8CD06(v0 + 4) & 0x1C00; /*0xffd87ed0*/ if ( (_WORD)n5120 == 5120 || (_WORD)n5120 == 6144 ) /*0xffd87ee0*/ return 1; /*0xffd87eb9*/ } return result; /*0xffd87ee8*/ } // === Function at 0xffd87eed === int sub_FFD87EED() { int v0; // eax int v1; // ebx __int16 v2; // bp int v3; // eax int result; // eax char v5; // cl _DWORD *v6; // edi unsigned int v7; // ebx unsigned int v8; // ebx int v9; // eax int v10; // eax int v11; // esi int v12; // eax int v13; // [esp+14h] [ebp-8h] BYREF int v14; // [esp+18h] [ebp-4h] v0 = sub_FFD8EEB6(); /*0xffd87ef4*/ v1 = sub_FFD8CD6B(v0); /*0xffd87f00*/ sub_FFD7F9AF(64, (int)"(WDT) Readback = 0x%08x\n", v1); /*0xffd87f0a*/ if ( (v1 & 0x4000) != 0 ) /*0xffd87f18*/ { LOBYTE(v14) = 1; /*0xffd87f1c*/ v2 = (v1 & 0x3FF) + 1; /*0xffd87f27*/ } else { v14 = 0; /*0xffd87f2e*/ v2 = 0; /*0xffd87f32*/ } v3 = sub_FFD8AD54(); /*0xffd87f34*/ result = (*(int (__cdecl **)(int, int, int, int *))(*(_DWORD *)v3 + 52))(v3, 4, 28, &v13); /*0xffd87f45*/ if ( result >= 0 ) /*0xffd87f4d*/ { v5 = v14; /*0xffd87f5c*/ v6 = (_DWORD *)(v13 + 8); /*0xffd87f60*/ *(_DWORD *)(v13 + 8) = unk_FFD97F0C; /*0xffd87f63*/ *++v6 = unk_FFD97F10; /*0xffd87f64*/ *++v6 = unk_FFD97F14; /*0xffd87f65*/ v6[1] = unk_FFD97F18; /*0xffd87f66*/ *(_BYTE *)(v13 + 26) = v5; /*0xffd87f75*/ *(_WORD *)(v13 + 24) = v2; /*0xffd87f7c*/ if ( (v1 & 0x3000000) != 0 ) /*0xffd87f82*/ { sub_FFD7F9AF(0x80000000, (int)"(WDT) Expiration detected.\n", v1); /*0xffd87f8b*/ v7 = v1 & 0xFC3FFFFF | 0x3800000; /*0xffd87f99*/ } else { if ( (v1 & 0x400000) == 0 || sub_FFD87E99() ) /*0xffd87fa9*/ { sub_FFD7F9AF(64, (int)"(WDT) Status OK.\n", v1); /*0xffd87fcf*/ v8 = v1 & 0xFF7FFFFF; /*0xffd87fd7*/ } else { sub_FFD7F9AF(0x80000000, (int)"(WDT) Unexpected reset detected and ignored.\n"); /*0xffd87fb8*/ v8 = v1 & 0xFF3FFFFF; /*0xffd87fbf*/ } v7 = v8 | 0x3000000; /*0xffd87fdd*/ } v9 = sub_FFD8EEB6(); /*0xffd87fdf*/ sub_FFD8CD97(v9, v7); /*0xffd87fe8*/ sub_FFD7F948(&unk_FFD9816C); /*0xffd87ff2*/ v10 = sub_FFD7F948(&unk_FFD98144); /*0xffd87ffc*/ v11 = v10; /*0xffd88001*/ if ( v10 < 0 ) /*0xffd88005*/ { sub_FFD7F9AF(0x80000000, (int)"\nASSERT_EFI_ERROR (Status = %r)\n", v10); /*0xffd8800e*/ v12 = sub_FFD7F97E(); /*0xffd88016*/ if ( v12 ) /*0xffd8801d*/ (*(void (__cdecl **)(const char *, int, const char *))(v12 + 4))( /*0xffd8802e*/ "e:\\hs\\PurleySktPkg\\SouthClusterLbg\\LibraryPrivate\\PeiPchInitLib\\Wdt.c", 216, "!EFI_ERROR (Status)"); } return v11; /*0xffd88034*/ } return result; /*0xffd88036*/ } // === Function at 0xffd880d2 === int sub_FFD880D2() { int v0; // eax _DWORD *v1; // edi int v2; // eax int v3; // eax _DWORD *v4; // esi _DWORD *v5; // eax int v6; // eax int v7; // esi int v8; // eax int v10; // eax sub_FFD7F9AF(64, (int)"InstallPchReset() Start\n"); /*0xffd880de*/ v0 = sub_FFD8ADB0(40); /*0xffd880e8*/ v1 = (_DWORD *)v0; /*0xffd880ed*/ if ( !v0 ) /*0xffd880f1*/ return -2147483639; /*0xffd881e7*/ sub_FFD90233(v0 + 12); /*0xffd880fc*/ v1[5] = sub_FFD88046; /*0xffd88106*/ *v1 = -2147483632; /*0xffd8810c*/ v1[1] = &unk_FFD97FAC; /*0xffd88112*/ v1[2] = v1 + 5; /*0xffd88119*/ v2 = sub_FFD7F948(v1); /*0xffd8811c*/ if ( v2 < 0 ) /*0xffd88132*/ { sub_FFD7F9AF(0x80000000, (int)"\nASSERT_EFI_ERROR (Status = %r)\n", v2); /*0xffd8813b*/ v3 = sub_FFD7F97E(); /*0xffd88143*/ if ( v3 ) /*0xffd8814a*/ (*(void (__cdecl **)(const char *, int, const char *))(v3 + 4))( /*0xffd88153*/ "e:\\hs\\PurleySktPkg\\SouthClusterLbg\\LibraryPrivate\\PeiPchInitLib\\PchReset.c", 132, "!EFI_ERROR (Status)"); } v4 = (_DWORD *)sub_FFD8ADB0(12); /*0xffd88164*/ v5 = (_DWORD *)sub_FFD8ADB0(4); /*0xffd88166*/ if ( !v4 || !v5 ) /*0xffd88171*/ { v10 = sub_FFD7F97E(); /*0xffd881cd*/ if ( v10 ) /*0xffd881d4*/ (*(void (__cdecl **)(const char *, int, const char *))(v10 + 4))( /*0xffd881e1*/ "e:\\hs\\PurleySktPkg\\SouthClusterLbg\\LibraryPrivate\\PeiPchInitLib\\PchReset.c", 139, "((BOOLEAN)(0==1))"); return -2147483639; /*0xffd881e1*/ } *v5 = sub_FFD88081; /*0xffd88173*/ *v4 = -2147483632; /*0xffd8817b*/ v4[1] = &unk_FFD97F2C; /*0xffd88181*/ v4[2] = v5; /*0xffd88188*/ v6 = sub_FFD7F948(v4); /*0xffd8818b*/ v7 = v6; /*0xffd88190*/ if ( v6 < 0 ) /*0xffd88194*/ { sub_FFD7F9AF(0x80000000, (int)"\nASSERT_EFI_ERROR (Status = %r)\n", v6); /*0xffd8819d*/ v8 = sub_FFD7F97E(); /*0xffd881a5*/ if ( v8 ) /*0xffd881ac*/ (*(void (__cdecl **)(const char *, int, const char *))(v8 + 4))( /*0xffd881b5*/ "e:\\hs\\PurleySktPkg\\SouthClusterLbg\\LibraryPrivate\\PeiPchInitLib\\PchReset.c", 153, "!EFI_ERROR (Status)"); } sub_FFD7F9AF(64, (int)"InstallPchReset() End\n"); /*0xffd881c2*/ return v7; /*0xffd881ec*/ } // === Function at 0xffd8ad54 === int sub_FFD8AD54() { int v0; // esi int __return_address; // [esp+0h] [ebp-Ch] int v3; // [esp+6h] [ebp-6h] sub_FFD8D30B(__return_address); /*0xffd8ad5d*/ v0 = *(_DWORD *)(v3 - 4); /*0xffd8ad65*/ if ( !v0 ) /*0xffd8ad6a*/ sub_FFD7F9D9( /*0xffd8ad79*/ (int)"e:\\hs\\MdePkg\\Library\\PeiServicesTablePointerLibIdt\\PeiServicesTablePointer.c", 48, "PeiServices != ((void *) 0)"); return v0; /*0xffd8ad81*/ } // === Function at 0xffd8b940 === int __thiscall sub_FFD8B940(void *this) { int n256; // esi int n13; // edi int v3; // eax void *v4; // ecx int v5; // eax int result; // eax n256 = 256; /*0xffd8b947*/ n13 = 13; /*0xffd8b94e*/ do /*0xffd8b9e0*/ { v3 = sub_FFD8B14D(n256, this, -1, 0, 0); /*0xffd8b95f*/ if ( v3 < 0 ) /*0xffd8b969*/ { sub_FFD7F9AF(0x80000000, (int)"\nASSERT_EFI_ERROR (Status = %r)\n", v3); /*0xffd8b976*/ v5 = sub_FFD7F97E(); /*0xffd8b97e*/ if ( v5 ) /*0xffd8b985*/ (*(void (__cdecl **)(const char *, int, const char *))(v5 + 4))( /*0xffd8b992*/ "e:\\hs\\PurleySktPkg\\SouthClusterLbg\\Library\\PeiDxeSmmGpioLib\\GpioLib.c", 1584, "!EFI_ERROR (Status)"); } result = sub_FFD8B14D(n256, v4, -1, 0, 0); /*0xffd8b9a3*/ if ( result < 0 ) /*0xffd8b9ad*/ { sub_FFD7F9AF(0x80000000, (int)"\nASSERT_EFI_ERROR (Status = %r)\n", result); /*0xffd8b9ba*/ result = sub_FFD7F97E(); /*0xffd8b9c2*/ if ( result ) /*0xffd8b9c9*/ result = (*(int (__cdecl **)(const char *, int, const char *))(result + 4))( /*0xffd8b9d6*/ "e:\\hs\\PurleySktPkg\\SouthClusterLbg\\Library\\PeiDxeSmmGpioLib\\GpioLib.c", 1712, "!EFI_ERROR (Status)"); } ++n256; /*0xffd8b9dc*/ --n13; /*0xffd8b9dd*/ } while ( n13 ); /*0xffd8b9e0*/ return result; /*0xffd8b9e6*/ } // === Function at 0xffd7f6ec === void *__cdecl sub_FFD7F6EC(void *buf, unsigned int count, char value) { memset(buf, value, count); /*0xffd7f6f9*/ return buf; /*0xffd7f6ff*/ } // === Function at 0xffd70c === // === 0xffd70c === {"addr":"0xffd70c","code":null,"error":"Decompilation failed"} // === Function at 0xffd7f72c === char *__cdecl sub_FFD7F72C(char *dst, char *src, unsigned int count_1) { unsigned int count; // edx char *dst_1; // edi char *src_1; // esi count = count_1; /*0xffd7f736*/ if ( src < dst && &src[count_1 - 1] >= dst ) /*0xffd7f744*/ { src_1 = &src[count_1 - 1]; /*0xffd7f758*/ dst_1 = &dst[count_1 - 1]; /*0xffd7f75a*/ } else { count = count_1 & 3; /*0xffd7f748*/ qmemcpy(dst, src, 4 * (count_1 >> 2)); /*0xffd7f751*/ src_1 = &src[4 * (count_1 >> 2)]; /*0xffd7f751*/ dst_1 = &dst[4 * (count_1 >> 2)]; /*0xffd7f751*/ } qmemcpy(dst_1, src_1, count); /*0xffd7f761*/ return dst; /*0xffd7f768*/ } // === Function at 0xffd7f76c === int __cdecl sub_FFD7F76C(int a1, int a2, int a3, int a4) { do /*0xffd7f785*/ { *(_DWORD *)(a1 + 8 * a2 - 8) = a3; /*0xffd7f77d*/ *(_DWORD *)(a1 + 8 * a2-- - 4) = a4; /*0xffd7f781*/ } while ( a2 ); /*0xffd7f785*/ return a1; /*0xffd7f789*/ } // === Function at 0xffd7f78c === void *__cdecl sub_FFD7F78C(void *buf, unsigned int count, int value) { memset32(buf, value, count); /*0xffd7f799*/ return buf; /*0xffd7f79f*/ } // === Function at 0xffd7f948 === int __thiscall sub_FFD7F948(void *this) { int v2; // eax v2 = sub_FFD8AD54(); /*0xffd7f94b*/ return (*(int (__cdecl **)(int, void *))(*(_DWORD *)v2 + 24))(v2, this); /*0xffd7f959*/ } // === Function at 0xffd7f95b === int __fastcall sub_FFD7F95B(int a1, int a2, int a3, int a4) { int v6; // eax v6 = sub_FFD8AD54(); /*0xffd7f962*/ return (*(int (__cdecl **)(int, int, int, int, int))(*(_DWORD *)v6 + 32))(v6, a1, a2, a3, a4); /*0xffd7f97a*/ } // === Function at 0xffd7f9f7 === int __fastcall sub_FFD7F9F7(unsigned int a1) { unsigned int v1; // esi int n0x400000; // edi int v3; // ebx int result; // eax v1 = a1 >> 22; /*0xffd7fa04*/ n0x400000 = a1 & 0x3FFFFF; /*0xffd7fa07*/ do /*0xffd7fa3f*/ { v3 = n0x400000 + (sub_FFD8CD6B(1288) & 0xFFFFFF); /*0xffd7fa1c*/ n0x400000 = 0x400000; /*0xffd7fa1e*/ while ( ((v3 - sub_FFD8CD6B(1288)) & 0x800000) == 0 ) /*0xffd7fa38*/ _mm_pause(); /*0xffd7fa25*/ result = v1--; /*0xffd7fa3a*/ } while ( result ); /*0xffd7fa3f*/ return result; /*0xffd7fa41*/ } // === Function at 0xffd83452 === // === 0xffd83452 === {"addr":"0xffd83452","code":null,"error":"Decompilation failed"} // === Function at 0xffd840b0 === // === 0xffd840b0 === {"addr":"0xffd840b0","code":null,"error":"Decompilation failed"} // === Function at 0xffd84b0b === // === 0xffd84b0b === {"addr":"0xffd84b0b","code":null,"error":"Decompilation failed"} // === Function at 0xffd84f8b === // === 0xffd84f8b === {"addr":"0xffd84f8b","code":null,"error":"Decompilation failed"} // === Function at 0xffd858c3 === // === 0xffd858c3 === {"addr":"0xffd858c3","code":null,"error":"Decompilation failed"} // === Function at 0xffd85bc2 === // === 0xffd85bc2 === {"addr":"0xffd85bc2","code":null,"error":"Decompilation failed"} // === Function at 0xffd86203 === // === 0xffd86203 === {"addr":"0xffd86203","code":null,"error":"Decompilation failed"} // === Function at 0xffd86e4d === int __usercall sub_FFD86E37@(int a1@, int a2@, int a3, int a4, int a5, int a6, int a7, ...) { int v7; // ebx unsigned int n8_3; // esi unsigned int v9; // edi unsigned __int8 *v10; // ebx unsigned __int8 n8; // al int n8_4; // ebp int v13; // eax unsigned int n8_1; // ecx _DWORD *v15; // edx int v16; // eax unsigned int v17; // edi unsigned __int8 *v18; // ebp unsigned __int8 n8_2; // al int n8_5; // ebx int v21; // eax _DWORD *v22; // ecx int result; // eax unsigned int retaddr; // [esp+5Ch] [ebp+0h] int v27; // [esp+74h] [ebp+18h] BYREF va_list va; // [esp+74h] [ebp+18h] int v29; // [esp+78h] [ebp+1Ch] int v30; // [esp+7Ch] [ebp+20h] int v31; // [esp+80h] [ebp+24h] int v32; // [esp+84h] [ebp+28h] int v33; // [esp+88h] [ebp+2Ch] int v34; // [esp+8Ch] [ebp+30h] int v35; // [esp+90h] [ebp+34h] va_list va1; // [esp+94h] [ebp+38h] BYREF va_start(va1, a7); va_start(va, a7); v27 = va_arg(va1, _DWORD); /*0xffd86e37*/ v29 = va_arg(va1, _DWORD); /*0xffd86e37*/ v30 = va_arg(va1, _DWORD); /*0xffd86e37*/ v31 = va_arg(va1, _DWORD); /*0xffd86e37*/ v32 = va_arg(va1, _DWORD); /*0xffd86e37*/ v33 = va_arg(va1, _DWORD); /*0xffd86e37*/ v34 = va_arg(va1, _DWORD); /*0xffd86e37*/ v35 = va_arg(va1, _DWORD); /*0xffd86e37*/ v7 = a2; /*0xffd86e3e*/ sub_FFD8D4C8(va1, retaddr); /*0xffd86e4f*/ sub_FFD8D4C8((int *)va, retaddr); /*0xffd86e5b*/ sub_FFD8BF54(); /*0xffd86e60*/ n8_3 = 0; /*0xffd86e65*/ v9 = 0; /*0xffd86e67*/ if ( (unsigned __int8)sub_FFD8C051() ) /*0xffd86e69*/ { v10 = (unsigned __int8 *)(v7 + 264); /*0xffd86e72*/ do /*0xffd86ebd*/ { n8 = *v10; /*0xffd86e78*/ if ( *v10 != 8 ) /*0xffd86e7c*/ { n8_4 = n8; /*0xffd86e7e*/ if ( n8 >= 8u ) /*0xffd86e84*/ { v13 = sub_FFD7F97E(); /*0xffd86e86*/ if ( v13 ) /*0xffd86e8d*/ (*(void (**)(void))(v13 + 4))(); /*0xffd86e9e*/ } *((int *)va + n8_4) |= 1 << v9; /*0xffd86eab*/ } ++v9; /*0xffd86eaf*/ v10 += 16; /*0xffd86eb0*/ } while ( v9 < (unsigned __int8)sub_FFD8C051() ); /*0xffd86ebd*/ v7 = a2; /*0xffd86ebf*/ } n8_1 = 0; /*0xffd86ec7*/ v15 = (_DWORD *)(a1 + 208); /*0xffd86ec9*/ do /*0xffd86edc*/ { v16 = *((int *)va + n8_1++); /*0xffd86ecf*/ *v15++ = v16; /*0xffd86ed4*/ } while ( n8_1 < 8 ); /*0xffd86edc*/ v17 = 0; /*0xffd86ede*/ v18 = (unsigned __int8 *)(v7 + 8); /*0xffd86ee0*/ while ( (unsigned int)(sub_FFD8BE68() - 1) <= 1 && v17 < retaddr ) /*0xffd86efb*/ { n8_2 = *v18; /*0xffd86efd*/ if ( *v18 != 8 ) /*0xffd86f02*/ { n8_5 = n8_2; /*0xffd86f04*/ if ( n8_2 >= 8u ) /*0xffd86f0a*/ { v21 = sub_FFD7F97E(); /*0xffd86f0c*/ if ( v21 ) /*0xffd86f13*/ (*(void (**)(void))(v21 + 4))(); /*0xffd86f24*/ } va1[n8_5] = (void *)((unsigned int)va1[n8_5] | (1 << v17)); /*0xffd86f31*/ } ++v17; /*0xffd86f35*/ v18 += 16; /*0xffd86f36*/ } v22 = (_DWORD *)(a1 + 176); /*0xffd86f3f*/ do /*0xffd86f52*/ { result = (int)va1[n8_3++]; /*0xffd86f45*/ *v22++ = result; /*0xffd86f4a*/ } while ( n8_3 < 8 ); /*0xffd86f52*/ return result; /*0xffd86f54*/ } // === Function at 0xffd8733e === // === 0xffd8733e === {"addr":"0xffd8733e","code":null,"error":"Decompilation failed"} // === Function at 0xffd87dff === int __thiscall sub_FFD87DFF(_BYTE *this) { int result; // eax int v3; // esi int n128; // ecx _DWORD v5[4]; // [esp+8h] [ebp-10h] BYREF result = sub_FFD7F9AF(64, (int)"ConfigureLpcOnPolicy()\n"); /*0xffd87e0f*/ if ( (*(this + 3514) & 1) == 0 ) /*0xffd87e1d*/ { sub_FFD7F9AF(64, (int)"Disable EnhancePort8xhDecoding\n"); /*0xffd87e26*/ sub_FFD8D48A(v5, 16); /*0xffd87e33*/ result = sub_FFD8CA98(v5); /*0xffd87e3b*/ v3 = 0; /*0xffd87e40*/ while ( 1 ) /*0xffd87e42*/ { n128 = v5[v3]; /*0xffd87e42*/ if ( (_WORD)n128 == 128 && (n128 & 0x7FFF0000) == 0x100000 ) /*0xffd87e59*/ break; /*0xffd87e59*/ if ( (unsigned int)++v3 >= 4 ) /*0xffd87e5f*/ return result; /*0xffd87e5f*/ } *(_DWORD *)(sub_FFD8CBBA(0, 31, 0) + 4 * v3 + 132) = 0; /*0xffd87e83*/ return sub_FFD8C497(4, 0); /*0xffd87e8d*/ } return result; /*0xffd87e94*/ }