由C写成的EfiCompatibility code存在于EFI环境中,它构成了一些protocols。
1,Legacy BIOS Protocol
LegacyBios module构成了CSM的框架,所以Legacy BIOS Protocol 是CSM的基本protocol,作用于platform与hardware之间。这个protocol包括以下function:
BootUnconventionalDevice() ; CheckPciRom() ; CopyLegacyRegion();
GetLegacyRegion(); FarCall86() ; GetBbsInfo() ;
GetLegacyRegion() ; Int86() ; InstallPciRom() ;
LegacyBoot() ; PrepareToBootEfi() ; ShadowAllLegacyOproms() ;
UpdateKeyboardLedStatus();
2,Legacy BIOS Platform Protocol
Platform特有的protocol。当使用同一chipset时,该protocol提供独一无二的信息来比较两个platform。这个protocol包括以下function:
GetPlatformHandle() ; GetPlatformInfo() ; GetRoutingTable();
PlatformHooks() ; PrepareToBoot() ; SmmInit() ;
TranslatePirq()
3,Legacy Region Protocol
管理硬件使得0xC0000 到0xFFFFF之间的物理区域变为RO或RW。
这个protocol包括以下function:
Decode() ; Lock()(write protect) ;
BootLock() ; Unlock()(read-write) ;
4,Legacy 8259 Protocol
在保护模式和实模式下通过管理硬件控制8259 PIC。这个protocol包括以下function:
SetVectorBase() ; GetMask() ; SetMask() ;
SetMode() ; GetVector() ; EnableIrq() ;
DisableIrq() ; GetInterruptLine(); EndOfInterrupt();
5,Legacy Interrupt Protocol
Chipset特有protocol,管理硬件来为PCI分配IRQs。这个protocol包括以下function:
GetNumberPirqs() ; GetLocation() ;
ReadPirq() ; WritePirq() ;
Compatibility16 function
这个function允许EfiCompatibility code与Compatibility16 code交互,下面列出主要的function:
·Compatibility16InitializeYourself()
允许Compatibility16做一些初始化(0xE0000 to 0xFFFFF RW)
·Compatibility16UpdateBbs()
允许Compatibility16 code更新CSM’s BBS data structures为一些关联INT13, INT18, INT19的OpROM。(0xE0000 to 0xFFFFF RW)
·Compatibility16PrepareToBoot()
允许booting a traditional OS前Compatibility16 code做一些动作。(0xE0000 to 0xFFFFF RW)
·Compatibility16Boot()
booting a traditional OS前最后一个function。(0xE0000 to 0xFFFFF write protect)
·Compatibility16RetrieveLastBootDevice()
检索最后一个boot device的priority number. (0xE0000 to 0xFFFFF write protect)
·Compatibility16DispatchOprom()
将控制权交给OpROM initialization address,这个地址允许Compatibility16
Code的一些操作。(0xE0000 to 0xFFFFF write protect,当OpROMs位于0xExxxx区域时 RW)
·Compatibility16GetTableAddress()
请求Compatibility16分配一块制定大小的区域在0xE0000–0xFFFFF之间,EfiCompatibility code会复制数据到这块区域。(0xE0000 to 0xFFFFF RW)
·Compatibility16SetKeyboardLeds()
允许Compatibility16 code更新keyboard LED state下的任何不标准数据结构。(0xE0000 to 0xFFFFF RW)
·Compatibility16InstallPciHandler()
使得Compatibility16 code安装一个IRQ handler为大量没有OpROM关联的存储设备,例如SATA.