/** @file
CsmBlockIo.h -- Header for CsmBlockIo
Copyright (c) HR650X BIOS Decompilation Project
**/
#ifndef __CSMBLOCKIO_H__
#define __CSMBLOCKIO_H__
#include "../uefi_headers/Uefi.h"
//
// Function Prototypes
//
EFI_STATUS
EFIAPI
CsmAssert(
VOID
);
EFI_STATUS
EFIAPI
CsmDebugPrint(
VOID
);
EFI_STATUS
EFIAPI
CsmCheckDebugLevel(
VOID
);
EFI_STATUS
EFIAPI
CsmMatchGuid(
VOID
);
EFI_STATUS
EFIAPI
CsmReverseQword(
VOID
);
EFI_STATUS
EFIAPI
CsmZeroMem(
VOID
);
EFI_STATUS
EFIAPI
CsmGetCurrentAllocation(
VOID
);
EFI_STATUS
EFIAPI
CsmLegacyRegionAllocate(
VOID
);
EFI_STATUS
EFIAPI
CsmBbsTableCopy(
VOID
);
EFI_STATUS
EFIAPI
CsmBbsTableAllocate(
VOID
);
EFI_STATUS
EFIAPI
Int13SaveState(
VOID
);
EFI_STATUS
EFIAPI
Int13RestoreState(
VOID
);
EFI_STATUS
EFIAPI
Int13GetStatus(
VOID
);
EFI_STATUS
EFIAPI
Int13ErrorStub(
VOID
);
EFI_STATUS
EFIAPI
Int13ReadWriteChs(
VOID
);
EFI_STATUS
EFIAPI
Int13ExtendedRead(
VOID
);
EFI_STATUS
EFIAPI
Int13ChsReadWrite(
VOID
);
EFI_STATUS
EFIAPI
Int13ExtendedWrite(
VOID
);
EFI_STATUS
EFIAPI
DiskInfoIdentify(
VOID
);
EFI_STATUS
EFIAPI
CsmDiskInfoHandler(
VOID
);
EFI_STATUS
EFIAPI
CsmBlockIoEntryPoint(
VOID
);
EFI_STATUS
EFIAPI
CsmBlockIoInitDevice(
VOID
);
EFI_STATUS
EFIAPI
CsmBlockIoCloseDevice(
VOID
);
EFI_STATUS
EFIAPI
CsmFindInIplDt(
VOID
);
EFI_STATUS
EFIAPI
CsmInitInt13Handler(
VOID
);
EFI_STATUS
EFIAPI
Int13IdentifyDevice(
VOID
);
EFI_STATUS
EFIAPI
Int13GetDriveParameters(
VOID
);
EFI_STATUS
EFIAPI
Int13ChsGeometry(
VOID
);
EFI_STATUS
EFIAPI
BbsDeviceTypeBuilder(
VOID
);
EFI_STATUS
EFIAPI
Data(
VOID
);
EFI_STATUS
EFIAPI
GUID definitions (.rdata section)(
VOID
);
EFI_STATUS
EFIAPI
gEfiLegacyInterruptProtocolGuid = EFI_LEGACY_INTERRUPT_PROTOCOL_GUID; // 0x3270(
VOID
);
EFI_STATUS
EFIAPI
EFI_GUID gCsmBlockIoInternalGuid = EFI_CSM_BLOCK_IO_INTERNAL_GUID; // 0x3260(
VOID
);
EFI_STATUS
EFIAPI
EFI_GUID gEfiLegacyRegionProtocolGuid = EFI_LEGACY_REGION_PROTOCOL_GUID; // 0x3290(
VOID
);
EFI_STATUS
EFIAPI
EFI_GUID gEfiLegacyBiosPlatformProtocolGuid = EFI_LEGACY_BIOS_PLATFORM_PROTOCOL_GUID; // 0x3300(
VOID
);
EFI_STATUS
EFIAPI
EFI_GUID gEfiLegacyMbrProtocolGuid = EFI_LEGACY_MBR_PROTOCOL_GUID; // 0x32D0(
VOID
);
EFI_STATUS
EFIAPI
GUIDs installed by this driver(
VOID
);
EFI_STATUS
EFIAPI
gEfiDiskInfoProtocolGuid = EFI_DISK_INFO_PROTOCOL_GUID; // 0x32B0(
VOID
);
EFI_STATUS
EFIAPI
EFI_GUID gEfiLegacyBiosProtocolGuid = EFI_LEGACY_BIOS_PROTOCOL_GUID; // 0x32C0(
VOID
);
EFI_STATUS
EFIAPI
list pointer (cached, from DxeHobLib)(
VOID
);
EFI_STATUS
EFIAPI
*mHobList = NULL; // 0x33B8(
VOID
);
EFI_STATUS
EFIAPI
output driver handle (from sub_275C)(
VOID
);
EFI_STATUS
EFIAPI
*mDebugOutputHandle = NULL; // 0x33B0(
VOID
);
EFI_STATUS
EFIAPI
mCmosScratchRegister = 0; // 0x33D8(
VOID
);
EFI_STATUS
EFIAPI
handler state save/restore(
VOID
);
EFI_STATUS
EFIAPI
mInt13SavedEflags = 0; // 0x33DC(
VOID
);
EFI_STATUS
EFIAPI
buffer for INT13 data transfer(
VOID
);
EFI_STATUS
EFIAPI
*mInt13TransferBuffer = NULL; // 0x33E0(
VOID
);
EFI_STATUS
EFIAPI
for INT13 data transfer(
VOID
);
EFI_STATUS
EFIAPI
mInt13TransferSegment = 0; // 0x33E8(
VOID
);
EFI_STATUS
EFIAPI
//(
VOID
);
EFI_STATUS
EFIAPI
a CRC/checksum and function pointers for internal dispatch(
VOID
);
EFI_STATUS
EFIAPI
struct {(
VOID
);
EFI_STATUS
EFIAPI
the legacy BIOS extension protocol interface(
VOID
);
EFI_STATUS
EFIAPI
BBS type value(
VOID
);
EFI_STATUS
EFIAPI
mDefaultBbsType = 0x4FF7F; // 0x3378(
VOID
);
EFI_STATUS
EFIAPI
handle allocation counter(
VOID
);
EFI_STATUS
EFIAPI
mIplDtHandleCounter = 0; // 0x3380(
VOID
);
EFI_STATUS
EFIAPI
count for the IPLDT allocation (sub_FA8)(
VOID
);
EFI_STATUS
EFIAPI
mIplDtRefCount = 0; // 0x3388(
VOID
);
EFI_STATUS
EFIAPI
table pointer (off_3330 = &mDispatchTable)(
VOID
);
EFI_STATUS
EFIAPI
pointer (off_3360 = &mLegacyBiosExtTable)(
VOID
);
EFI_STATUS
EFIAPI
Helpers(
VOID
);
EFI_STATUS
EFIAPI
-- Debug assert helper(
VOID
);
EFI_STATUS
EFIAPI
gDebugOutput->DebugAssert(FileName, LineNumber, Description)(
VOID
);
EFI_STATUS
EFIAPI
EFIAPI(
VOID
);
EFI_STATUS
EFIAPI
-- Debug print helper (log with format)(
VOID
);
EFI_STATUS
EFIAPI
-- Get debug output protocol handle(
VOID
);
EFI_STATUS
EFIAPI
the EFI_DEBUG_OUTPUT_PROTOCOL (at 0x3240) from the HOB list(
VOID
);
EFI_STATUS
EFIAPI
*(
VOID
);
EFI_STATUS
EFIAPI
debug protocol from HOB(
VOID
);
EFI_STATUS
EFIAPI
(EFI_ERROR (gBS->LocateProtocol ((
VOID
);
EFI_STATUS
EFIAPI
NULL(
VOID
);
EFI_STATUS
EFIAPI
-- Check CMOS scratch register for debug level(
VOID
);
EFI_STATUS
EFIAPI
CMOS offset 0x4B, checks debug enable bit(
VOID
);
EFI_STATUS
EFIAPI
CsmCheckDebugLevel ((
VOID
);
EFI_STATUS
EFIAPI
-- Get HOB list pointer (DxeHobLib)(
VOID
);
EFI_STATUS
EFIAPI
-- Compare GUID at HOB entry with target guid(
VOID
);
EFI_STATUS
EFIAPI
CsmMatchGuid ((
VOID
);
EFI_STATUS
EFIAPI
V2 = CsmReverseQword ((UINT64 *)TargetGuid);(
VOID
);
EFI_STATUS
EFIAPI
V2 = CsmReverseQword ((UINT64 *)((UINT8 *)TargetGuid + 8));(
VOID
);
EFI_STATUS
EFIAPI
-- Reverse 8 bytes for GUID comparison(
VOID
);
EFI_STATUS
EFIAPI
CsmReverseQword ((
VOID
);
EFI_STATUS
EFIAPI
-- ZeroMemory(
VOID
);
EFI_STATUS
EFIAPI
CsmZeroMem ((
VOID
);
EFI_STATUS
EFIAPI
-- Memory copy (overlap-safe)(
VOID
);
EFI_STATUS
EFIAPI
overlapping buffers(
VOID
);
EFI_STATUS
EFIAPI
= FALSE;(
VOID
);
EFI_STATUS
EFIAPI
copy (8-byte aligned)(
VOID
);
EFI_STATUS
EFIAPI
= (UINTN)S & 7;(
VOID
);
EFI_STATUS
EFIAPI
-- Get current allocation position from legacy region(
VOID
);
EFI_STATUS
EFIAPI
a header-terminated chain of blocks starting at the(
VOID
);
EFI_STATUS
EFIAPI
region memory buffer. Each block has 4-byte header:(
VOID
);
EFI_STATUS
EFIAPI
= type (0xFF = end, 0x00 = unused)(
VOID
);
EFI_STATUS
EFIAPI
= 0x7F marker(
VOID
);
EFI_STATUS
EFIAPI
the total payload size allocated so far (skip 4-byte header).(
VOID
);
EFI_STATUS
EFIAPI
CsmGetCurrentAllocation ((
VOID
);
EFI_STATUS
EFIAPI
for end-of-table or unused entry marker(
VOID
);
EFI_STATUS
EFIAPI
(Ptr[0] == 0x7F && Ptr[1] == 0xFF) {(
VOID
);
/// return total + 4 (skip header)
EFI_STATUS
EFIAPI
marker found(
VOID
);
EFI_STATUS
EFIAPI
Total + 4;(
VOID
);
EFI_STATUS
EFIAPI
-- Allocate boot services data pool(
VOID
);
EFI_STATUS
EFIAPI
for gBS->AllocatePool (EfiBootServicesData, Size, &Buffer)(
VOID
);
EFI_STATUS
EFIAPI
CsmLegacyRegionAllocate ((
VOID
);
EFI_STATUS
EFIAPI
-- Allocate and copy a BBS type table to boot services data pool(
VOID
);
EFI_STATUS
EFIAPI
CsmBbsTableCopy ((
VOID
);
EFI_STATUS
EFIAPI
-- Legacy region allocation wrapper(
VOID
);
EFI_STATUS
EFIAPI
pBbsType is provided, allocate and copy the BBS type table.(
VOID
);
EFI_STATUS
EFIAPI
NULL, free the allocation.(
VOID
);
EFI_STATUS
EFIAPI
CsmBbsTableAllocate ((
VOID
);
EFI_STATUS
EFIAPI
Subsystem: State Save/Restore(
VOID
);
EFI_STATUS
EFIAPI
-- Save current interrupt state for a device(
VOID
);
EFI_STATUS
EFIAPI
global INT13 eflags into the per-device saved-flags array(
VOID
);
EFI_STATUS
EFIAPI
replaces it with the device's current flags value.(
VOID
);
EFI_STATUS
EFIAPI
saved-flags array is indexed by the device number stored at(
VOID
);
EFI_STATUS
EFIAPI
Int13SaveState ((
VOID
);
EFI_STATUS
EFIAPI
current global eflags into the per-device slot(
VOID
);
EFI_STATUS
EFIAPI
= Private->Int13SavedFlags[FlagsIndex];(
VOID
);
EFI_STATUS
EFIAPI
with device's current flags(
VOID
);
EFI_STATUS
EFIAPI
-- Restore previous interrupt state for a device(
VOID
);
EFI_STATUS
EFIAPI
the global INT13 eflags value from the per-device saved array.(
VOID
);
EFI_STATUS
EFIAPI
Int13RestoreState ((
VOID
);
EFI_STATUS
EFIAPI
saved eflags from the per-device slot(
VOID
);
EFI_STATUS
EFIAPI
Handler Functions(
VOID
);
EFI_STATUS
EFIAPI
-- INT13h disk I/O status check (function 0x01)(
VOID
);
EFI_STATUS
EFIAPI
Int13GetStatus ((
VOID
);
EFI_STATUS
EFIAPI
context+0x89(
VOID
);
EFI_STATUS
EFIAPI
-- INT13h error handler (stub)(
VOID
);
EFI_STATUS
EFIAPI
Int13ErrorStub ((
VOID
);
EFI_STATUS
EFIAPI
-- placeholder for Int13Error function pointer(
VOID
);
EFI_STATUS
EFIAPI
-- INT13h Read Sectors (CHS mode, function 0x02)(
VOID
);
EFI_STATUS
EFIAPI
when device has CHS geometry (original IDE/ATA)(
VOID
);
EFI_STATUS
EFIAPI
Int13ReadWriteChs ((
VOID
);
EFI_STATUS
EFIAPI
INT13 CHS packet(
VOID
);
EFI_STATUS
EFIAPI
read(
VOID
);
/// re-detect geometry
EFI_STATUS
EFIAPI
changed(
VOID
);
EFI_STATUS
EFIAPI
data from transfer buffer(
VOID
);
EFI_STATUS
EFIAPI
(mCommand == 0x02) // read(
VOID
);
EFI_STATUS
EFIAPI
-- INT13h Extended Read (function 0x42)(
VOID
);
EFI_STATUS
EFIAPI
LBA mode with extended INT13 support (EDD-1.1+)(
VOID
);
EFI_STATUS
EFIAPI
Int13ExtendedRead ((
VOID
);
EFI_STATUS
EFIAPI
extended INT13 packet(
VOID
);
EFI_STATUS
EFIAPI
copy data into transfer buffer, then issue INT13(
VOID
);
EFI_STATUS
EFIAPI
(Command == 0x03) { // write(
VOID
);
EFI_STATUS
EFIAPI
-- INT13h CHS read/write (traditional CHS, function 0x02/0x03)(
VOID
);
EFI_STATUS
EFIAPI
Int13ChsReadWrite ((
VOID
);
EFI_STATUS
EFIAPI
LBA to CHS(
VOID
);
EFI_STATUS
EFIAPI
= Private->Sectors + 1;(
VOID
);
EFI_STATUS
EFIAPI
loop (up to 3 attempts)(
VOID
);
EFI_STATUS
EFIAPI
= 3;(
VOID
);
EFI_STATUS
EFIAPI
-- INT13h Extended Write (function 0x43), Verify (0x44)(
VOID
);
EFI_STATUS
EFIAPI
Int13ExtendedWrite ((
VOID
);
EFI_STATUS
EFIAPI
data to transfer buffer first for write(
VOID
);
EFI_STATUS
EFIAPI
((VOID *)mInt13TransferBuffer, (VOID *)CurrentBuf, TransferBytes);(
VOID
);
EFI_STATUS
EFIAPI
Info Protocol: Inquiry and Identify(
VOID
);
EFI_STATUS
EFIAPI
-- EFI_DISK_INFO.inquiry(
VOID
);
EFI_STATUS
EFIAPI
EFAPI(
VOID
);
EFI_STATUS
EFIAPI
-- EFI_DISK_INFO.Identify(
VOID
);
EFI_STATUS
EFIAPI
BIOS Protocol / INT13 Dispatch(
VOID
);
EFI_STATUS
EFIAPI
-- Legacy Disk Info handler (first entry point)(
VOID
);
EFI_STATUS
EFIAPI
the EFI_DISK_INFO_PROTOCOL interface for identifying disk types(
VOID
);
EFI_STATUS
EFIAPI
locating the appropriate legacy block I/O region.(
VOID
);
EFI_STATUS
EFIAPI
CsmDiskInfoHandler ((
VOID
);
EFI_STATUS
EFIAPI
the Legacy Interrupt protocol(
VOID
);
EFI_STATUS
EFIAPI
= gBS->LocateProtocol ((
VOID
);
EFI_STATUS
EFIAPI
the Block I/O protocol on this handle(
VOID
);
EFI_STATUS
EFIAPI
= gBS->OpenProtocol ((
VOID
);
EFI_STATUS
EFIAPI
if Legacy BIOS Platform protocol is available(
VOID
);
EFI_STATUS
EFIAPI
for Legacy MBR(
VOID
);
EFI_STATUS
EFIAPI
MBR and check for boot signature(
VOID
);
EFI_STATUS
EFIAPI
= Private->LegacyRegion;(
VOID
);
EFI_STATUS
EFIAPI
60, // bytes(
VOID
);
EFI_STATUS
EFIAPI
&DeviceType(
VOID
);
EFI_STATUS
EFIAPI
device type(
VOID
);
EFI_STATUS
EFIAPI
(DeviceType <= 0x0D) {(
VOID
);
EFI_STATUS
EFIAPI
BBS device type from IPLDT table(
VOID
);
EFI_STATUS
EFIAPI
transfer buffer base(
VOID
);
EFI_STATUS
EFIAPI
transfer buffer flags(
VOID
);
EFI_STATUS
EFIAPI
bits 8-10(
VOID
);
EFI_STATUS
EFIAPI
INT13 handler entry(
VOID
);
EFI_STATUS
EFIAPI
BBS device table(
VOID
);
EFI_STATUS
EFIAPI
active BBS entries(
VOID
);
EFI_STATUS
EFIAPI
(Index = 0; Index < 256; Index++) {(
VOID
);
EFI_STATUS
EFIAPI
INT13 to discover drives(
VOID
);
EFI_STATUS
EFIAPI
= Private->BbsTable->Execute ((
VOID
);
EFI_STATUS
EFIAPI
post-INT13 BBS entries(
VOID
);
EFI_STATUS
EFIAPI
BBS entry table in legacy region(
VOID
);
EFI_STATUS
EFIAPI
(mIplDtHandleCounter == 0) {(
VOID
);
EFI_STATUS
EFIAPI
protocols and return error(
VOID
);
EFI_STATUS
EFIAPI
Point(
VOID
);
EFI_STATUS
EFIAPI
global protocol pointers(
VOID
);
EFI_STATUS
EFIAPI
= ImageHandle;(
VOID
);
EFI_STATUS
EFIAPI
HOB list(
VOID
);
EFI_STATUS
EFIAPI
();(
VOID
);
EFI_STATUS
EFIAPI
three protocol interfaces on the image handle:(
VOID
);
EFI_STATUS
EFIAPI
gBS->InstallMultipleProtocolInterfaces ((
VOID
);
EFI_STATUS
EFIAPI
- dispatch table with sub_4C8, sub_6D4, sub_FA8(
VOID
);
EFI_STATUS
EFIAPI
- legacy bios ext table(
VOID
);
EFI_STATUS
EFIAPI
interface (protocol-only notification)(
VOID
);
EFI_STATUS
EFIAPI
-- Main INT13 handler / CSM Block I/O initialization per device(
VOID
);
EFI_STATUS
EFIAPI
for each disk device that needs CSM legacy support.(
VOID
);
EFI_STATUS
EFIAPI
- Private context (CSM_BLOCK_IO_PRIVATE *)(
VOID
);
EFI_STATUS
EFIAPI
- EFI_HANDLE for the block device(
VOID
);
EFI_STATUS
EFIAPI
CsmBlockIoInitDevice ((
VOID
);
EFI_STATUS
EFIAPI
state(
VOID
);
EFI_STATUS
EFIAPI
(BbsBitmap, sizeof(BbsBitmap));(
VOID
);
EFI_STATUS
EFIAPI
Legacy Interrupt protocol(
VOID
);
EFI_STATUS
EFIAPI
Legacy 8259 protocol(
VOID
);
EFI_STATUS
EFIAPI
Block I/O protocol on this handle(
VOID
);
EFI_STATUS
EFIAPI
Legacy Bios Platform protocol (optional)(
VOID
);
EFI_STATUS
EFIAPI
for Legacy MBR too(
VOID
);
/// read device type via Legacy Region
EFI_STATUS
EFIAPI
MBR is available(
VOID
);
EFI_STATUS
EFIAPI
transfer buffer base from legacy region (offset 4)(
VOID
);
EFI_STATUS
EFIAPI
transfer buffer flags (mask 0x700)(
VOID
);
EFI_STATUS
EFIAPI
BIOS INT13 handler entry(
VOID
);
EFI_STATUS
EFIAPI
= Private->BbsTable->Init ((
VOID
);
EFI_STATUS
EFIAPI
BBS table(
VOID
);
EFI_STATUS
EFIAPI
= Private->BbsTable->GetTable ((
VOID
);
EFI_STATUS
EFIAPI
current BBS entries(
VOID
);
EFI_STATUS
EFIAPI
-- Close / Cleanup INT13 for a device(
VOID
);
EFI_STATUS
EFIAPI
when a device handle is removed or when shutting down CSM(
VOID
);
EFI_STATUS
EFIAPI
I/O legacy support.(
VOID
);
EFI_STATUS
EFIAPI
CsmBlockIoCloseDevice ((
VOID
);
EFI_STATUS
EFIAPI
reference count on IPLDT allocation(
VOID
);
EFI_STATUS
EFIAPI
(--mIplDtRefCount == 0) {(
VOID
);
EFI_STATUS
EFIAPI
each device handle(
VOID
);
EFI_STATUS
EFIAPI
(Index = 0; Index < DeviceCount; Index++) {(
VOID
);
EFI_STATUS
EFIAPI
Disk Info protocol on the child handle(
VOID
);
EFI_STATUS
EFIAPI
Legacy BIOS Platform is available, transfer to it(
VOID
);
EFI_STATUS
EFIAPI
(PlatformAvailable) {(
VOID
);
EFI_STATUS
EFIAPI
the INT13 handler's memory(
VOID
);
EFI_STATUS
EFIAPI
the protocol interface on the child handle(
VOID
);
EFI_STATUS
EFIAPI
= gBS->InstallProtocolInterface ((
VOID
);
EFI_STATUS
EFIAPI
legacy region flags(
VOID
);
EFI_STATUS
EFIAPI
Platform is not available, close BlockIo(
VOID
);
EFI_STATUS
EFIAPI
(!PlatformAvailable) {(
VOID
);
EFI_STATUS
EFIAPI
cleanup(
VOID
);
EFI_STATUS
EFIAPI
-- Find device in IPLDT (Legacy Device Table)(
VOID
);
EFI_STATUS
EFIAPI
the IPLDT for a matching bus:device tuple and sets(
VOID
);
EFI_STATUS
EFIAPI
device index.(
VOID
);
EFI_STATUS
EFIAPI
CsmFindInIplDt ((
VOID
);
EFI_STATUS
EFIAPI
number(
VOID
);
EFI_STATUS
EFIAPI
}(
VOID
);
EFI_STATUS
EFIAPI
-- INT13 handler initialization(
VOID
);
EFI_STATUS
EFIAPI
to set up INT13 handler function table for a device.(
VOID
);
EFI_STATUS
EFIAPI
CsmInitInt13Handler ((
VOID
);
EFI_STATUS
EFIAPI
the media descriptor pointer and INT13 saved state array(
VOID
);
EFI_STATUS
EFIAPI
signature based on system table revision(
VOID
);
EFI_STATUS
EFIAPI
(gST->Hdr.Revision < 0x2001F) {(
VOID
);
EFI_STATUS
EFIAPI
and set up drive parameters(
VOID
);
EFI_STATUS
EFIAPI
(!Int13IdentifyDevice (Private, (UINT8 *)&Private->DeviceInfo)) {(
VOID
);
/// use extended INT13
EFI_STATUS
EFIAPI
device(
VOID
);
EFI_STATUS
EFIAPI
support 512-byte sectors(
VOID
);
EFI_STATUS
EFIAPI
(Private->BlockSize != 512) {(
VOID
);
EFI_STATUS
EFIAPI
up INT13 handler function table(
VOID
);
/// use LBA handlers
EFI_STATUS
EFIAPI
INT13 device(
VOID
);
EFI_STATUS
EFIAPI
-- Identify device parameters via INT13(
VOID
);
EFI_STATUS
EFIAPI
INT13 function 0x13 to get drive parameters(
VOID
);
EFI_STATUS
EFIAPI
Int13IdentifyDevice ((
VOID
);
EFI_STATUS
EFIAPI
*(UINT16 *)&DeviceInfo[28] = (UINT16)((
VOID
);
EFI_STATUS
EFIAPI
return TRUE;(
VOID
);
EFI_STATUS
EFIAPI
*(UINT16 *)&DeviceInfo[28] = *(UINT16 *)&DeviceInfo[11]; // Cylinders(
VOID
);
EFI_STATUS
EFIAPI
if (DeviceInfo[27]) {(
VOID
);
EFI_STATUS
EFIAPI
-- Get extended drive parameters (INT13 function 0x48)(
VOID
);
EFI_STATUS
EFIAPI
EDD-3.0 compatible devices, retrieves full geometry.(
VOID
);
EFI_STATUS
EFIAPI
Int13GetDriveParameters ((
VOID
);
EFI_STATUS
EFIAPI
packet size (41h)(
VOID
);
EFI_STATUS
EFIAPI
DriveParams[1] = 8;(
VOID
);
EFI_STATUS
EFIAPI
size low(
VOID
);
EFI_STATUS
EFIAPI
DriveParams[6] = DriveParams[1] & 8; // LBA(
VOID
);
EFI_STATUS
EFIAPI
DriveParams[3] = DriveParams[1] & 1; // extended INT13(
VOID
);
EFI_STATUS
EFIAPI
CHS geometry from INT13 function(
VOID
);
EFI_STATUS
EFIAPI
-- Get CHS geometry from INT13 (function 0x08 or ATA identify)(
VOID
);
EFI_STATUS
EFIAPI
Int13ChsGeometry ((
VOID
);
EFI_STATUS
EFIAPI
CMOS parameter table for geometry decode(
VOID
);
EFI_STATUS
EFIAPI
up INT13 function 0x08 parameter block(
VOID
);
EFI_STATUS
EFIAPI
= 'O'; // 79(
VOID
);
EFI_STATUS
EFIAPI
*(UINT16 *)(mInt13TransferSegment2 + 32) = 74;(
VOID
);
EFI_STATUS
EFIAPI
-- read geometry from transfer buffer(
VOID
);
EFI_STATUS
EFIAPI
DriveParams[27] = DriveParams[44]; // Sectors(
VOID
);
EFI_STATUS
EFIAPI
CHS from function 0x08 response(
VOID
);
EFI_STATUS
EFIAPI
(FunctionCode != 10) {(
VOID
);
EFI_STATUS
EFIAPI
total sectors(
VOID
);
EFI_STATUS
EFIAPI
per sector(
VOID
);
EFI_STATUS
EFIAPI
total sectors from CHS(
VOID
);
EFI_STATUS
EFIAPI
-- Build BBS device type ID(
VOID
);
EFI_STATUS
EFIAPI
device path media type string and generates BBS device type ID(
VOID
);
EFI_STATUS
EFIAPI
the IPLDT / BBS table.(
VOID
);
EFI_STATUS
EFIAPI
+2 from device path(
VOID
);
EFI_STATUS
EFIAPI
type for unrecognized devices(
VOID
);
EFI_STATUS
EFIAPI
device path node type(
VOID
);
EFI_STATUS
EFIAPI
(*(UINT8 *)((UINTN)DevicePath + 2) != 0x30) { // MESSAGING_DEVICE_PATH(
VOID
);
EFI_STATUS
EFIAPI
too small(
VOID
);
EFI_STATUS
EFIAPI
media type(
VOID
);
EFI_STATUS
EFIAPI
media type strings(
VOID
);
EFI_STATUS
EFIAPI
if (AsciiStrnCmp ((CHAR8 *)MediaType, MEDIA_ATAPI, 5) == 0) {(
VOID
);
EFI_STATUS
EFIAPI
master(
VOID
);
EFI_STATUS
EFIAPI
(same as ATAPI)(
VOID
);
EFI_STATUS
EFIAPI
if (AsciiStrnCmp ((CHAR8 *)MediaType, MEDIA_SCSI, 4) != 0) {(
VOID
);
EFI_STATUS
EFIAPI
if (AsciiStrnCmp ((CHAR8 *)MediaType, MEDIA_USB, 3) != 0) {(
VOID
);
EFI_STATUS
EFIAPI
if (AsciiStrnCmp ((CHAR8 *)MediaType, MEDIA_1394, 4) != 0) {(
VOID
);
EFI_STATUS
EFIAPI
if (AsciiStrnCmp ((CHAR8 *)MediaType, MEDIA_FIBRE, 5) != 0) {(
VOID
);
EFI_STATUS
EFIAPI
*(UINT64 *)&TypeFields[4] = *(UINT64 *)((UINTN)DevicePath + 88);(
VOID
);
EFI_STATUS
EFIAPI
TypeFields[0] = *(UINT8 *)((UINTN)DevicePath + 96);(
VOID
);
EFI_STATUS
EFIAPI
*(UINT32 *)&TypeFields[0] = *(UINT32 *)((UINTN)DevicePath + 88);(
VOID
);
EFI_STATUS
EFIAPI
GUID-like type(
VOID
);
#endif /* __CSMBLOCKIO_H__ */