Signed-off-by: Li Elvin <elvin.li@intel.com> Reviewed-by: Ni Ruiyu <ruiyu.ni@intel.com> git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14205 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			1540 lines
		
	
	
		
			46 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			1540 lines
		
	
	
		
			46 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
| 
 | |
| Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
 | |
| 
 | |
| This program and the accompanying materials
 | |
| are licensed and made available under the terms and conditions
 | |
| of the BSD License which accompanies this distribution.  The
 | |
| full text of the license may be found at
 | |
| http://opensource.org/licenses/bsd-license.php
 | |
| 
 | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | |
| 
 | |
| **/
 | |
| 
 | |
| #ifndef _LEGACY_BIOS_INTERFACE_
 | |
| #define _LEGACY_BIOS_INTERFACE_
 | |
| 
 | |
| 
 | |
| #include <FrameworkDxe.h>
 | |
| #include <IndustryStandard/Pci.h>
 | |
| 
 | |
| #include <Guid/SmBios.h>
 | |
| #include <Guid/Acpi.h>
 | |
| #include <Guid/DxeServices.h>
 | |
| #include <Guid/LegacyBios.h>
 | |
| #include <Guid/StatusCodeDataTypeId.h>
 | |
| #include <Guid/ImageAuthentication.h>
 | |
| 
 | |
| #include <Protocol/BlockIo.h>
 | |
| #include <Protocol/LoadedImage.h>
 | |
| #include <Protocol/PciIo.h>
 | |
| #include <Protocol/Cpu.h>
 | |
| #include <Protocol/Timer.h>
 | |
| #include <Protocol/IsaIo.h>
 | |
| #include <Protocol/LegacyRegion2.h>
 | |
| #include <Protocol/SimpleTextIn.h>
 | |
| #include <Protocol/LegacyInterrupt.h>
 | |
| #include <Protocol/LegacyBios.h>
 | |
| #include <Protocol/DiskInfo.h>
 | |
| #include <Protocol/GenericMemoryTest.h>
 | |
| #include <Protocol/LegacyBiosPlatform.h>
 | |
| #include <Protocol/DevicePath.h>
 | |
| #include <Protocol/Legacy8259.h>
 | |
| #include <Protocol/PciRootBridgeIo.h>
 | |
| 
 | |
| #include <Library/BaseLib.h>
 | |
| #include <Library/DebugLib.h>
 | |
| #include <Library/UefiLib.h>
 | |
| #include <Library/BaseMemoryLib.h>
 | |
| #include <Library/ReportStatusCodeLib.h>
 | |
| #include <Library/UefiRuntimeServicesTableLib.h>
 | |
| #include <Library/HobLib.h>
 | |
| #include <Library/UefiDriverEntryPoint.h>
 | |
| #include <Library/MemoryAllocationLib.h>
 | |
| #include <Library/UefiBootServicesTableLib.h>
 | |
| #include <Library/IoLib.h>
 | |
| #include <Library/PcdLib.h>
 | |
| #include <Library/DevicePathLib.h>
 | |
| #include <Library/DxeServicesTableLib.h>
 | |
| #include <Library/PeCoffLib.h>
 | |
| #include <Library/CacheMaintenanceLib.h>
 | |
| #include <Library/DebugAgentLib.h>
 | |
| 
 | |
| //
 | |
| // BUGBUG: This entry maybe changed to PCD in future and wait for
 | |
| //         redesign of BDS library
 | |
| //
 | |
| #define MAX_BBS_ENTRIES 0x100
 | |
| 
 | |
| //
 | |
| // Thunk Status Codes
 | |
| //   (These apply only to errors with the thunk and not to the code that was
 | |
| //   thunked to.)
 | |
| //
 | |
| #define THUNK_OK              0x00
 | |
| #define THUNK_ERR_A20_UNSUP   0x01
 | |
| #define THUNK_ERR_A20_FAILED  0x02
 | |
| 
 | |
| //
 | |
| // Vector base definitions
 | |
| //
 | |
| //
 | |
| // 8259 Hardware definitions
 | |
| //
 | |
| #define LEGACY_MODE_BASE_VECTOR_MASTER     0x08
 | |
| #define LEGACY_MODE_BASE_VECTOR_SLAVE      0x70
 | |
| 
 | |
| //
 | |
| // The original PC used INT8-F for master PIC. Since these mapped over
 | |
| // processor exceptions TIANO moved the master PIC to INT68-6F.
 | |
| //
 | |
| // The vector base for slave PIC is set as 0x70 for PC-AT compatibility.
 | |
| //
 | |
| #define PROTECTED_MODE_BASE_VECTOR_MASTER  0x68
 | |
| #define PROTECTED_MODE_BASE_VECTOR_SLAVE   0x70
 | |
| 
 | |
| //
 | |
| // When we call CSM16 functions, some CSM16 use es:[offset + 0xabcd] to get data passed from CSM32, 
 | |
| // offset + 0xabcd could overflow which exceeds 0xFFFF which is invalid in real mode. 
 | |
| // So this will keep offset as small as possible to avoid offset overflow in real mode. 
 | |
| //
 | |
| #define NORMALIZE_EFI_SEGMENT(_Adr)      (UINT16) (((UINTN) (_Adr)) >> 4)
 | |
| #define NORMALIZE_EFI_OFFSET(_Adr)       (UINT16) (((UINT16) ((UINTN) (_Adr))) & 0xf)
 | |
| 
 | |
| //
 | |
| // Trace defines
 | |
| //
 | |
| //
 | |
| #define LEGACY_BDA_TRACE    0x000
 | |
| #define LEGACY_BIOS_TRACE   0x040
 | |
| #define LEGACY_BOOT_TRACE   0x080
 | |
| #define LEGACY_CMOS_TRACE   0x0C0
 | |
| #define LEGACY_IDE_TRACE    0x100
 | |
| #define LEGACY_MP_TRACE     0x140
 | |
| #define LEGACY_PCI_TRACE    0x180
 | |
| #define LEGACY_SIO_TRACE    0x1C0
 | |
| 
 | |
| #define LEGACY_PCI_TRACE_000 LEGACY_PCI_TRACE + 0x00
 | |
| #define LEGACY_PCI_TRACE_001 LEGACY_PCI_TRACE + 0x01
 | |
| #define LEGACY_PCI_TRACE_002 LEGACY_PCI_TRACE + 0x02
 | |
| #define LEGACY_PCI_TRACE_003 LEGACY_PCI_TRACE + 0x03
 | |
| #define LEGACY_PCI_TRACE_004 LEGACY_PCI_TRACE + 0x04
 | |
| #define LEGACY_PCI_TRACE_005 LEGACY_PCI_TRACE + 0x05
 | |
| #define LEGACY_PCI_TRACE_006 LEGACY_PCI_TRACE + 0x06
 | |
| #define LEGACY_PCI_TRACE_007 LEGACY_PCI_TRACE + 0x07
 | |
| #define LEGACY_PCI_TRACE_008 LEGACY_PCI_TRACE + 0x08
 | |
| #define LEGACY_PCI_TRACE_009 LEGACY_PCI_TRACE + 0x09
 | |
| #define LEGACY_PCI_TRACE_00A LEGACY_PCI_TRACE + 0x0A
 | |
| #define LEGACY_PCI_TRACE_00B LEGACY_PCI_TRACE + 0x0B
 | |
| #define LEGACY_PCI_TRACE_00C LEGACY_PCI_TRACE + 0x0C
 | |
| #define LEGACY_PCI_TRACE_00D LEGACY_PCI_TRACE + 0x0D
 | |
| #define LEGACY_PCI_TRACE_00E LEGACY_PCI_TRACE + 0x0E
 | |
| #define LEGACY_PCI_TRACE_00F LEGACY_PCI_TRACE + 0x0F
 | |
| 
 | |
| #define BDA_VIDEO_MODE      0x49
 | |
| 
 | |
| #define IDE_PI_REGISTER_PNE     BIT0
 | |
| #define IDE_PI_REGISTER_SNE     BIT2
 | |
| 
 | |
