12#define BIOS_WRITE_PROTECTED 0x03
13#define BIOS_SECTOR_NOT_FOUND 0x04
14#define BIOS_RESET_FAILED 0x05
15#define BIOS_DISK_CHANGED 0x06
16#define BIOS_DRIVE_DOES_NOT_EXIST 0x07
17#define BIOS_DMA_ERROR 0x08
18#define BIOS_DATA_BOUNDRY_ERROR 0x09
19#define BIOS_BAD_SECTOR 0x0a
20#define BIOS_BAD_TRACK 0x0b
21#define BIOS_MEADIA_TYPE_NOT_FOUND 0x0c
22#define BIOS_INVALED_FORMAT 0x0d
23#define BIOS_ECC_ERROR 0x10
24#define BIOS_ECC_CORRECTED_ERROR 0x11
25#define BIOS_HARD_DRIVE_FAILURE 0x20
26#define BIOS_SEEK_FAILED 0x40
27#define BIOS_DRIVE_TIMEOUT 0x80
28#define BIOS_DRIVE_NOT_READY 0xaa
29#define BIOS_UNDEFINED_ERROR 0xbb
30#define BIOS_WRITE_FAULT 0xcc
31#define BIOS_SENSE_FAILED 0xff
42#define BIOS_DISK_CHECK_BUFFER_SECTOR_COUNT 4
47 IN THUNK_CONTEXT *ThunkContext,
52 IA32_REGISTER_SET Regs;
55 ZeroMem (&Regs,
sizeof (IA32_REGISTER_SET));
58 Regs.H.DL = DriveNumber;
62 DEBUG ((DEBUG_INFO,
"OLB: Failed to reset BIOS disk %u, error 0x%X\n", DriveNumber, Regs.H.AL));
65 Regs.H.DL = DriveNumber;
68 DEBUG ((DEBUG_INFO,
"OLB: Failed to reset BIOS disk %u, error 0x%X\n", DriveNumber, Regs.H.AH));
69 return EFI_DEVICE_ERROR;
80 IN THUNK_CONTEXT *ThunkContext,
86 IA32_REGISTER_SET Regs;
88 ZeroMem (&Regs,
sizeof (IA32_REGISTER_SET));
92 Regs.H.DL = DriveNumber;
95 if ((CarryFlag != 0) || (Regs.X.BX != 0xaa55)) {
96 return EFI_UNSUPPORTED;
105 IN THUNK_CONTEXT *ThunkContext,
108 IN UINT8 DriveNumber,
115 IA32_REGISTER_SET Regs;
117 ZeroMem (&Regs,
sizeof (IA32_REGISTER_SET));
119 DeviceAddressPacket->PacketSizeInBytes =
sizeof (*DeviceAddressPacket);
120 DeviceAddressPacket->Zero = 0;
121 DeviceAddressPacket->NumberOfBlocks = NumSectors;
122 DeviceAddressPacket->Zero2 = 0;
124 DeviceAddressPacket->Lba = Lba;
127 Regs.H.DL = DriveNumber;
132 if (CarryFlag != 0) {
133 return EFI_DEVICE_ERROR;
141 IN THUNK_CONTEXT *ThunkContext,
143 IN EFI_HANDLE DiskHandle,
144 OUT UINT8 *DriveAddress
150 EFI_PHYSICAL_ADDRESS DeviceAddressPacketAddress;
153 UINTN BiosBufferPages;
156 UINTN DiskBufferSize;
164 if (EFI_ERROR (Status)) {
169 DiskBuffer = AllocatePool (DiskBufferSize);
170 if (DiskBuffer == NULL) {
171 return EFI_OUT_OF_RESOURCES;
180 if (EFI_ERROR (Status)) {
181 FreePool (DiskBuffer);
185 gBS->CalculateCrc32 (
190 DEBUG ((DEBUG_INFO,
"OLB: EFI disk CRC32: 0x%X\n", DiskCrc32));
195 DeviceAddressPacketAddress = (SIZE_1MB - 1);
197 Status =
gBS->AllocatePages (
201 &DeviceAddressPacketAddress
203 if (EFI_ERROR (Status)) {
204 DEBUG ((DEBUG_INFO,
"OLB: Failure allocating low memory packet for BIOS disk read - %r\n", Status));
205 FreePool (DiskBuffer);
210 BiosBuffer = (UINT8 *)(UINTN)DeviceAddressPacketAddress + 0x200;
217 for (DriveAddr = 0x80; DriveAddr < 0x88; DriveAddr++) {
218 DEBUG ((DEBUG_INFO,
"OLB: Reading BIOS drive 0x%X\n", DriveAddr));
223 Status =
BiosDiskReset (ThunkContext, Legacy8259, DriveAddr);
224 if (EFI_ERROR (Status)) {
229 if (EFI_ERROR (Status)) {
245 if (EFI_ERROR (Status)) {
252 gBS->CalculateCrc32 (
257 DEBUG ((DEBUG_INFO,
"OLB: BIOS disk CRC32: 0x%X\n", BiosCrc32));
259 if (BiosCrc32 == DiskCrc32) {
260 DEBUG ((DEBUG_INFO,
"OLB: Matched BIOS disk address 0x%X\n", DriveAddr));
263 *DriveAddress = DriveAddr;
268 FreePool (DiskBuffer);
270 DeviceAddressPacketAddress,
274 return MatchedDisk ? EFI_SUCCESS : EFI_NOT_FOUND;
#define BIOS_RESET_FAILED
#define BIOS_DISK_CHECK_BUFFER_SECTOR_COUNT
STATIC EFI_STATUS BiosDiskExtensionsSupported(IN THUNK_CONTEXT *ThunkContext, IN EFI_LEGACY_8259_PROTOCOL *Legacy8259, IN UINT8 DriveNumber)
STATIC EFI_STATUS BiosDiskReadExtSectors(IN THUNK_CONTEXT *ThunkContext, IN EFI_LEGACY_8259_PROTOCOL *Legacy8259, IN DEVICE_ADDRESS_PACKET *DeviceAddressPacket, IN UINT8 DriveNumber, IN UINT64 Lba, IN UINT8 NumSectors, IN OUT UINT8 *Buffer)
EFI_STATUS InternalGetBiosDiskAddress(IN THUNK_CONTEXT *ThunkContext, IN EFI_LEGACY_8259_PROTOCOL *Legacy8259, IN EFI_HANDLE DiskHandle, OUT UINT8 *DriveAddress)
STATIC EFI_STATUS BiosDiskReset(IN THUNK_CONTEXT *ThunkContext, IN EFI_LEGACY_8259_PROTOCOL *Legacy8259, IN UINT8 DriveNumber)
EFI_STATUS OcDiskRead(IN OC_DISK_CONTEXT *Context, IN UINT64 Lba, IN UINTN BufferSize, OUT VOID *Buffer)
EFI_STATUS OcDiskInitializeContext(OUT OC_DISK_CONTEXT *Context, IN EFI_HANDLE DiskHandle, IN BOOLEAN UseBlockIo2)
BOOLEAN EFIAPI OcLegacyThunkBiosInt86(IN THUNK_CONTEXT *ThunkContext, IN EFI_LEGACY_8259_PROTOCOL *Legacy8259, IN UINT8 BiosInt, IN IA32_REGISTER_SET *Regs)
#define EFI_SEGMENT(_Adr)
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
UINT64 EFIAPI RShiftU64(IN UINT64 Operand, IN UINTN Count)
UINT64 EFIAPI LShiftU64(IN UINT64 Operand, IN UINTN Count)