/*
*NvmeInt13.c - Decompiled source for NvmeInt13.efi
*
*Copyright (c) HR650X BIOS Decompilation Project
*/
#include "NvmeInt13.h"
EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
__int64 v3; // rcx
::ImageHandle = (__int64)ImageHandle; /*0x356*/
if ( !ImageHandle ) /*0x363*/
AssertBreak( /*0x376*/
(__int64)"e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c",
51,
(__int64)"gImageHandle != ((void *) 0)");
::SystemTable = (__int64)SystemTable; /*0x37b*/
if ( !SystemTable ) /*0x385*/
AssertBreak( /*0x398*/
(__int64)"e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c",
57,
(__int64)"gST != ((void *) 0)");
BootServices = (__int64)SystemTable->BootServices; /*0x3a1*/
if ( !BootServices ) /*0x3ab*/
AssertBreak( /*0x3be*/
(__int64)"e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c",
63,
(__int64)"gBS != ((void *) 0)");
RuntimeServices = (__int64)SystemTable->RuntimeServices; /*0x3c7*/
if ( !RuntimeServices ) /*0x3d1*/
AssertBreak( /*0x3e4*/
(__int64)"e:\\hs\\MdePkg\\Library\\UefiRuntimeServicesTableLib\\UefiRuntimeServicesTableLib.c",
47,
(__int64)"gRT != ((void *) 0)");
GetHobList(); /*0x3e9*/
return NvmeInt13DriverEntry(v3, SystemTable); /*0x3f6*/
}
__int64 NvmeInt13DriverEntry(__int64 StoredImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
__int64 result; // rax __int64 CtlrHwData; // rdx __int64 Int13MapSize; // rcx _DWORD SetupGuid[4]; // [rsp+30h] [rbp-D0h] BYREF __int64 n814; // [rsp+40h] [rbp-C0h] BYREF __int64 NotifyHandle; // [rsp+48h] [rbp-B8h] BYREF _BYTE SetupData[816]; // [rsp+50h] [rbp-B0h] BYREF __int64 StoredImageHandle_1; // [rsp+390h] [rbp+290h] BYREF __int64 NvmeCtlrHandle; // [rsp+3A0h] [rbp+2A0h] BYREF __int64 CtlrHwData_1; // [rsp+3A8h] [rbp+2A8h] BYREF StoredImageHandle_1 = StoredImageHandle; /*0x401*/
NotifyHandle = 0; /*0x424*/
NvmeCtlrHandle = 0; /*0x431*/
n814 = 814; /*0x43e*/
SetupGuid[0] = -326642109; /*0x447*/
SetupGuid[1] = 1270213540; /*0x44f*/
SetupGuid[2] = 1044374945; /*0x457*/
SetupGuid[3] = -1458720202; /*0x45f*/
result = (*(__int64 ( **)(void *, _QWORD, __int64 *))(BootServices + 320))( /*0x467*/
&unk_1050,
0,
&gNvmeInt13Protocol);
if ( result >= 0 )
{
result = (*(__int64 ( **)(__int64, _QWORD, __int64, __int64 *, __int64 *))gNvmeInt13Protocol)( /*0x499*/
1,
0,
5,
&CtlrHwData_1,
&NvmeCtlrHandle);
if ( result >= 0 )
{
CtlrHwData = CtlrHwData_1; /*0x4a4*/
Int13MapSize = *(unsigned __int16 *)(CtlrHwData_1 + 1775); /*0x4c0*/
*(_QWORD *)(Int13MapSize + CtlrHwData_1) = 0x42000000B2000001LL; /*0x4cb*/
*(_WORD *)(Int13MapSize + CtlrHwData + 8) = 0; /*0x4d0*/
*(_BYTE *)(Int13MapSize + CtlrHwData + 10) = 0; /*0x4db*/
gNvmeInt13BinData = (*(__int64 ( **)(__int64, _QWORD, __int64))(gNvmeInt13Protocol + 64))( /*0x506*/
CtlrHwData_1,
(unsigned __int16)NvmeCtlrHandle,
16);
DebugPrint(0x1000u, "gNvmeInt13BinData : %lX\n", gNvmeInt13BinData);
((void ( *)(const __int16 *, _DWORD *, __int64 *, __int64 *, _BYTE *))SystemTable->RuntimeServices->GetVariable)( /*0x53f*/
L"Setup",
SetupGuid,
&StoredImageHandle_1,
&n814,
SetupData);
if ( SetupData[149] ) /*0x546*/
{
gNvmeInstallDeviceFn = (__int64)NvmeInt13InstallDevice; /*0x556*/
return (*(__int64 ( **)(__int64 *, void *, _QWORD, __int64 *))(BootServices + 128))( /*0x577*/
&NotifyHandle,
&unk_1060,
0,
&gNvmeInstallDeviceFn);
}
else
{
return 0; /*0x548*/
}
}
}
return result; /*0x585*/
}
unsigned __int64 NvmeInt13InstallDevice(__int64 *a1)
{
unsigned __int8 SlotIdx; // dl unsigned __int8 FreeIdx; // bl __int64 Status; // rax unsigned __int16 IdeDevId; // cx unsigned __int64 gNvmeInt13BinData; // r8 char *StrPtr; // rdx unsigned __int64 NameBase; // r10 _BYTE *NameDst; // r9 unsigned __int8 n0x1F; // cl char n32; // al unsigned __int8 DrvFlags; // dl bool IsHdd; // zf int n0x10000; // ecx __int64 InstallStatus; // rax __int64 BinDataCopy; // r8 __int64 SlotOff; // rdx __int64 CtlrData; // rcx __int64 Int13EntryBase; // r9 __int64 NotifyStatus; // rax _BYTE DevPathBuf[2]; // [rsp+20h] [rbp-50h] BYREF int DevIdHigh; // [rsp+22h] [rbp-4Eh]
int DevHead; // [rsp+26h] [rbp-4Ah]
int DevSector; // [rsp+2Ah] [rbp-46h]
__int16 n2049; // [rsp+2Eh] [rbp-42h]
__int16 Int13EntryAddr; // [rsp+30h] [rbp-40h]
__int16 Int13EntrySeg; // [rsp+32h] [rbp-3Eh]
__int16 n2; // [rsp+34h] [rbp-3Ch]
__int16 n1280; // [rsp+36h] [rbp-3Ah]
__int16 SlotDriveMap; // [rsp+38h] [rbp-38h]
__int16 DataSegShift; // [rsp+3Ah] [rbp-36h]
__int16 NameSegLow; // [rsp+3Ch] [rbp-34h]
__int16 NameSegHigh; // [rsp+3Eh] [rbp-32h]
int DriveParamPacked; // [rsp+40h] [rbp-30h]
__int64 DeviceSpecific; // [rsp+5Dh] [rbp-13h]
char ControllerIdx; // [rsp+98h] [rbp+28h] BYREF ControllerIdx = -1; /*0x5bc*/
DebugPrint(0x40u, "Installing NVMe INT13 device %lx\n", (_DWORD)a1); /*0x5bf*/
for ( SlotIdx = 0; SlotIdx < 0x20u; ++SlotIdx ) /*0x5c8*/
{
if ( *(_BYTE *)(55LL *SlotIdx + gNvmeInt13BinData) == *((_BYTE *)a1 + 8) ) /*0x5dc*/
{
AssertBreak((__int64)"e:\\hs\\AmiModulePkg\\Nvme\\NvmeInt13\\NvmeInt13.c", 346, (__int64)"((BOOLEAN)(0==1))"); /*0x916*/
return 0x8000000000000002uLL; /*0x91b*/
}
}
for ( FreeIdx = 0; FreeIdx < 0x20u; ++FreeIdx ) /*0x5e9*/
{
if ( !*(_BYTE *)(55LL *FreeIdx + gNvmeInt13BinData) ) /*0x5f2*/
break; /*0x5f7*/
}
if ( FreeIdx >= 0x20u ) /*0x60a*/
{
AssertBreak((__int64)"e:\\hs\\AmiModulePkg\\Nvme\\NvmeInt13\\NvmeInt13.c", 359, (__int64)"Index<32"); /*0x61b*/
if ( FreeIdx == 32 ) /*0x623*/
return 0x8000000000000009uLL; /*0x625*/
}
Status = (*(__int64 ( **)(_QWORD, _QWORD, _QWORD, _QWORD))(gNvmeInt13Protocol + 40))(0, 0, 0, 0); /*0x645*/
if ( Status < 0 ) /*0x651*/
{
DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0x660*/
AssertBreak((__int64)"e:\\hs\\AmiModulePkg\\Nvme\\NvmeInt13\\NvmeInt13.c", 366, (__int64)"!EFI_ERROR (Status)"); /*0x674*/
}
if ( FreeIdx >= 0x20u ) /*0x67c*/
AssertBreak((__int64)"e:\\hs\\AmiModulePkg\\Nvme\\NvmeInt13\\NvmeInt13.c", 250, (__int64)"DevIndex < 32"); /*0x68d*/
if ( gNvmeInt13Protocol ) /*0x69a*/
{
(*(void ( **)(_BYTE *, __int64))(BootServices + 360))(DevPathBuf, 69); /*0x6b2*/
IdeDevId = *((_WORD *)a1 + 9); /*0x6b8*/
gNvmeInt13BinData = gNvmeInt13BinData; /*0x6bc*/
StrPtr = *(char **)((char *)a1 + 20); /*0x6c5*/
DevIdHigh = HIBYTE(IdeDevId); /*0x6cc*/
n2049 = 2049; /*0x6db*/
DevHead = (unsigned __int8)IdeDevId >> 3; /*0x6e4*/
DevSector = IdeDevId & 7; /*0x6ec*/
n1280 = 1280; /*0x6ef*/
NameBase = 55LL *FreeIdx + gNvmeInt13BinData + 23; /*0x6fa*/
NameDst = (_BYTE *)NameBase; /*0x6fd*/
while ( *StrPtr == 32 ) /*0x708*/
++StrPtr; /*0x702*/
n0x1F = 0; /*0x70a*/
do /*0x729*/
{
n32 = *StrPtr; /*0x70c*/
if ( !*StrPtr ) /*0x70c*/
break; /*0x710*/
if ( n32 != 32 || *(StrPtr - 1) != 32 ) /*0x719*/
{
*NameDst++ = n32; /*0x71b*/
++n0x1F; /*0x721*/
}
++StrPtr; /*0x723*/
}
while ( n0x1F < 0x1Fu ); /*0x729*/
*NameDst = 0; /*0x72b*/
DrvFlags = *((_BYTE *)a1 + 8); /*0x734*/
NameSegLow = NameBase; /*0x741*/
NameSegHigh = (NameBase >> 4) & 0xF000; /*0x746*/
Int13EntrySeg = ((gNvmeInt13BinData + 1760) >> 4) & 0xF000; /*0x758*/
IsHdd = *((_BYTE *)a1 + 28) == 1; /*0x764*/
Int13EntryAddr = gNvmeInt13BinData + 1760; /*0x768*/
if ( IsHdd ) /*0x76c*/
{
DrvFlags |= 0x80u; /*0x780*/
n2 = 2; /*0x783*/
n0x10000 = 0x10000; /*0x787*/
DataSegShift = gNvmeInt13BinData >> 4; /*0x793*/
SlotDriveMap = *(_WORD *)(gNvmeInt13BinData + 1773) + 4 *FreeIdx; /*0x7a6*/
}
else
{
n0x10000 = 0; /*0x773*/
n2 = 255; /*0x775*/
}
DriveParamPacked = ((n0x10000 + DrvFlags) << 8) + 1; /*0x7b4*/
DeviceSpecific = *(__int64 *)((char *)a1 + 10); /*0x7bb*/
}
else
{
DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", 0x800000000000000EuLL); /*0x7d5*/
AssertBreak((__int64)"e:\\hs\\AmiModulePkg\\Nvme\\NvmeInt13\\NvmeInt13.c", 369, (__int64)"!EFI_ERROR (Status)"); /*0x7e9*/
}
InstallStatus = (*(__int64 ( **)(__int64, _BYTE *, char *))(gNvmeInt13Protocol + 16))( /*0x800*/
gNvmeInt13Protocol,
DevPathBuf,
&ControllerIdx);
if ( InstallStatus < 0 ) /*0x806*/
{
DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", InstallStatus); /*0x815*/
AssertBreak((__int64)"e:\\hs\\AmiModulePkg\\Nvme\\NvmeInt13\\NvmeInt13.c", 374, (__int64)"!EFI_ERROR (Status)"); /*0x829*/
}
BinDataCopy = gNvmeInt13BinData; /*0x831*/
SlotOff = 55LL *FreeIdx; /*0x83c*/
*(_BYTE *)(SlotOff + gNvmeInt13BinData) = *((_BYTE *)a1 + 8); /*0x840*/
*(_BYTE *)(SlotOff + BinDataCopy + 1) = ControllerIdx; /*0x847*/
*(_BYTE *)(SlotOff + BinDataCopy + 2) = HIBYTE(DriveParamPacked); /*0x852*/
CtlrData = *a1; /*0x857*/
*(_BYTE *)(SlotOff + BinDataCopy + 3) = *(_BYTE *)(*a1 + 14); /*0x85d*/
*(_BYTE *)(SlotOff + BinDataCopy + 4) = *(_BYTE *)(CtlrData + 10); /*0x865*/
*(_WORD *)(SlotOff + BinDataCopy + 5) = *(_WORD *)(CtlrData + 16); /*0x86e*/
*(_WORD *)(SlotOff + BinDataCopy + 7) = *(_WORD *)(CtlrData + 12); /*0x878*/
*(_BYTE *)(SlotOff + BinDataCopy + 9) = *(_BYTE *)(CtlrData + 15); /*0x881*/
*(_BYTE *)(SlotOff + BinDataCopy + 10) = *(_BYTE *)(CtlrData + 11); /*0x889*/
*(_WORD *)(SlotOff + BinDataCopy + 11) = *(_WORD *)CtlrData; /*0x891*/
*(_QWORD *)(SlotOff + BinDataCopy + 14) = *(_QWORD *)(CtlrData + 2); /*0x89d*/
*(_BYTE *)(SlotOff + BinDataCopy + 22) = 0; /*0x8a2*/
Int13EntryBase = BinDataCopy + *(unsigned __int16 *)(BinDataCopy + 1777) + 2LL *FreeIdx; /*0x8b5*/
*(_BYTE *)(FreeIdx + Int13EntryBase) = *((_BYTE *)a1 + 8); /*0x8bc*/
*(_WORD *)(FreeIdx + Int13EntryBase + 1) = *((_WORD *)a1 + 9); /*0x8c4*/
NotifyStatus = (*(__int64 ( **)(_QWORD, _QWORD))(gNvmeInt13Protocol + 48))(0, 0); /*0x8d1*/
if ( NotifyStatus < 0 ) /*0x8d7*/
{
DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", NotifyStatus); /*0x8e6*/
AssertBreak((__int64)"e:\\hs\\AmiModulePkg\\Nvme\\NvmeInt13\\NvmeInt13.c", 403, (__int64)"!EFI_ERROR (Status)"); /*0x8fa*/
}
return 0; /*0x932*/
}
__int64 GetDebugOutputProtocol()
{
__int64 gDebugOutputProtocol; // rax unsigned __int64 AllocPages; // rbx __int64 LocateStatus; // rax __int64 DbgProto; // rcx gDebugOutputProtocol = gDebugOutputProtocol; /*0x946*/
if ( !gDebugOutputProtocol ) /*0x952*/
{
AllocPages = (*(__int64 ( **)(__int64))(BootServices + 24))(31); /*0x96b*/
(*(void ( **)(unsigned __int64))(BootServices + 32))(AllocPages); /*0x96e*/
if ( AllocPages <= 0x10 ) /*0x975*/
{
LocateStatus = (*(__int64 ( **)(void *, _QWORD, __int64 *))(BootServices + 320))( /*0x992*/
&unk_1040,
0,
&gDebugOutputProtocol);
DbgProto = gDebugOutputProtocol; /*0x998*/
if ( LocateStatus < 0 ) /*0x9a2*/
DbgProto = 0; /*0x9a2*/
gDebugOutputProtocol = DbgProto; /*0x9a6*/
return DbgProto; /*0x9ad*/
}
else
{
return 0; /*0x977*/
}
}
return gDebugOutputProtocol; /*0x9b5*/
}
void DebugPrint(UINTN ErrorLevel, const CHAR8 *Format, ...)
{
__int64 DebugOutputProtocol; // rax __int64 DbgLevelFilter; // r8 void ( **DbgProtoPtr)(UINTN, const CHAR8 *, __int64 *); // r9 unsigned __int8 CmosIndex; // al char CmosData; // al char CmosData_1; // cl va_list va; // [rsp+40h] [rbp+18h] BYREF va_start(va, Format);
DebugOutputProtocol = GetDebugOutputProtocol(); /*0x9d3*/
DbgLevelFilter = 0; /*0x9d8*/
DbgProtoPtr = (void ( **)(UINTN, const CHAR8 *, __int64 *))DebugOutputProtocol; /*0x9db*/
if ( DebugOutputProtocol ) /*0x9e1*/
{
CmosIndex = __inbyte(0x70u); /*0x9e7*/
__outbyte(0x70u, CmosIndex & 0x80 | 0x4B); /*0x9ec*/
CmosData = __inbyte(0x71u); /*0x9f1*/
CmosData_1 = CmosData; /*0x9f2*/
if ( (unsigned __int8)CmosData > 3u ) /*0x9f8*/
{
CmosData_1 = gDebugByte; /*0x9fa*/
if ( !gDebugByte ) /*0xa02*/
CmosData_1 = MEMORY[0xFDAF0490] & 2 | 1; /*0xa0e*/
}
if ( (unsigned __int8)(CmosData_1 - 1) <= 0xFDu ) /*0xa16*/
{
DbgLevelFilter = 2147483718LL; /*0xa1f*/
if ( CmosData_1 == 1 ) /*0xa25*/
DbgLevelFilter = 2147483652LL; /*0xa25*/
}
if ( (DbgLevelFilter & ErrorLevel) != 0 ) /*0xa2c*/
(*DbgProtoPtr)(ErrorLevel, Format, (__int64 *)va); /*0xa3b*/
}
}
__int64 AssertBreak(__int64 a1, __int64 a2, __int64 a3)
{
__int64 DbgProto; // rax DbgProto = GetDebugOutputProtocol(); /*0xa5c*/
if ( DbgProto ) /*0xa64*/
return (*(__int64 ( **)(__int64, __int64, __int64))(DbgProto + 8))(a1, a2, a3); /*0xa6f*/
return DbgProto; /*0xa7c*/
}
void *GetHobList()
{
__int64 UnusedArg; // rcx void *gHobList; // rax __int64 SystemTable; // rdi unsigned __int64 HobIndex; // rbx __int64 HobEntryOff; // rsi gHobList = gHobList; /*0xa93*/
if ( !gHobList ) /*0xa9d*/
{
SystemTable = SystemTable; /*0xaa3*/
HobIndex = 0; /*0xaaa*/
gHobList = 0; /*0xaac*/
if ( *(_QWORD *)(SystemTable + 104) ) /*0xab3*/
{
HobEntryOff = 0; /*0xab9*/
while ( !IsHobGuidMatch(UnusedArg, (const UINT64 *)(HobEntryOff + *(_QWORD *)(SystemTable + 112))) ) /*0xac9*/
{
++HobIndex; /*0xacb*/
HobEntryOff += 24; /*0xace*/
if ( HobIndex >= *(_QWORD *)(SystemTable + 104) ) /*0xad6*/
goto LABEL_6; /*0xad6*/
}
gHobList = *(void **)(*(_QWORD *)(SystemTable + 112) + 24 *HobIndex + 16); /*0xb4c*/
gHobList = gHobList; /*0xb51*/
}
else
{
LABEL_6:
DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", 0x800000000000000EuLL); /*0xad8*/
AssertBreak((__int64)"e:\\hs\\MdePkg\\Library\\DxeHobLib\\HobLib.c", 54, (__int64)"!EFI_ERROR (Status)"); /*0xb06*/
gHobList = gHobList; /*0xb0b*/
}
if ( !gHobList ) /*0xb15*/
{
AssertBreak((__int64)"e:\\hs\\MdePkg\\Library\\DxeHobLib\\HobLib.c", 55, (__int64)"mHobList != ((void *) 0)"); /*0xb28*/
return gHobList; /*0xb2d*/
}
}
return gHobList; /*0xb3e*/
}
bool IsHobGuidMatch(__int64 UnusedArg, const UINT64 *Buffer)
{
UINT64 GuidLow; // rdi UINT64 BufGuidLow; // rbx UINT64 GuidHigh; // rbp UINT64 Unaligned64; // rax GuidLow = ReadUnaligned64(&Buffer_); /*0xb82*/
BufGuidLow = ReadUnaligned64(Buffer); /*0xb91*/
GuidHigh = ReadUnaligned64(&Buffer__0); /*0xb9d*/
Unaligned64 = ReadUnaligned64(Buffer + 1); /*0xba0*/
return GuidLow == BufGuidLow && GuidHigh == Unaligned64; /*0xbc4*/
}
UINT64 ReadUnaligned64(const UINT64 *Buffer)
{
if ( !Buffer ) /*0xbd8*/
AssertBreak((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", 192, (__int64)"Buffer != ((void *) 0)"); /*0xbed*/
return *Buffer; /*0xbf5*/
}