| typedef struct {
 | |
|   UINTN   PciSegment;
 | |
|   UINTN   PciBus;
 | |
|   UINTN   PciDevice;
 | |
|   UINTN   PciFunction;
 | |
|   UINT32  ShadowAddress;
 | |
|   UINT32  ShadowedSize;
 | |
|   UINT8   DiskStart;
 | |
|   UINT8   DiskEnd;
 | |
| } ROM_INSTANCE_ENTRY;
 | |
| 
 | |
| //
 | |
| // Values for RealModeGdt
 | |
| //
 | |
| #if defined (MDE_CPU_IA32)
 | |
| 
 | |
| #define NUM_REAL_GDT_ENTRIES  3
 | |
| #define CONVENTIONAL_MEMORY_TOP 0xA0000   // 640 KB
 | |
| #define INITIAL_VALUE_BELOW_1K  0x0
 | |
| 
 | |
| #elif defined (MDE_CPU_X64)
 | |
| 
 | |
| #define NUM_REAL_GDT_ENTRIES  8
 | |
| #define CONVENTIONAL_MEMORY_TOP 0xA0000   // 640 KB
 | |
| #define INITIAL_VALUE_BELOW_1K  0x0
 | |
| 
 | |
| #elif defined (MDE_CPU_IPF)
 | |
| 
 | |
| #define NUM_REAL_GDT_ENTRIES  3
 | |
| #define CONVENTIONAL_MEMORY_TOP 0x80000   // 512 KB
 | |
| #define INITIAL_VALUE_BELOW_1K  0xff
 | |
| 
 | |
| #endif
 | |
| 
 | |
| #pragma pack(1)
 | |
| 
 | |
| //
 | |
| // Define what a processor GDT looks like
 | |
| //
 | |
| typedef struct {
 | |
|   UINT32  LimitLo : 16;
 | |
|   UINT32  BaseLo : 16;
 | |
|   UINT32  BaseMid : 8;
 | |
|   UINT32  Type : 4;
 | |
|   UINT32  System : 1;
 | |
|   UINT32  Dpl : 2;
 | |
|   UINT32  Present : 1;
 | |
|   UINT32  LimitHi : 4;
 | |
|   UINT32  Software : 1;
 | |
|   UINT32  Reserved : 1;
 | |
|   UINT32  DefaultSize : 1;
 | |
|   UINT32  Granularity : 1;
 | |
|   UINT32  BaseHi : 8;
 | |
| } GDT32;
 | |
| 
 | |
| typedef struct {
 | |
|   UINT16  LimitLow;
 | |
|   UINT16  BaseLow;
 | |
|   UINT8   BaseMid;
 | |
|   UINT8   Attribute;
 | |
|   UINT8   LimitHi;
 | |
|   UINT8   BaseHi;
 | |
| } GDT64;
 | |
| 
 | |
| //
 | |
| // Define what a processor descriptor looks like
 | |
| // This data structure must be kept in sync with ASM STRUCT in Thunk.inc
 | |
| //
 | |
| typedef struct {
 | |
|   UINT16  Limit;
 | |
|   UINT64  Base;
 | |
| } DESCRIPTOR64;
 | |
| 
 | |
| typedef struct {
 | |
|   UINT16  Limit;
 | |
|   UINT32  Base;
 | |
| } DESCRIPTOR32;
 | |
| 
 | |
| //
 | |
| // Low stub lay out
 | |
| //
 | |
| #define LOW_STACK_SIZE      (8 * 1024)  // 8k?
 | |
| #define EFI_MAX_E820_ENTRY  100
 | |
| #define FIRST_INSTANCE      1
 | |
| #define NOT_FIRST_INSTANCE  0
 | |
| 
 | |
| #if defined (MDE_CPU_IA32)
 | |
| typedef struct {
 | |
|   //
 | |
|   // Space for the code
 | |
|   //  The address of Code is also the beginning of the relocated Thunk code
 | |
|   //
 | |
|   CHAR8                             Code[4096]; // ?
 | |
|   //
 | |
|   // The address of the Reverse Thunk code
 | |
|   //  Note that this member CONTAINS the address of the relocated reverse thunk
 | |
|   //  code unlike the member variable 'Code', which IS the address of the Thunk
 | |
|   //  code.
 | |
|   //
 | |
|   UINT32                            LowReverseThunkStart;
 | |
| 
 | |
|   //
 | |
|   // Data for the code (cs releative)
 | |
|   //
 | |
|   DESCRIPTOR32                      GdtDesc;          // Protected mode GDT
 | |
|   DESCRIPTOR32                      IdtDesc;          // Protected mode IDT
 | |
|   UINT32                            FlatSs;
 | |
|   UINT32                            FlatEsp;
 | |
| 
 | |
|   UINT32                            LowCodeSelector;  // Low code selector in GDT
 | |
|   UINT32                            LowDataSelector;  // Low data selector in GDT
 | |
|   UINT32                            LowStack;
 | |
|   DESCRIPTOR32                      RealModeIdtDesc;
 | |
| 
 | |
|   //
 | |
|   // real-mode GDT (temporary GDT with two real mode segment descriptors)
 | |
|   //
 | |
|   GDT32                             RealModeGdt[NUM_REAL_GDT_ENTRIES];
 | |
|   DESCRIPTOR32                      RealModeGdtDesc;
 | |
| 
 | |
|   //
 | |
|   // Members specifically for the reverse thunk
 | |
|   //  The RevReal* members are used to store the current state of real mode
 | |
|   //  before performing the reverse thunk.  The RevFlat* members must be set
 | |
|   //  before calling the reverse thunk assembly code.
 | |
|   //
 | |
|   UINT16                            RevRealDs;
 | |
|   UINT16                            RevRealSs;
 | |
|   UINT32                            RevRealEsp;
 | |
|   DESCRIPTOR32                      RevRealIdtDesc;
 | |
|   UINT16                            RevFlatDataSelector;  // Flat data selector in GDT
 | |
|   UINT32                            RevFlatStack;
 | |
| 
 | |
|   //
 | |
|   // A low memory stack
 | |
|   //
 | |
|   CHAR8                             Stack[LOW_STACK_SIZE];
 | |
| 
 | |
|   //
 | |
|   // Stack for flat mode after reverse thunk
 | |
|   // @bug    - This may no longer be necessary if the reverse thunk interface
 | |
|   //           is changed to have the flat stack in a different location.
 | |
|   //
 | |
|   CHAR8                             RevThunkStack[LOW_STACK_SIZE];
 | |
| 
 | |
|   //
 | |
|   // Legacy16 Init memory map info
 | |
|   //
 | |
|   EFI_TO_COMPATIBILITY16_INIT_TABLE EfiToLegacy16InitTable;
 | |
| 
 | |
|   EFI_TO_COMPATIBILITY16_BOOT_TABLE EfiToLegacy16BootTable;
 | |
| 
 | |
|   CHAR8                             InterruptRedirectionCode[32];
 | |
|   EFI_LEGACY_INSTALL_PCI_HANDLER    PciHandler;
 | |
|   EFI_DISPATCH_OPROM_TABLE          DispatchOpromTable;
 | |
|   BBS_TABLE                         BbsTable[MAX_BBS_ENTRIES];
 | |
| } LOW_MEMORY_THUNK;
 | |
| 
 | |
| #elif defined (MDE_CPU_X64)
 | |
| 
 | |
| typedef struct {
 | |
|   //
 | |
|   // Space for the code
 | |
|   //  The address of Code is also the beginning of the relocated Thunk code
 | |
|   //
 | |
|   CHAR8                             Code[4096]; // ?
 | |
| 
 | |
|   //
 | |
|   // Data for the code (cs releative)
 | |
|   //
 | |
|   DESCRIPTOR64                      X64GdtDesc;          // Protected mode GDT
 | |
|   DESCRIPTOR64                      X64IdtDesc;          // Protected mode IDT
 | |
|   UINTN                             X64Ss;
 | |
|   UINTN                             X64Esp;
 | |
| 
 | |
|   UINTN                             RealStack;
 | |
|   DESCRIPTOR32                      RealModeIdtDesc;
 | |
|   DESCRIPTOR32                      RealModeGdtDesc;
 | |
| 
 | |
|   //
 | |
|   // real-mode GDT (temporary GDT with two real mode segment descriptors)
 | |
|   //
 | |
|   GDT64                             RealModeGdt[NUM_REAL_GDT_ENTRIES];
 | |
|   UINT64                            PageMapLevel4;
 | |
| 
 | |
|   //
 | |
|   // A low memory stack
 | |
|   //
 | |
|   CHAR8                             Stack[LOW_STACK_SIZE];
 | |
| 
 | |
|   //
 | |
|   // Legacy16 Init memory map info
 | |
|   //
 | |
|   EFI_TO_COMPATIBILITY16_INIT_TABLE EfiToLegacy16InitTable;
 | |
| 
 | |
|   EFI_TO_COMPATIBILITY16_BOOT_TABLE EfiToLegacy16BootTable;
 | |
| 
 | |
|   CHAR8                             InterruptRedirectionCode[32];
 | |
|   EFI_LEGACY_INSTALL_PCI_HANDLER    PciHandler;
 | |
|   EFI_DISPATCH_OPROM_TABLE          DispatchOpromTable;
 | |
|   BBS_TABLE                         BbsTable[MAX_BBS_ENTRIES];
 | |
| } LOW_MEMORY_THUNK;
 | |
| 
 | |
| #elif defined (MDE_CPU_IPF)
 | |
| 
 | |
| typedef struct {
 | |
|   //
 | |
|   // Space for the code
 | |
|   //  The address of Code is also the beginning of the relocated Thunk code
 | |
|   //
 | |
|   CHAR8                             Code[4096]; // ?
 | |
|   //
 | |
|   // The address of the Reverse Thunk code
 | |
|   //  Note that this member CONTAINS the address of the relocated reverse thunk
 | |
|   //  code unlike the member variable 'Code', which IS the address of the Thunk
 | |
|   //  code.
 | |
|   //
 | |
|   UINT32                            LowReverseThunkStart;
 | |
| 
 | |
|   //
 | |
|   // Data for the code (cs releative)
 | |
|   //
 | |
|   DESCRIPTOR32                      GdtDesc;          // Protected mode GDT
 | |
|   DESCRIPTOR32                      IdtDesc;          // Protected mode IDT
 | |
|   UINT32                            FlatSs;
 | |
|   UINT32                            FlatEsp;
 | |
| 
 | |
|   UINT32                            LowCodeSelector;  // Low code selector in GDT
 | |
|   UINT32                            LowDataSelector;  // Low data selector in GDT
 | |
|   UINT32                            LowStack;
 | |
|   DESCRIPTOR32                      RealModeIdtDesc;
 | |
| 
 | |
|   //
 | |
|   // real-mode GDT (temporary GDT with two real mode segment descriptors)
 | |
|   //
 | |
|   GDT32                             RealModeGdt[NUM_REAL_GDT_ENTRIES];
 | |
|   DESCRIPTOR32                      RealModeGdtDesc;
 | |
| 
 | |
|   //
 | |
|   // Members specifically for the reverse thunk
 | |
|   //  The RevReal* members are used to store the current state of real mode
 | |
|   //  before performing the reverse thunk.  The RevFlat* members must be set
 | |
|   //  before calling the reverse thunk assembly code.
 | |
|   //
 | |
|   UINT16                            RevRealDs;
 | |
|   UINT16                            RevRealSs;
 | |
|   UINT32                            RevRealEsp;
 | |
|   DESCRIPTOR32                      RevRealIdtDesc;
 | |
|   UINT16                            RevFlatDataSelector;  // Flat data selector in GDT
 | |
|   UINT32                            RevFlatStack;
 | |
| 
 | |
|   //
 | |
|   // A low memory stack
 | |
|   //
 | |
|   CHAR8                             Stack[LOW_STACK_SIZE];
 | |
| 
 | |
|   //
 | |
|   // Stack for flat mode after reverse thunk
 | |
|   // @bug - This may no longer be necessary if the reverse thunk interface
 | |
|   //           is changed to have the flat stack in a different location.
 | |
|   //
 | |
|   CHAR8                             RevThunkStack[LOW_STACK_SIZE];
 | |
| 
 | |
|   //
 | |
|   // Legacy16 Init memory map info
 | |
|   //
 | |
|   EFI_TO_COMPATIBILITY16_INIT_TABLE EfiToLegacy16InitTable;
 | |
| 
 | |
|   EFI_TO_COMPATIBILITY16_BOOT_TABLE EfiToLegacy16BootTable;
 | |
| 
 | |
|   CHAR8                             InterruptRedirectionCode[32];
 | |
|   EFI_LEGACY_INSTALL_PCI_HANDLER    PciHandler;
 | |
|   EFI_DISPATCH_OPROM_TABLE          DispatchOpromTable;
 | |
|   BBS_TABLE                         BbsTable[MAX_BBS_ENTRIES];
 | |
| } LOW_MEMORY_THUNK;
 | |
| 
 | |
| #endif
 | |
| 
 | |
| //
 | |
| // PnP Expansion Header
 | |
| //
 | |
| typedef struct {
 | |
|   UINT32  PnpSignature;
 | |
|   UINT8   Revision;
 | |
|   UINT8   Length;
 | |
|   UINT16  NextHeader;
 | |
|   UINT8   Reserved1;
 | |
|   UINT8   Checksum;
 | |
|   UINT32  DeviceId;
 | |
|   UINT16  MfgPointer;
 | |
|   UINT16  ProductNamePointer;
 | |
|   UINT8   Class;
 | |
|   UINT8   SubClass;
 | |
|   UINT8   Interface;
 | |
|   UINT8   DeviceIndicators;
 | |
|   UINT16  Bcv;
 | |
|   UINT16  DisconnectVector;
 | |
|   UINT16  Bev;
 | |
|   UINT16  Reserved2;
 | |
|   UINT16  StaticResourceVector;
 | |
| } LEGACY_PNP_EXPANSION_HEADER;
 | |
| 
 | |
| typedef struct {
 | |
|   UINT8   PciSegment;
 | |
|   UINT8   PciBus;
 | |
|   UINT8   PciDevice;
 | |
|   UINT8   PciFunction;
 | |
|   UINT16  Vid;
 | |
|   UINT16  Did;
 | |
|   UINT16  SysSid;
 | |
|   UINT16  SVid;
 | |
|   UINT8   Class;
 | |
|   UINT8   SubClass;
 | |
|   UINT8   Interface;
 | |
|   UINT8   Reserved;
 | |
|   UINTN   RomStart;
 | |
|   UINTN   ManufacturerString;
 | |
|   UINTN   ProductNameString;
 | |
| } LEGACY_ROM_AND_BBS_TABLE;
 | |
| 
 | |
| //
 | |
| // Structure how EFI has mapped a devices HDD drive numbers.
 | |
| // Boot to EFI aware OS or shell requires this mapping when
 | |
| // 16-bit CSM assigns drive numbers.
 | |
| // This mapping is ignored booting to a legacy OS.
 | |
| //
 | |
| typedef struct {
 | |
|   UINT8 PciSegment;
 | |
|   UINT8 PciBus;
 | |
|   UINT8 PciDevice;
 | |
|   UINT8 PciFunction;
 | |
|   UINT8 StartDriveNumber;
 | |
|   UINT8 EndDriveNumber;
 | |
| } LEGACY_EFI_HDD_TABLE;
 | |
| 
 | |
| //
 | |
| // This data is passed to Leacy16Boot
 | |
| //
 | |
| typedef enum {
 | |
|   EfiAcpiAddressRangeMemory   = 1,
 | |
|   EfiAcpiAddressRangeReserved = 2,
 | |
|   EfiAcpiAddressRangeACPI     = 3,
 | |
|   EfiAcpiAddressRangeNVS      = 4
 | |
| } EFI_ACPI_MEMORY_TYPE;
 | |
| 
 | |
| typedef struct {
 | |
|   UINT64                BaseAddr;
 | |
|   UINT64                Length;
 | |
|   EFI_ACPI_MEMORY_TYPE  Type;
 | |
| } EFI_E820_ENTRY64;
 | |
| 
 | |
| typedef struct {
 | |
|   UINT32                BassAddrLow;
 | |
|   UINT32                BaseAddrHigh;
 | |
|   UINT32                LengthLow;
 | |
|   UINT32                LengthHigh;
 | |
|   EFI_ACPI_MEMORY_TYPE  Type;
 | |
| } EFI_E820_ENTRY;
 | |
| 
 | |
| #pragma pack()
 | |
| 
 | |
| extern BBS_TABLE           *mBbsTable;
 | |
| 
 | |
| extern EFI_GENERIC_MEMORY_TEST_PROTOCOL *gGenMemoryTest;
 | |
| 
 | |
| #define PORT_70 0x70
 | |
| #define PORT_71 0x71
 | |
| 
 | |
| #define CMOS_0A     0x0a  ///< Status register A
 | |
| #define CMOS_0D     0x0d  ///< Status register D
 | |
| #define CMOS_0E     0x0e  ///< Diagnostic Status
 | |
| #define CMOS_0F     0x0f  ///< Shutdown status
 | |
| #define CMOS_10     0x10  ///< Floppy type
 | |
| #define CMOS_12     0x12  ///< IDE type
 | |
| #define CMOS_14     0x14  ///< Same as BDA 40:10
 | |
| #define CMOS_15     0x15  ///< Low byte of base memory in 1k increments
 | |
| #define CMOS_16     0x16  ///< High byte of base memory in 1k increments
 | |
| #define CMOS_17     0x17  ///< Low byte of 1MB+ memory in 1k increments - max 15 MB
 | |
| #define CMOS_18     0x18  ///< High byte of 1MB+ memory in 1k increments - max 15 MB
 | |
| #define CMOS_19     0x19  ///< C: extended drive type
 | |
| #define CMOS_1A     0x1a  ///< D: extended drive type
 | |
| #define CMOS_2E     0x2e  ///< Most significient byte of standard checksum
 | |
| #define CMOS_2F     0x2f  ///< Least significient byte of standard checksum
 | |
| #define CMOS_30     0x30  ///< CMOS 0x17
 | |
| #define CMOS_31     0x31  ///< CMOS 0x18
 | |
| #define CMOS_32     0x32  ///< Century byte
 | |
| 
 | |
| //
 | |
| // 8254 Timer registers
 | |
| //
 | |
| #define TIMER0_COUNT_PORT                         0x40
 | |
| #define TIMER1_COUNT_PORT                         0x41
 | |
| #define TIMER2_COUNT_PORT                         0x42
 | |
| #define TIMER_CONTROL_PORT                        0x43
 | |
| 
 | |
| //
 | |
| // Timer 0, Read/Write LSB then MSB, Square wave output, binary count use.
 | |
| //
 | |
| #define TIMER0_CONTROL_WORD         0x36      
 | |
| 
 | |
| #define LEGACY_BIOS_INSTANCE_SIGNATURE  SIGNATURE_32 ('L', 'B', 'I', 'T')
 | |
| typedef struct {
 | |
|   UINTN                             Signature;
 | |
| 
 | |
|   EFI_HANDLE                        Handle;
 | |
|   EFI_LEGACY_BIOS_PROTOCOL          LegacyBios;
 | |
| 
 | |
|   EFI_HANDLE                        ImageHandle;
 | |
| 
 | |
|   //
 | |
|   // CPU Architectural Protocol 
 | |
|   //
 | |
|   EFI_CPU_ARCH_PROTOCOL             *Cpu;
 | |
| 
 | |
|   //
 | |
|   // Timer Architectural Protocol 
 | |
|   //
 | |
|   EFI_TIMER_ARCH_PROTOCOL           *Timer;
 | |
|   BOOLEAN                           TimerUses8254; 
 | |
|   
 | |
|   //
 | |
|   // Protocol to Lock and Unlock 0xc0000 - 0xfffff
 | |
|   //
 | |
|   EFI_LEGACY_REGION2_PROTOCOL       *LegacyRegion;
 | |
| 
 | |
|   EFI_LEGACY_BIOS_PLATFORM_PROTOCOL *LegacyBiosPlatform;
 | |
| 
 | |
|   //
 | |
|   // Interrupt control for thunk and PCI IRQ
 | |
|   //
 | |
|   EFI_LEGACY_8259_PROTOCOL          *Legacy8259;
 | |
|   
 | |
|   //
 | |
|   // PCI Interrupt PIRQ control
 | |
|   //
 | |
|   EFI_LEGACY_INTERRUPT_PROTOCOL     *LegacyInterrupt;
 | |
| 
 | |
|   //
 | |
|   // Generic Memory Test
 | |
|   //
 | |
|   EFI_GENERIC_MEMORY_TEST_PROTOCOL  *GenericMemoryTest;
 | |
| 
 | |
|   //
 | |
|   // TRUE if PCI Interupt Line registers have been programmed.
 | |
|   //
 | |
|   BOOLEAN                           PciInterruptLine;
 | |
| 
 | |
|   //
 | |
|   // Code space below 1MB needed by thunker to transition to real mode.
 | |
|   // Contains stack and real mode code fragments
 | |
|   //
 | |
|   LOW_MEMORY_THUNK                  *IntThunk;
 | |
| 
 | |
|   //
 | |
|   // Starting shadow address of the Legacy BIOS
 | |
|   //
 | |
|   UINT32                            BiosStart;
 | |
|   UINT32                            LegacyBiosImageSize;
 | |
| 
 | |
|   //
 | |
|   // Start of variables used by CsmItp.mac ITP macro file and/os LegacyBios
 | |
|   //
 | |
|   UINT8                             Dump[4];
 | |
| 
 | |
|   //
 | |
|   // $EFI Legacy16 code entry info in memory < 1 MB;
 | |
|   //
 | |
|   EFI_COMPATIBILITY16_TABLE         *Legacy16Table;
 | |
|   VOID                              *Legacy16InitPtr;
 | |
|   VOID                              *Legacy16BootPtr;
 | |
|   VOID                              *InternalIrqRoutingTable;
 | |
|   UINT32                            NumberIrqRoutingEntries;
 | |
|   VOID                              *BbsTablePtr;
 | |
|   VOID                              *HddTablePtr;
 | |
|   UINT32                            NumberHddControllers;
 | |
| 
 | |
|   //
 | |
|   // Cached copy of Legacy16 entry point
 | |
|   //
 | |
|   UINT16                            Legacy16CallSegment;
 | |
|   UINT16                            Legacy16CallOffset;
 | |
| 
 | |
|   //
 | |
|   // Returned from $EFI and passed in to OPROMS
 | |
|   //
 | |
|   UINT16                            PnPInstallationCheckSegment;
 | |
|   UINT16                            PnPInstallationCheckOffset;
 | |
| 
 | |
|   //
 | |
|   // E820 table
 | |
|   //
 | |
|   EFI_E820_ENTRY                    E820Table[EFI_MAX_E820_ENTRY];
 | |
|   UINT32                            NumberE820Entries;
 | |
| 
 | |
|   //
 | |
|   // True if legacy VGA INT 10h handler installed
 | |
|   //
 | |
|   BOOLEAN                           VgaInstalled;
 | |
| 
 | |
|   //
 | |
|   // Number of IDE drives
 | |
|   //
 | |
|   UINT8                             IdeDriveCount;
 | |
| 
 | |
|   //
 | |
|   // Current Free Option ROM space. An option ROM must NOT go past
 | |
|   // BiosStart.
 | |
|   //
 | |
|   UINT32                            OptionRom;
 | |
| 
 | |
|   //
 | |
|   // Save Legacy16 unexpected interrupt vector. Reprogram INT 68-6F from
 | |
|   // EFI values to legacy value just before boot.
 | |
|   //
 | |
|   UINT32                            BiosUnexpectedInt;
 | |
|   UINT32                            ThunkSavedInt[8];
 | |
|   UINT16                            ThunkSeg;
 | |
|   LEGACY_EFI_HDD_TABLE              *LegacyEfiHddTable;
 | |
|   UINT16                            LegacyEfiHddTableIndex;
 | |
|   UINT8                             DiskEnd;
 | |
|   UINT8                             Disk4075;
 | |
|   UINT16                            TraceIndex;
 | |
|   UINT16                            Trace[0x200];
 | |
| 
 | |
|   //
 | |
|   // Indicate that whether GenericLegacyBoot is entered or not
 | |
|   //
 | |
|   BOOLEAN                           LegacyBootEntered;                              
 | |
| 
 | |
|   //
 | |
|   // CSM16 PCI Interface Version
 | |
|   //
 | |
|   UINT16                            Csm16PciInterfaceVersion;
 | |
| 
 | |
| } LEGACY_BIOS_INSTANCE;
 | |
| 
 | |
| 
 | |
| #pragma pack(1)
 | |
| 
 | |
| /*
 | |
|   40:00-01 Com1
 | |
|   40:02-03 Com2
 | |
|   40:04-05 Com3
 | |
|   40:06-07 Com4
 | |
|   40:08-09 Lpt1
 | |
|   40:0A-0B Lpt2
 | |
|   40:0C-0D Lpt3
 | |
|   40:0E-0E Ebda segment
 | |
|   40:10-11 MachineConfig
 | |
|   40:12    Bda12 - skip
 | |
|   40:13-14 MemSize below 1MB
 | |
|   40:15-16 Bda15_16 - skip
 | |
|   40:17    Keyboard Shift status
 | |
|   40:18-19 Bda18_19 - skip
 | |
|   40:1A-1B Key buffer head
 | |
|   40:1C-1D Key buffer tail
 | |
|   40:1E-3D Bda1E_3D- key buffer -skip
 | |
|   40:3E-3F FloppyData 3E = Calibration status 3F = Motor status
 | |
|   40:40    FloppyTimeout
 | |
|   40:41-74 Bda41_74 - skip
 | |
|   40:75    Number of HDD drives
 | |
|   40:76-77 Bda76_77 - skip
 | |
|   40:78-79 78 = Lpt1 timeout, 79 = Lpt2 timeout
 | |
|   40:7A-7B 7A = Lpt3 timeout, 7B = Lpt4 timeout
 | |
|   40:7C-7D 7C = Com1 timeout, 7D = Com2 timeout
 | |
|   40:7E-7F 7E = Com3 timeout, 7F = Com4 timeout
 | |
|   40:80-81 Pointer to start of key buffer
 | |
|   40:82-83 Pointer to end of key buffer
 | |
|   40:84-87 Bda84_87 - skip
 | |
|   40:88    HDD Data Xmit rate
 | |
|   40:89-8f skip
 | |
|   40:90    Floppy data rate
 | |
|   40:91-95 skip
 | |
|   40:96    Keyboard Status
 | |
|   40:97    LED Status
 | |
|   40:98-101 skip
 | |
| */
 | |
| typedef struct {
 | |
|   UINT16  Com1;
 | |
|   UINT16  Com2;
 | |
|   UINT16  Com3;
 | |
|   UINT16  Com4;
 | |
|   UINT16  Lpt1;
 | |
|   UINT16  Lpt2;
 | |
|   UINT16  Lpt3;
 | |
|   UINT16  Ebda;
 | |
|   UINT16  MachineConfig;
 | |
|   UINT8   Bda12;
 | |
|   UINT16  MemSize;
 | |
|   UINT8   Bda15_16[0x02];
 | |
|   UINT8   ShiftStatus;
 | |
|   UINT8   Bda18_19[0x02];
 | |
|   UINT16  KeyHead;
 | |
|   UINT16  KeyTail;
 | |
|   UINT16  Bda1E_3D[0x10];
 | |
|   UINT16  FloppyData;
 | |
|   UINT8   FloppyTimeout;
 | |
|   UINT8   Bda41_74[0x34];
 | |
|   UINT8   NumberOfDrives;
 | |
|   UINT8   Bda76_77[0x02];
 | |
|   UINT16  Lpt1_2Timeout;
 | |
|   UINT16  Lpt3_4Timeout;
 | |
|   UINT16  Com1_2Timeout;
 | |
|   UINT16  Com3_4Timeout;
 | |
|   UINT16  KeyStart;
 | |
|   UINT16  KeyEnd;
 | |
|   UINT8   Bda84_87[0x4];
 | |
|   UINT8   DataXmit;
 | |
|   UINT8   Bda89_8F[0x07];
 | |
|   UINT8   FloppyXRate;
 | |
|   UINT8   Bda91_95[0x05];
 | |
|   UINT8   KeyboardStatus;
 | |
|   UINT8   LedStatus;
 | |
| } BDA_STRUC;
 | |
| #pragma pack()
 | |
| 
 | |
| #define LEGACY_BIOS_INSTANCE_FROM_THIS(this)  CR (this, LEGACY_BIOS_INSTANCE, LegacyBios, LEGACY_BIOS_INSTANCE_SIGNATURE)
 | |
| 
 | |
| /**
 | |
|   Thunk to 16-bit real mode and execute a software interrupt with a vector
 | |
|   of BiosInt. Regs will contain the 16-bit register context on entry and
 | |
|   exit.
 | |
| 
 | |
|   @param  This    Protocol instance pointer.
 | |
|   @param  BiosInt Processor interrupt vector to invoke
 | |
|   @param  Regs    Register contexted passed into (and returned) from thunk to
 | |
|                   16-bit mode
 | |
| 
 | |
|   @retval FALSE   Thunk completed, and there were no BIOS errors in the target code.
 | |
|                   See Regs for status.
 | |
|   @retval TRUE     There was a BIOS erro in the target code.
 | |
| 
 | |
| **/
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| LegacyBiosInt86 (
 | |
|   IN  EFI_LEGACY_BIOS_PROTOCOL          *This,
 | |
|   IN  UINT8                             BiosInt,
 | |
|   IN  EFI_IA32_REGISTER_SET             *Regs
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Thunk to 16-bit real mode and call Segment:Offset. Regs will contain the
 | |
|   16-bit register context on entry and exit. Arguments can be passed on
 | |
|   the Stack argument
 | |
| 
 | |
|   @param  This                   Protocol instance pointer.
 | |
|   @param  Segment                Segemnt of 16-bit mode call
 | |
|   @param  Offset                 Offset of 16-bit mdoe call
 | |
|   @param  Regs                   Register contexted passed into (and returned) from
 | |
|                                  thunk to  16-bit mode
 | |
|   @param  Stack                  Caller allocated stack used to pass arguments
 | |
|   @param  StackSize              Size of Stack in bytes
 | |
| 
 | |
|   @retval FALSE                  Thunk completed, and there were no BIOS errors in
 | |
|                                  the target code. See Regs for status.
 | |
|   @retval TRUE                   There was a BIOS erro in the target code.
 | |
| 
 | |
| **/
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| LegacyBiosFarCall86 (
 | |
|   IN  EFI_LEGACY_BIOS_PROTOCOL          *This,
 | |
|   IN  UINT16                            Segment,
 | |
|   IN  UINT16                            Offset,
 | |
|   IN  EFI_IA32_REGISTER_SET             *Regs,
 | |
|   IN  VOID                              *Stack,
 | |
|   IN  UINTN                             StackSize
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Test to see if a legacy PCI ROM exists for this device. Optionally return
 | |
|   the Legacy ROM instance for this PCI device.
 | |
| 
 | |
|   @param  This                   Protocol instance pointer.
 | |
|   @param  PciHandle              The PCI PC-AT OPROM from this devices ROM BAR will
 | |
|                                  be loaded
 | |
|   @param  RomImage               Return the legacy PCI ROM for this device
 | |
|   @param  RomSize                Size of ROM Image
 | |
|   @param  Flags                  Indicates if ROM found and if PC-AT.
 | |
| 
 | |
|   @retval EFI_SUCCESS            Legacy Option ROM availible for this device
 | |
|   @retval EFI_UNSUPPORTED        Legacy Option ROM not supported.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| LegacyBiosCheckPciRom (
 | |
|   IN  EFI_LEGACY_BIOS_PROTOCOL          *This,
 | |
|   IN  EFI_HANDLE                        PciHandle,
 | |
|   OUT VOID                              **RomImage, OPTIONAL
 | |
|   OUT UINTN                             *RomSize, OPTIONAL
 | |
|   OUT UINTN                             *Flags
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Assign drive number to legacy HDD drives prior to booting an EFI
 | |
|   aware OS so the OS can access drives without an EFI driver.
 | |
|   Note: BBS compliant drives ARE NOT available until this call by
 | |
|   either shell or EFI.
 | |
| 
 | |
|   @param  This                   Protocol instance pointer.
 | |
|   @param  BbsCount               Number of BBS_TABLE structures
 | |
|   @param  BbsTable               List BBS entries
 | |
| 
 | |
|   @retval EFI_SUCCESS            Drive numbers assigned
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| LegacyBiosPrepareToBootEfi (
 | |
|   IN EFI_LEGACY_BIOS_PROTOCOL         *This,
 | |
|   OUT UINT16                          *BbsCount,
 | |
|   OUT BBS_TABLE                       **BbsTable
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   To boot from an unconventional device like parties and/or execute
 | |
|   HDD diagnostics.
 | |
| 
 | |
|   @param  This                   Protocol instance pointer.
 | |
|   @param  Attributes             How to interpret the other input parameters
 | |
|   @param  BbsEntry               The 0-based index into the BbsTable for the parent
 | |
|                                   device.
 | |
|   @param  BeerData               Pointer to the 128 bytes of ram BEER data.
 | |
|   @param  ServiceAreaData        Pointer to the 64 bytes of raw Service Area data.
 | |
|                                  The caller must provide a pointer to the specific
 | |
|                                  Service Area and not the start all Service Areas.
 | |
|  EFI_INVALID_PARAMETER if error. Does NOT return if no error.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| LegacyBiosBootUnconventionalDevice (
 | |
|   IN EFI_LEGACY_BIOS_PROTOCOL         *This,
 | |
|   IN UDC_ATTRIBUTES                   Attributes,
 | |
|   IN UINTN                            BbsEntry,
 | |
|   IN VOID                             *BeerData,
 | |
|   IN VOID                             *ServiceAreaData
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Load a legacy PC-AT OPROM on the PciHandle device. Return information
 | |
|   about how many disks were added by the OPROM and the shadow address and
 | |
|   size. DiskStart & DiskEnd are INT 13h drive letters. Thus 0x80 is C:
 | |
| 
 | |
|   @param  This                   Protocol instance pointer.
 | |
|   @param  PciHandle              The PCI PC-AT OPROM from this devices ROM BAR will
 | |
|                                  be loaded. This value is NULL if RomImage is
 | |
|                                  non-NULL. This is the normal case.
 | |
|   @param  RomImage               A PCI PC-AT ROM image. This argument is non-NULL
 | |
|                                  if there is no hardware associated with the ROM
 | |
|                                  and thus no PciHandle, otherwise is must be NULL.
 | |
|                                  Example is PXE base code.
 | |
|   @param  Flags                  Indicates if ROM found and if PC-AT.
 | |
|   @param  DiskStart              Disk number of first device hooked by the ROM. If
 | |
|                                  DiskStart is the same as DiskEnd no disked were
 | |
|                                  hooked.
 | |
|   @param  DiskEnd                Disk number of the last device hooked by the ROM.
 | |
|   @param  RomShadowAddress       Shadow address of PC-AT ROM
 | |
|   @param  RomShadowedSize        Size of RomShadowAddress in bytes
 | |
| 
 | |
|   @retval EFI_SUCCESS            Legacy ROM loaded for this device
 | |
|   @retval EFI_INVALID_PARAMETER  PciHandle not found
 | |
|   @retval EFI_UNSUPPORTED        There is no PCI ROM in the ROM BAR or no onboard
 | |
|                                  ROM
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| LegacyBiosInstallPciRom (
 | |
|   IN  EFI_LEGACY_BIOS_PROTOCOL          * This,
 | |
|   IN  EFI_HANDLE                        PciHandle,
 | |
|   IN  VOID                              **RomImage,
 | |
|   OUT UINTN                             *Flags,
 | |
|   OUT UINT8                             *DiskStart, OPTIONAL
 | |
|   OUT UINT8                             *DiskEnd, OPTIONAL
 | |
|   OUT VOID                              **RomShadowAddress, OPTIONAL
 | |
|   OUT UINT32                            *RomShadowedSize OPTIONAL
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Fill in the standard BDA for Keyboard LEDs
 | |
| 
 | |
|   @param  This                   Protocol instance pointer.
 | |
|   @param  Leds                   Current LED status
 | |
| 
 | |
|   @retval EFI_SUCCESS            It should always work.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| LegacyBiosUpdateKeyboardLedStatus (
 | |
|   IN EFI_LEGACY_BIOS_PROTOCOL           *This,
 | |
|   IN UINT8                              Leds
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Get all BBS info
 | |
| 
 | |
|   @param  This                   Protocol instance pointer.
 | |
|   @param  HddCount               Number of HDD_INFO structures
 | |
|   @param  HddInfo                Onboard IDE controller information
 | |
|   @param  BbsCount               Number of BBS_TABLE structures
 | |
|   @param  BbsTable               List BBS entries
 | |
| 
 | |
|   @retval EFI_SUCCESS            Tables returned
 | |
|   @retval EFI_NOT_FOUND          resource not found
 | |
|   @retval EFI_DEVICE_ERROR       can not get BBS table
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| LegacyBiosGetBbsInfo (
 | |
|   IN  EFI_LEGACY_BIOS_PROTOCOL          *This,
 | |
|   OUT UINT16                            *HddCount,
 | |
|   OUT HDD_INFO                          **HddInfo,
 | |
|   OUT UINT16                            *BbsCount,
 | |
|   OUT BBS_TABLE                         **BbsTable
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Shadow all legacy16 OPROMs that haven't been shadowed.
 | |
|   Warning: Use this with caution. This routine disconnects all EFI
 | |
|   drivers. If used externally then caller must re-connect EFI
 | |
|   drivers.
 | |
| 
 | |
|   @param  This                   Protocol instance pointer.
 | |
| 
 | |
|   @retval EFI_SUCCESS            OPROMs shadowed
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| LegacyBiosShadowAllLegacyOproms (
 | |
|   IN EFI_LEGACY_BIOS_PROTOCOL   *This
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Attempt to legacy boot the BootOption. If the EFI contexted has been
 | |
|   compromised this function will not return.
 | |
| 
 | |
|   @param  This                   Protocol instance pointer.
 | |
|   @param  BbsDevicePath          EFI Device Path from BootXXXX variable.
 | |
|   @param  LoadOptionsSize        Size of LoadOption in size.
 | |
|   @param  LoadOptions            LoadOption from BootXXXX variable
 | |
| 
 | |
|   @retval EFI_SUCCESS            Removable media not present
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| LegacyBiosLegacyBoot (
 | |
|   IN  EFI_LEGACY_BIOS_PROTOCOL          *This,
 | |
|   IN  BBS_BBS_DEVICE_PATH               *BbsDevicePath,
 | |
|   IN  UINT32                            LoadOptionsSize,
 | |
|   IN  VOID                              *LoadOptions
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Allocate memory < 1 MB and copy the thunker code into low memory. Se up
 | |
|   all the descriptors.
 | |
| 
 | |
|   @param  Private                Private context for Legacy BIOS
 | |
| 
 | |
|   @retval EFI_SUCCESS            Should only pass.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| LegacyBiosInitializeThunk (
 | |
|   IN  LEGACY_BIOS_INSTANCE    *Private
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Fill in the standard BDA and EBDA stuff before Legacy16 load
 | |
| 
 | |
|   @param  Private                Legacy BIOS Instance data
 | |
| 
 | |
|   @retval EFI_SUCCESS            It should always work.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| LegacyBiosInitBda (
 | |
|   IN  LEGACY_BIOS_INSTANCE    *Private
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Collect IDE Inquiry data from the IDE disks
 | |
| 
 | |
|   @param  Private                Legacy BIOS Instance data
 | |
|   @param  HddInfo                Hdd Information
 | |
|   @param  Flag                   Reconnect IdeController or not
 | |
| 
 | |
|   @retval EFI_SUCCESS            It should always work.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| LegacyBiosBuildIdeData (
 | |
|   IN  LEGACY_BIOS_INSTANCE      *Private,
 | |
|   IN  HDD_INFO                  **HddInfo,
 | |
|   IN  UINT16                    Flag
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Enable ide controller.  This gets disabled when LegacyBoot.c is about
 | |
|   to run the Option ROMs.
 | |
| 
 | |
|   @param  Private                Legacy BIOS Instance data
 | |
| 
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| EnableIdeController (
 | |
|   IN LEGACY_BIOS_INSTANCE       *Private
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   If the IDE channel is in compatibility (legacy) mode, remove all
 | |
|   PCI I/O BAR addresses from the controller.
 | |
| 
 | |
|   @param  IdeController          The handle of target IDE controller
 | |
| 
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| InitLegacyIdeController (
 | |
|   IN EFI_HANDLE                 IdeController
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Program the interrupt routing register in all the PCI devices. On a PC AT system
 | |
|   this register contains the 8259 IRQ vector that matches it's PCI interrupt.
 | |
| 
 | |
|   @param  Private                Legacy  BIOS Instance data
 | |
| 
 | |
|   @retval EFI_SUCCESS            Succeed.
 | |
|   @retval EFI_ALREADY_STARTED    All PCI devices have been processed.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| PciProgramAllInterruptLineRegisters (
 | |
|   IN  LEGACY_BIOS_INSTANCE      *Private
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Collect EFI Info about legacy devices.
 | |
| 
 | |
|   @param  Private                Legacy BIOS Instance data
 | |
| 
 | |
|   @retval EFI_SUCCESS            It should always work.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| LegacyBiosBuildSioData (
 | |
|   IN  LEGACY_BIOS_INSTANCE      *Private
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Shadow all the PCI legacy ROMs. Use data from the Legacy BIOS Protocol
 | |
|   to chose the order. Skip any devices that have already have legacy
 | |
|   BIOS run.
 | |
| 
 | |
|   @param  Private                Protocol instance pointer.
 | |
| 
 | |
|   @retval EFI_SUCCESS            Succeed.
 | |
|   @retval EFI_UNSUPPORTED        Cannot get VGA device handle.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| PciShadowRoms (
 | |
|   IN  LEGACY_BIOS_INSTANCE      *Private
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Fill in the standard BDA and EBDA stuff prior to legacy Boot
 | |
| 
 | |
|   @param  Private                Legacy BIOS Instance data
 | |
| 
 | |
|   @retval EFI_SUCCESS            It should always work.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| LegacyBiosCompleteBdaBeforeBoot (
 | |
|   IN  LEGACY_BIOS_INSTANCE    *Private
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Fill in the standard CMOS stuff before Legacy16 load
 | |
| 
 | |
|   @param  Private                Legacy BIOS Instance data
 | |
| 
 | |
|   @retval EFI_SUCCESS            It should always work.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| LegacyBiosInitCmos (
 | |
|   IN  LEGACY_BIOS_INSTANCE    *Private
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Fill in the standard CMOS stuff prior to legacy Boot
 | |
| 
 | |
|   @param  Private                Legacy BIOS Instance data
 | |
| 
 | |
|   @retval EFI_SUCCESS            It should always work.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| LegacyBiosCompleteStandardCmosBeforeBoot (
 | |
|   IN  LEGACY_BIOS_INSTANCE    *Private
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Contains the code that is copied into low memory (below 640K).
 | |
|   This code reflects interrupts 0x68-0x6f to interrupts 0x08-0x0f.
 | |
|   This template must be copied into low memory, and the IDT entries
 | |
|   0x68-0x6F must be point to the low memory copy of this code.  Each
 | |
|   entry is 4 bytes long, so IDT entries 0x68-0x6F can be easily
 | |
|   computed.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| InterruptRedirectionTemplate (
 | |
|   VOID
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Build the E820 table.
 | |
| 
 | |
|   @param  Private                Legacy BIOS Instance data
 | |
|   @param  Size                   Size of E820 Table
 | |
| 
 | |
|   @retval EFI_SUCCESS            It should always work.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| LegacyBiosBuildE820 (
 | |
|   IN  LEGACY_BIOS_INSTANCE    *Private,
 | |
|   OUT UINTN                   *Size
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is to put all AP in halt state.
 | |
| 
 | |
|   @param  Private                Legacy BIOS Instance data
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| ShutdownAPs (
 | |
|   IN LEGACY_BIOS_INSTANCE              *Private
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Worker function for LegacyBiosGetFlatDescs, retrieving content of
 | |
|   specific registers.
 | |
| 
 | |
|   @param  IntThunk  Pointer to IntThunk of Legacy BIOS context.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| GetRegisters (
 | |
|   LOW_MEMORY_THUNK    *IntThunk
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Routine for calling real thunk code.
 | |
| 
 | |
|   @param  RealCode    The address of thunk code.
 | |
|   @param  BiosInt     The Bios interrupt vector number.
 | |
|   @param  CallAddress The address of 16-bit mode call.
 | |
| 
 | |
|   @return  Status returned by real thunk code
 | |
| 
 | |
| **/
 | |
| UINTN
 | |
| CallRealThunkCode (
 | |
|   UINT8               *RealCode,
 | |
|   UINT8               BiosInt,
 | |
|   UINT32              CallAddress
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Routine for generating soft interrupt.
 | |
| 
 | |
|   @param Vector  The interrupt vector number.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| GenerateSoftInit (
 | |
|   UINT8               Vector
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Do an AllocatePages () of type AllocateMaxAddress for EfiBootServicesCode
 | |
|   memory.
 | |
| 
 | |
|   @param  AllocateType               Allocated Legacy Memory Type
 | |
|   @param  StartPageAddress           Start address of range
 | |
|   @param  Pages                      Number of pages to allocate
 | |
|   @param  Result                     Result of allocation
 | |
| 
 | |
|   @retval EFI_SUCCESS                Legacy16 code loaded
 | |
|   @retval Other                      No protocol installed, unload driver.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| AllocateLegacyMemory (
 | |
|   IN  EFI_ALLOCATE_TYPE         AllocateType,
 | |
|   IN  EFI_PHYSICAL_ADDRESS      StartPageAddress,
 | |
|   IN  UINTN                     Pages,
 | |
|   OUT EFI_PHYSICAL_ADDRESS      *Result
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Get a region from the LegacyBios for Tiano usage. Can only be invoked once.
 | |
| 
 | |
|   @param  This                       Protocol instance pointer.
 | |
|   @param  LegacyMemorySize           Size of required region
 | |
|   @param  Region                     Region to use. 00 = Either 0xE0000 or 0xF0000
 | |
|                                      block Bit0 = 1 0xF0000 block Bit1 = 1 0xE0000
 | |
|                                      block
 | |
|   @param  Alignment                  Address alignment. Bit mapped. First non-zero
 | |
|                                      bit from right is alignment.
 | |
|   @param  LegacyMemoryAddress        Region Assigned
 | |
| 
 | |
|   @retval EFI_SUCCESS                Region assigned
 | |
|   @retval EFI_ACCESS_DENIED          Procedure previously invoked
 | |
|   @retval Other                      Region not assigned
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| LegacyBiosGetLegacyRegion (
 | |
|   IN    EFI_LEGACY_BIOS_PROTOCOL *This,
 | |
|   IN    UINTN                    LegacyMemorySize,
 | |
|   IN    UINTN                    Region,
 | |
|   IN    UINTN                    Alignment,
 | |
|   OUT   VOID                     **LegacyMemoryAddress
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Get a region from the LegacyBios for Tiano usage. Can only be invoked once.
 | |
| 
 | |
|   @param  This                       Protocol instance pointer.
 | |
|   @param  LegacyMemorySize           Size of data to copy
 | |
|   @param  LegacyMemoryAddress        Legacy Region destination address Note: must
 | |
|                                      be in region assigned by
 | |
|                                      LegacyBiosGetLegacyRegion
 | |
|   @param  LegacyMemorySourceAddress  Source of data
 | |
| 
 | |
|   @retval EFI_SUCCESS                Region assigned
 | |
|   @retval EFI_ACCESS_DENIED          Destination outside assigned region
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| LegacyBiosCopyLegacyRegion (
 | |
|   IN EFI_LEGACY_BIOS_PROTOCOL *This,
 | |
|   IN    UINTN                 LegacyMemorySize,
 | |
|   IN    VOID                  *LegacyMemoryAddress,
 | |
|   IN    VOID                  *LegacyMemorySourceAddress
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Find Legacy16 BIOS image in the FLASH device and shadow it into memory. Find
 | |
|   the $EFI table in the shadow area. Thunk into the Legacy16 code after it had
 | |
|   been shadowed.
 | |
| 
 | |
|   @param  Private                    Legacy BIOS context data
 | |
| 
 | |
|   @retval EFI_SUCCESS                Legacy16 code loaded
 | |
|   @retval Other                      No protocol installed, unload driver.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| ShadowAndStartLegacy16 (
 | |
|   IN  LEGACY_BIOS_INSTANCE  *Private
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Checks the state of the floppy and if media is inserted.
 | |
|   
 | |
|   This routine checks the state of the floppy and if media is inserted.
 | |
|   There are 3 cases:
 | |
|   No floppy present         - Set BBS entry to ignore
 | |
|   Floppy present & no media - Set BBS entry to lowest priority. We cannot
 | |
|   set it to ignore since 16-bit CSM will
 | |
|   indicate no floppy and thus drive A: is
 | |
|   unusable. CSM-16 will not try floppy since
 | |
|   lowest priority and thus not incur boot
 | |
|   time penality.
 | |
|   Floppy present & media    - Set BBS entry to some priority.
 | |
| 
 | |
|   @return  State of floppy media
 | |
| 
 | |
| **/
 | |
| UINT8
 | |
| HasMediaInFloppy (
 | |
|   VOID
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Identify drive data must be updated to actual parameters before boot.
 | |
|   This requires updating the checksum, if it exists.
 | |
| 
 | |
|   @param  IdentifyDriveData       ATA Identify Data
 | |
|   @param  Checksum                checksum of the ATA Identify Data
 | |
| 
 | |
|   @retval EFI_SUCCESS             checksum calculated
 | |
|   @retval EFI_SECURITY_VIOLATION  IdentifyData invalid
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| CalculateIdentifyDriveChecksum (
 | |
|   IN  UINT8     *IdentifyDriveData,
 | |
|   OUT UINT8     *Checksum
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Identify drive data must be updated to actual parameters before boot.
 | |
| 
 | |
|   @param  IdentifyDriveData       ATA Identify Data
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| UpdateIdentifyDriveData (
 | |
|   IN  UINT8     *IdentifyDriveData
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Complete build of BBS TABLE.
 | |
| 
 | |
|   @param  Private                 Legacy BIOS Instance data
 | |
|   @param  BbsTable                BBS Table passed to 16-bit code
 | |
| 
 | |
|   @retval EFI_SUCCESS             Removable media not present
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| LegacyBiosBuildBbs (
 | |
|   IN  LEGACY_BIOS_INSTANCE      *Private,
 | |
|   IN  BBS_TABLE                 *BbsTable
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Read CMOS register through index/data port.
 | |
| 
 | |
|   @param[in]  Index   The index of the CMOS register to read.
 | |
| 
 | |
|   @return  The data value from the CMOS register specified by Index.
 | |
| 
 | |
| **/
 | |
| UINT8
 | |
| LegacyReadStandardCmos (
 | |
|   IN UINT8  Index
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Write CMOS register through index/data port.
 | |
| 
 | |
|   @param[in]  Index  The index of the CMOS register to write.
 | |
|   @param[in]  Value  The value of CMOS register to write.
 | |
| 
 | |
|   @return  The value written to the CMOS register specified by Index.
 | |
| 
 | |
| **/
 | |
| UINT8
 | |
| LegacyWriteStandardCmos (
 | |
|   IN UINT8  Index,
 | |
|   IN UINT8  Value
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Calculate the new standard CMOS checksum and write it.
 | |
| 
 | |
|   @param  Private      Legacy BIOS Instance data
 | |
| 
 | |
|   @retval EFI_SUCCESS  Calculate 16-bit checksum successfully
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| LegacyCalculateWriteStandardCmosChecksum (
 | |
|   VOID
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Test to see if a legacy PCI ROM exists for this device. Optionally return
 | |
|   the Legacy ROM instance for this PCI device.
 | |
| 
 | |
|   @param[in]  This                   Protocol instance pointer.
 | |
|   @param[in]  PciHandle              The PCI PC-AT OPROM from this devices ROM BAR will be loaded
 | |
|   @param[out] RomImage               Return the legacy PCI ROM for this device
 | |
|   @param[out] RomSize                Size of ROM Image
 | |
|   @param[out] RuntimeImageLength     Runtime size of ROM Image
 | |
|   @param[out] Flags                  Indicates if ROM found and if PC-AT.
 | |
|   @param[out] OpromRevision          Revision of the PCI Rom
 | |
|   @param[out] ConfigUtilityCodeHeaderPointer of Configuration Utility Code Header
 | |
| 
 | |
|   @return EFI_SUCCESS            Legacy Option ROM availible for this device
 | |
|   @return EFI_ALREADY_STARTED    This device is already managed by its Oprom
 | |
|   @return EFI_UNSUPPORTED        Legacy Option ROM not supported.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| LegacyBiosCheckPciRomEx (
 | |
|   IN EFI_LEGACY_BIOS_PROTOCOL           *This,
 | |
|   IN  EFI_HANDLE                        PciHandle,
 | |
|   OUT VOID                              **RomImage, OPTIONAL
 | |
|   OUT UINTN                             *RomSize, OPTIONAL
 | |
|   OUT UINTN                             *RuntimeImageLength, OPTIONAL
 | |
|   OUT UINTN                             *Flags, OPTIONAL
 | |
|   OUT UINT8                             *OpromRevision, OPTIONAL
 | |
|   OUT VOID                              **ConfigUtilityCodeHeader OPTIONAL
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Relocate this image under 4G memory for IPF.
 | |
| 
 | |
|   @param  ImageHandle  Handle of driver image.
 | |
|   @param  SystemTable  Pointer to system table.
 | |
| 
 | |
|   @retval EFI_SUCCESS  Image successfully relocated.
 | |
|   @retval EFI_ABORTED  Failed to relocate image.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| RelocateImageUnder4GIfNeeded (
 | |
|   IN EFI_HANDLE           ImageHandle,
 | |
|   IN EFI_SYSTEM_TABLE     *SystemTable
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Thunk to 16-bit real mode and call Segment:Offset. Regs will contain the
 | |
|   16-bit register context on entry and exit. Arguments can be passed on
 | |
|   the Stack argument
 | |
| 
 | |
|   @param  This       Protocol instance pointer.
 | |
|   @param  Segment    Segemnt of 16-bit mode call
 | |
|   @param  Offset     Offset of 16-bit mdoe call
 | |
|   @param  Regs       Register contexted passed into (and returned) from thunk to
 | |
|                      16-bit mode
 | |
|   @param  Stack      Caller allocated stack used to pass arguments
 | |
|   @param  StackSize  Size of Stack in bytes
 | |
| 
 | |
|   @retval FALSE      Thunk completed, and there were no BIOS errors in the target code.
 | |
|                      See Regs for status.
 | |
|   @retval TRUE       There was a BIOS erro in the target code.
 | |
| 
 | |
| **/
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| InternalLegacyBiosFarCall (
 | |
|   IN  EFI_LEGACY_BIOS_PROTOCOL        *This,
 | |
|   IN  UINT16                          Segment,
 | |
|   IN  UINT16                          Offset,
 | |
|   IN  EFI_IA32_REGISTER_SET           *Regs,
 | |
|   IN  VOID                            *Stack,
 | |
|   IN  UINTN                           StackSize
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Load a legacy PC-AT OpROM for VGA controller.
 | |
| 
 | |
|   @param  Private                Driver private data.
 | |
| 
 | |
|   @retval EFI_SUCCESS            Legacy ROM successfully installed for this device.
 | |
|   @retval EFI_DEVICE_ERROR       No VGA device handle found, or native EFI video
 | |
|                                  driver cannot be successfully disconnected, or VGA
 | |
|                                  thunk driver cannot be successfully connected.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| LegacyBiosInstallVgaRom (
 | |
|   IN  LEGACY_BIOS_INSTANCE            *Private
 | |
|   );
 | |
| 
 | |
| #endif
 |