当前位置: 首页 > news >正文

【UEFI实战】BIOS与IPMI

KCS

KCS全称是Keyboard Controller Style,关于这个名称不用过多的追究,只需要知道它是系统(BIOS和OS)和BMC通信的一种基本方式即可。本文将介绍BIOS下的KCS接口,包括接口使用方式和数据。内容参考自《ipmi-second-gen-interface-spec-v2-rev1-1.pdf》和https://github.com/microsoft/mu_feature_ipmi.git代码。

KCS数据

BIOS和BMC的交互通过Request和Response的方式,所以对应的数据也有两种,首先是Request:

在这里插入图片描述

参数说明如下:

  • NetFn/Cmd:IPMI命令有不同的分组,通过NetFn/Cmd命令字的方式来索引,在IPMI命令介绍会进一步说明。
  • LUNLogical Unit Number,占据8个比特中的最低两个,对于通过KCS向BMC发送的数据,LUN的值都是00b。
  • Data:IPMI命令的实际请求数据。

然后是Response:

在这里插入图片描述

其它参数跟Request类似,只是多了一个Complete Code,说明如下:

  • Completion Code:IPMI命令的返回状态,具体的取值如下:
//
// Generic Completion Codes definitions
//
#define IPMI_COMP_CODE_NORMAL                           0x00
#define IPMI_COMP_CODE_NODE_BUSY                        0xC0
#define IPMI_COMP_CODE_INVALID_COMMAND                  0xC1
#define IPMI_COMP_CODE_INVALID_FOR_GIVEN_LUN            0xC2
#define IPMI_COMP_CODE_TIMEOUT                          0xC3
#define IPMI_COMP_CODE_OUT_OF_SPACE                     0xC4
#define IPMI_COMP_CODE_RESERVATION_CANCELED_OR_INVALID  0xC5
#define IPMI_COMP_CODE_REQUEST_DATA_TRUNCATED           0xC6
#define IPMI_COMP_CODE_INVALID_REQUEST_DATA_LENGTH      0xC7
#define IPMI_COMP_CODE_REQUEST_EXCEED_LIMIT             0xC8
#define IPMI_COMP_CODE_OUT_OF_RANGE                     0xC9
#define IPMI_COMP_CODE_CANNOT_RETURN                    0xCA
#define IPMI_COMP_CODE_NOT_PRESENT                      0xCB
#define IPMI_COMP_CODE_INVALID_DATA_FIELD               0xCC
#define IPMI_COMP_CODE_COMMAND_ILLEGAL                  0xCD
#define IPMI_COMP_CODE_CMD_RESP_NOT_PROVIDED            0xCE
#define IPMI_COMP_CODE_FAIL_DUP_REQUEST                 0xCF
#define IPMI_COMP_CODE_SDR_REP_IN_UPDATE_MODE           0xD0
#define IPMI_COMP_CODE_DEV_IN_FW_UPDATE_MODE            0xD1
#define IPMI_COMP_CODE_BMC_INIT_IN_PROGRESS             0xD2
#define IPMI_COMP_CODE_DEST_UNAVAILABLE                 0xD3
#define IPMI_COMP_CODE_INSUFFICIENT_PRIVILEGE           0xD4
#define IPMI_COMP_CODE_UNSUPPORTED_IN_PRESENT_STATE     0xD5
#define IPMI_COMP_CODE_SUBFUNCTION_DISABLED             0xD6
#define IPMI_COMP_CODE_UNSPECIFIED                      0xFF
  • Data:IPMI命令的实际响应数据。

需要注意,无论是Request还是Response,其数据部分都可以是空的。

另外,还有一种稍微特殊一点的KSC数据,用来上报事件信息:

在这里插入图片描述

其实就是一种IPMI命令数据而已。

KSC通信

KSC接口定义了一组IO寄存器,通过它们就可以完成与BMC的交互,这组寄存器的基地址基本上已经固定:

gIpmiFeaturePkgTokenSpaceGuid.PcdIpmiIoBaseAddress|0xCA2|UINT16|0xF000000A

为了使用该地址,首先需要打开它的映射,代码如下所示:

/**Initializing hardware for the IPMI transport.@retval   EFI_SUCCESS     Hardware was successfully initialized.@retval   Other           An error was returned from PlatformIpmiIoRangeSet.
**/
EFI_STATUS
InitializeIpmiTransportHardware (VOID){EFI_STATUS  Status;//// Enable OEM specific southbridge SIO KCS I/O address range 0xCA0 to 0xCAF at here// if the the I/O address range has not been enabled.//Status = PlatformIpmiIoRangeSet (PcdGet16 (PcdIpmiIoBaseAddress));DEBUG ((DEBUG_INFO, "IPMI: PlatformIpmiIoRangeSet - %r!\n", Status));return Status;
}

对于PlatformIpmiIoRangeSet()函数的实现,可以暂时不过,因为依赖于不同的硬件平台,对于x86平台,通常是LPC设备一些操作。

当完成PcdIpmiIoBaseAddress基地址之后,就可以进行IO操作了,对应的寄存器如下:

在这里插入图片描述

可以看到就4个寄存器(如果考虑共用的部分,其实就2个寄存器):

  • Status:只读寄存器,包含了操作过程中的Flag。
  • Command:只写寄存器,用于写入各类操作,这些操作称为“Write Control Codes”。
  • Data_Out:只读寄存器,用来读取数据。
  • Data_In:只写寄存器,用来写入数据或者“Read Control Codes”。

这里的“Control Codes”如下:

在这里插入图片描述

前面的4个是“Write Control Codes”,只能写入Status寄存器;最后一个是“Read Control Codes”,写入Data寄存器,前面提到的KSC数据也是写入到Data寄存器的。

Status寄存器的比特说明如下:

在这里插入图片描述

其中的S0和S1根据组合得到如下的值:

在这里插入图片描述

得到四种状态。

Status寄存器的代码表示:

typedef union {UINT8    RawData;struct {UINT8    Obf   : 1;UINT8    Ibf   : 1;UINT8    SmAtn : 1;UINT8    CD    : 1;UINT8    Oem1  : 1;UINT8    Oem2  : 1;UINT8    State : 2;} Status;
} KCS_STATUS;

根据上述的寄存器操作,得到BIOS向BMC写数据的流程:

在这里插入图片描述

对应的代码实现可以在IpmiFeaturePkg\GenericIpmi\Common\GenericIpmi.c找到,下面是代码的大致说明:

  1. 等待IBF=0:
  do {MicroSecondDelay (IPMI_DELAY_UNIT);KcsStatus.RawData = IoRead8 (KcsIoBase + 1);if ((KcsStatus.RawData == 0xFF) || (TimeOut >= IpmiTimeoutPeriod)) {if ((Status = KcsErrorExit (IpmiTimeoutPeriod)) != EFI_SUCCESS) {return Status;}}TimeOut++;} while (KcsStatus.Status.Ibf);
  1. 写入KCS_WRITE_START,并等待IBF=0:
  KcsData = KCS_WRITE_START;IoWrite8 ((KcsIoBase + 1), KcsData);if ((Status = KcsCheckStatus (IpmiTimeoutPeriod, KcsWriteState, &Idle)) != EFI_SUCCESS) {return Status;}
  1. 开始写入数据,等待数据写入完成之后,最后写入KCS_WRITE_END
  for (i = 0; i < DataSize; i++) {if (i == (DataSize - 1)) {if ((Status = KcsCheckStatus (IpmiTimeoutPeriod, KcsWriteState, &Idle)) != EFI_SUCCESS) {return Status;}KcsData = KCS_WRITE_END;IoWrite8 ((KcsIoBase + 1), KcsData);}Status = KcsCheckStatus (IpmiTimeoutPeriod, KcsWriteState, &Idle);if (EFI_ERROR (Status)) {return Status;}IoWrite8 (KcsIoBase, Data[i]);}
  1. 开始接收数据:
  while (TRUE) {if ((Status = KcsCheckStatus (IpmiTimeoutPeriod, KcsReadState, &Idle)) != EFI_SUCCESS) {return Status;}if (Idle) {*DataSize = Count;break;}//// Need to check Data Size -1 to account for array access//if (Count >= *DataSize) {return EFI_DEVICE_ERROR;}Data[Count] = IoRead8 (KcsIoBase);Count++;KcsData = KCS_READ;IoWrite8 (KcsIoBase, KcsData);}
  1. 结束数据接收,并将数据返回。

以上只是简单的介绍,还有一些诸如KcsCheckStatus()的函数没有说明,具体可以直接看代码。

IPMI命令介绍

IPMI命令会通过NetFn/Cmd的方式写入到KSC接口中,以完成不同的操作,这里将列出IPMI规范定义的所以基础操作。在EDK代码中有几个头文件已经定义了部分IPMI命令,具体对应的头文件是:

#include <IndustryStandard/IpmiNetFnChassis.h>
#include <IndustryStandard/IpmiNetFnBridge.h>
#include <IndustryStandard/IpmiNetFnSensorEvent.h>
#include <IndustryStandard/IpmiNetFnApp.h>
#include <IndustryStandard/IpmiNetFnFirmware.h>
#include <IndustryStandard/IpmiNetFnStorage.h>
#include <IndustryStandard/IpmiNetFnTransport.h>
#include <IndustryStandard/IpmiNetFnGroupExtension.h>
#include <IndustryStandard/IpmiFruInformationStorage.h>

需要注意:

  • NetFn都是偶数的。

  • 最后一列的O/M表示的是BMC是否需要实现该命令。

  • BIOS下的头文件中并没有包含所有IPMI规范中定义的命令,所以下面的表中不少命令没有对应的宏。

  • 除了在IPMI规范中定义的命令,还可以有自定义的命令,这当然是有好处的,因为扩展了BIOS和BMC通信的内容,但是也存在不同的BIOS和BMC厂商对同一个命令字有不同的实现,导致了维护的困难。

NetFn 0x00 - IPMI_NETFN_CHASSIS

对应头文件edk2\MdePkg\Include\IndustryStandard\IpmiNetFnChassis.h:

Cmd说明O/M
0x00 - IPMI_CHASSIS_GET_CAPABILITIESGet Chassis Capabilities必需
0x01 - IPMI_CHASSIS_GET_STATUSGet Chassis Status必需
0x02 - IPMI_CHASSIS_CONTROLChassis Control必需
0x03 - IPMI_CHASSIS_RESETChassis Reset可选
0x04 - IPMI_CHASSIS_IDENTIFYChassis Identify可选
0x05 - IPMI_CHASSIS_SET_CAPABILITIESSet Chassis Capabilities可选
0x06 - IPMI_CHASSIS_SET_POWER_RESTORE_POLICYSet Power Restore Policy可选
0x07 - IPMI_CHASSIS_GET_SYSTEM_RESTART_CAUSEGet System Restart Cause可选
0x08 - IPMI_CHASSIS_SET_SYSTEM_BOOT_OPTIONSSet System Boot Options可选
0x09 - IPMI_CHASSIS_GET_SYSTEM_BOOT_OPTIONSGet System Boot Options可选
0x0A - IPMI_CHASSIS_SET_FRONT_PANEL_BUTTON_ENABLESSet Front Panel Enables可选
0x0B - IPMI_CHASSIS_SET_POWER_CYCLE_INTERVALSSet Power Cycle Interval可选
0x0F - IPMI_CHASSIS_GET_POH_COUNTERGet POH Counter可选

NetFn 0x02 - IPMI_NETFN_BRIDGE

对应头文件edk2\MdePkg\Include\IndustryStandard\IpmiNetFnBridge.h:

Cmd
0x00 - IPMI_BRIDGE_GET_STATE
0x01 - IPMI_BRIDGE_SET_STATE
0x02 - IPMI_BRIDGE_GET_ICMB_ADDRESS
0x03 - IPMI_BRIDGE_SET_ICMB_ADDRESS
0x04 - IPMI_BRIDGE_SET_PROXY_ADDRESS
0x05 - IPMI_BRIDGE_GET_BRIDGE_STATISTICS
0x06 - IPMI_BRIDGE_GET_ICMB_CAPABILITIES
0x08 - IPMI_BRIDGE_CLEAR_STATISTICS
0x09 - IPMI_BRIDGE_GET_PROXY_ADDRESS
0x0A - IPMI_BRIDGE_GET_ICMB_CONNECTOR_INFO
0x0B - IPMI_BRIDGE_GET_ICMB_CONNECTION_ID
0x0C - IPMI_BRIDGE_SEND_ICMB_CONNECTION_ID
0x10 - IPMI_BRIDGE_PREPARE_FOR_DISCOVERY
0x11 - IPMI_BRIDGE_GET_ADDRESSES
0x12 - IPMI_BRIDGE_SET_DISCOVERED
0x13 - IPMI_BRIDGE_GET_CHASSIS_DEVICEID
0x14 - IPMI_BRIDGE_SET_CHASSIS_DEVICEID
0x20 - IPMI_BRIDGE_REQUEST
0x21 - IPMI_BRIDGE_MESSAGE
0x30 - IPMI_BRIDGE_GET_EVENT_COUNT
0x31 - IPMI_BRIDGE_SET_EVENT_DESTINATION
0x32 - IPMI_BRIDGE_SET_EVENT_RECEPTION_STATE
0x33 - IPMI_BRIDGE_SEND_ICMB_EVENT_MESSAGE

但是它们并没有在IPMI规范中,而是在ICMB规范中。

NetFn 0x04 - IPMI_NETFN_SENSOR_EVENT

对应头文件edk2\MdePkg\Include\IndustryStandard\IpmiNetFnSensorEvent.h,但是其中只有一个,其它存在空白的是没有在代码中出现的:

Cmd说明O/M
0x00Set Event Receiver必需
0x01Get Event Receiver必需
0x02 - IPMI_SENSOR_PLATFORM_EVENT_MESSAGEPlatform Event (aka Event Message)必需
0x10Get PEF Capabilities必需
0x11Arm PEF Postpone Timer必需
0x12Set PEF Configuration Parameters必需
0x13Get PEF Configuration Parameters必需
0x14Set Last Processed Event ID必需
0x15Get Last Processed Event ID必需
0x16Alert Immediate可选
0x17PET Acknowledge可选
0x20Get Device SDR Info可选
0x21Get Deivce SDR可选
0x22Reserve Device SDR Repository可选
0x23Get Sensor Reading Factors可选
0x24Set Sensor Hysteresis可选
0x25Get Sensor Hysteresis可选
0x26Set Sensor Threshold可选
0x27Get Sensor Threshold可选
0x28Set Sensor Event Enable可选
0x29Get Sensor Event Enable可选
0x2ARe-arm Sensor Events可选
0x2BGet Sensor Event Status可选
0x2DGet Sensor Reading必需
0x2ESet Sensor Type可选
0x2FGet Sensor Type可选
0x30Set Sensor Reading And Event Status可选

NetFn 0x06 - IPMI_NETFN_APP

对应头文件edk2\MdePkg\Include\IndustryStandard\IpmiNetFnApp.h,部分存在空白的是没有在代码中出现的:

Cmd说明O/M
0x01 - IPMI_APP_GET_DEVICE_IDGet Device ID必需
0x02 - IPMI_APP_COLD_RESETCold Rest可选
0x03 - IPMI_APP_WARM_RESETWarm Rest可选
0x04 - IPMI_APP_GET_SELFTEST_RESULTSGet Selft Test Results必需
0x05 - IPMI_APP_MANUFACTURING_TEST_ONManufacturing Test On可选
0x06 - IPMI_APP_SET_ACPI_POWERSTATESet ACPI Power State可选
0x07 - IPMI_APP_GET_ACPI_POWERSTATEGet ACPI Power State可选
0x08 - IPMI_APP_GET_DEVICE_GUIDGet Device GUID可选
0x09Get NetFun Support可选
0x0AGet Command Support可选
0x0BGet Command Sub-function Support可选
0x0CGet Configurable Commands可选
0x0DGet Configurable Command Sub-functions可选
0x22 - IPMI_APP_RESET_WATCHDOG_TIMERReset Watchdog Timer必需
0x24 - IPMI_APP_SET_WATCHDOG_TIMERSet Watchdog Timer必需
0x25 - IPMI_APP_GET_WATCHDOG_TIMERGet Watchdog Timer必需
0x2E - IPMI_APP_SET_BMC_GLOBAL_ENABLESSet BMC Global Enables必需
0x2F - IPMI_APP_GET_BMC_GLOBAL_ENABLESGet BMC Global Enables必需
0x30 - IPMI_APP_CLEAR_MESSAGE_FLAGSClear Message Flags必需
0x31 - IPMI_APP_GET_MESSAGE_FLAGSGet Message Flags必需
0x32 - IPMI_APP_ENABLE_MESSAGE_CHANNEL_RECEIVEEnable Message Channel Receive可选
0x33 - IPMI_APP_GET_MESSAGEGet Message必需
0x34 - IPMI_APP_SEND_MESSAGESend Message必需
0x35 - IPMI_APP_READ_EVENT_MSG_BUFFERRead Event Message Buffer可选
0x36 - IPMI_APP_GET_BT_INTERFACE_CAPABILITYGet BT Interface Capabilities必需
0x37 - IPMI_APP_GET_SYSTEM_GUIDGet System GUID可选
0x38 - IPMI_APP_GET_CHANNEL_AUTHENTICATION_CAPABILITIESGet Channel Authentication Capabilities可选
0x39 - IPMI_APP_GET_SESSION_CHALLENGEGet Session Challenge可选
0x3A - IPMI_APP_ACTIVATE_SESSIONActivate Session可选
0x3B - IPMI_APP_SET_SESSION_PRIVELEGE_LEVELSet Session Privilege Level可选
0x3C - IPMI_APP_CLOSE_SESSIONClose Session可选
0x3D - IPMI_APP_GET_SESSION_INFOGet Session Info可选
0x3F - IPMI_APP_GET_AUTHCODEGet AuthCode可选
0x40 - IPMI_APP_SET_CHANNEL_ACCESSSet Channel Access可选
0x41 - IPMI_APP_GET_CHANNEL_ACCESSGet Channel Access可选
0x42 - IPMI_APP_GET_CHANNEL_INFOGet Channel Info可选
0x43 - IPMI_APP_SET_USER_ACCESSSet User Access可选
0x44 - IPMI_APP_GET_USER_ACCESSGet User Access可选
0x45 - IPMI_APP_SET_USER_NAMESet User Name可选
0x46 - IPMI_APP_GET_USER_NAMEGet User Name可选
0x47 - IPMI_APP_SET_USER_PASSWORDSet User Password可选
0x48 - IPMI_APP_ACTIVATE_PAYLOADActivate Payload可选
0x49 - IPMI_APP_DEACTIVATE_PAYLOADDeactivate Payload可选
0x4A - IPMI_APP_GET_PAYLOAD_ACTIVATION_STATUSGet Payload Activation Status可选
0x4B - IPMI_APP_GET_PAYLOAD_INSTANCE_INFOGet Payload Instance Info可选
0x4C - IPMI_APP_SET_USER_PAYLOAD_ACCESSSet User Payload Access Command可选
0x4D - IPMI_APP_GET_USER_PAYLOAD_ACCESSGet User Payload Access Command可选
0x4E - IPMI_APP_GET_CHANNEL_PAYLOAD_SUPPORTGet Channel Payload Support Command可选
0x4F - IPMI_APP_GET_CHANNEL_PAYLOAD_VERSIONGet Channel Payload Version Command可选
0x50 - IPMI_APP_GET_CHANNEL_OEM_PAYLOAD_INFOGet Channel OEM Payload Info Command可选
0x52 - IPMI_APP_MASTER_WRITE_READMaster Write-Read必需
0x54 - IPMI_APP_GET_CHANNEL_CIPHER_SUITESGet Channel Cipher Suites可选
0x55 - IPMI_APP_SUSPEND_RESUME_PAYLOAD_ENCRYPTIONSuspend/Resume Payload Encryption Command可选
0x56 - IPMI_APP_SET_CHANNEL_SECURITY_KEYSSet Channel Security Keys可选
0x57 - IPMI_APP_GET_SYSTEM_INTERFACE_CAPABILITIESGet System Interface Capabilities可选
0x58Set System Info Parameters可选
0x59Get System Info Parameters可选
0x60Set Command Enables可选
0x61Get Command Enables可选
0x62Set Command Sub-function Enables可选
0x63Get Command Sub-function Enables可选
0x64Get OEM NetFn IANA Support可选

IPMI_APP_GET_DEVICE_ID还有一个广播版本Broadcast “Get Deivce ID”,它的Cmd也是0x01。

NetFn 0x08 - IPMI_NETFN_FIRMWARE

对应头文件edk2\MdePkg\Include\IndustryStandard\IpmiNetFnFirmware.h,但是以下的命令并没有在IPMI规范中找到:

Cmd
0x23 - IPMI_GET_BMC_EXECUTION_CONTEXT

NetFn 0x0A - IPMI_NETFN_STORAGE

对应头文件edk2\MdePkg\Include\IndustryStandard\IpmiNetFnStorage.h:

Cmd说明O/M
0x10 - IPMI_STORAGE_GET_FRU_INVENTORY_AREAINFOGet FRU Inventory Area Info必需
0x11 - IPMI_STORAGE_READ_FRU_DATARead FRU Data必需
0x12 - IPMI_STORAGE_WRITE_FRU_DATAWrite FRU Data必需
0x20 - IPMI_STORAGE_GET_SDR_REPOSITORY_INFOGet SDR Repository Info必需
0x21 - IPMI_STORAGE_GET_SDR_REPOSITORY_ALLOCATION_INFOGet SDR Pepository Allocation Info可选
0x22 - IPMI_STORAGE_RESERVE_SDR_REPOSITORYReserve SDR Repository必需
0x23 - IPMI_STORAGE_GET_SDRGet SDR必需
0x24 - IPMI_STORAGE_ADD_SDRAdd SDR必需
0x25 - IPMI_STORAGE_PARTIAL_ADD_SDRPartial Add SDR必需
0x26 - IPMI_STORAGE_DELETE_SDRDelete SDR可选
0x27 - IPMI_STORAGE_CLEAR_SDRClear SDR Repository必需
0x28 - IPMI_STORAGE_GET_SDR_REPOSITORY_TIMEGet SDR Repository Time可选
0x29 - IPMI_STORAGE_SET_SDR_REPOSITORY_TIMESet SDR Repository Time可选
0x2A - IPMI_STORAGE_ENTER_SDR_UPDATE_MODEEnter SDR Pepository Update Mode可选
0x2B - IPMI_STORAGE_EXIT_SDR_UPDATE_MODEExit SDR Repository Update Mode可选
0x2C - IPMI_STORAGE_RUN_INIT_AGENTRun Initialization Agent可选
0x40 - IPMI_STORAGE_GET_SEL_INFOGet SEL Info必需
0x41 - IPMI_STORAGE_GET_SEL_ALLOCATION_INFOGet SEL Allocation Info可选
0x42 - IPMI_STORAGE_RESERVE_SELReserve SEL可选
0x43 - IPMI_STORAGE_GET_SEL_ENTRYGet SEL Entry必需
0x44 - IPMI_STORAGE_ADD_SEL_ENTRYAdd SEL Entry必需
0x45 - IPMI_STORAGE_PARTIAL_ADD_SEL_ENTRYPartial Add SEL Entry必需
0x46 - IPMI_STORAGE_DELETE_SEL_ENTRYDelete SEL Entry可选
0x47 - IPMI_STORAGE_CLEAR_SELClear SEL必需
0x48 - IPMI_STORAGE_GET_SEL_TIMEGet SEL Time必需
0x49 - IPMI_STORAGE_SET_SEL_TIMESet SEL Time必需
0x5A - IPMI_STORAGE_GET_AUXILLARY_LOG_STATUSGet Auxiliary Log Status可选
0x5B - IPMI_STORAGE_SET_AUXILLARY_LOG_STATUSSet Auxiliary Log Status可选
0x5C - IPMI_STORAGE_GET_SEL_TIME_UTC_OFFSETGet SEL Timer UTC Offset可选
0x5D - IPMI_STORAGE_SET_SEL_TIME_UTC_OFFSETSet SEL Timer UTC Offset可选

NetFn 0x0C - IPMI_NETFN_TRANSPORT

对应头文件edk2\MdePkg\Include\IndustryStandard\IpmiNetFnTransport.h,部分存在空白的是没有在代码中出现的:

Cmd说明O/M
0x01 - IPMI_TRANSPORT_SET_LAN_CONFIG_PARAMETERSSet LAN Configuration Parameters必需
0x02 - IPMI_TRANSPORT_GET_LAN_CONFIG_PARAMETERSGet LAN Configuration Parameters必需
0x03 - IPMI_TRANSPORT_SUSPEND_BMC_ARPSSuspend BMC ARPs可选
0x04 - IPMI_TRANSPORT_GET_PACKET_STATISTICSGet IP/UDP/RMCP Statistics可选
0x10 - IPMI_TRANSPORT_SET_SERIAL_CONFIGURATIONSet Serial/Modem Configuration必需
0x11 - IPMI_TRANSPORT_GET_SERIAL_CONFIGURATIONGet Serial/Modem Configuration必需
0x12 - IPMI_TRANSPORT_SET_SERIAL_MUXSet Serial/Modem Mux可选
0x13 - IPMI_TRANSPORT_GET_TAP_RESPONSE_CODEGet TAP Response Codes可选
0x14 - IPMI_TRANSPORT_SET_PPP_UDP_PROXY_TXDATASet PPP UDP Proxy Transmit Data可选
0x15 - IPMI_TRANSPORT_GET_PPP_UDP_PROXY_TXDATAGet PPP UDP Proxy Transmit Data可选
0x16 - IPMI_TRANSPORT_SEND_PPP_UDP_PROXY_PACKETSend PPP UDP Proxy Packet可选
0x17 - IPMI_TRANSPORT_GET_PPP_UDP_PROXY_RXGet PPP UDP Proxy Receive Data可选
0x18 - IPMI_TRANSPORT_SERIAL_CONNECTION_ACTIVESerial/Modem Connection Active必需
0x19 - IPMI_TRANSPORT_CALLBACKCallback可选
0x1A - IPMI_TRANSPORT_SET_USER_CALLBACK_OPTIONSSet User Callback Options可选
0x1B - IPMI_TRANSPORT_GET_USER_CALLBACK_OPTIONSGet User Callback Options可选
0x1CSet Serial Routing Mux可选
0x20 - IPMI_TRANSPORT_SOL_ACTIVATINGSOL Activating可选
0x21 - IPMI_TRANSPORT_SET_SOL_CONFIG_PARAMSet SOL Configuration Parameters可选
0x22 - IPMI_TRANSPORT_GET_SOL_CONFIG_PARAMGet SOL Configuration Parameters可选
0x30Forwarded Command可选
0x31Set Forwarded Commands可选
0x32Get Forwarded Commands可选
0x33Enable Forwarded Commands可选

NetFn 0x2C - IPMI_NETFN_GROUP_EXT

对应头文件edk2\MdePkg\Include\IndustryStandard\IpmiNetFnGroupExtension.h,但是里面没有具体的内容,属于扩展用的,这其实也导致了额外的问题,因为不同的BIOS供应商提供的命令可能会有不同,导致维护困难。

相关文章:

【UEFI实战】BIOS与IPMI

KCS KCS全称是Keyboard Controller Style&#xff0c;关于这个名称不用过多的追究&#xff0c;只需要知道它是系统&#xff08;BIOS和OS&#xff09;和BMC通信的一种基本方式即可。本文将介绍BIOS下的KCS接口&#xff0c;包括接口使用方式和数据。内容参考自《ipmi-second-gen…...

90%的人都不算会网络安全,这才是真正的白帽子技术【红队】

我敢说&#xff0c;现在网上90%的文章都没有把网络安全该学的东西讲清楚。 为什么&#xff1f;因为全网更多的都是在讲如何去渗透和公鸡&#xff0c;却没有把网安最注重的防御讲明白。 老话说得好&#xff1a;“攻击&#xff0c;是为了更好的防御。”如果连初衷都忘了&#x…...

关于vuex的使用

1.首先安装vuex npm install vuex --save 这时如果直接安装vuex&#xff0c;不指定版本的话&#xff0c;就会直接安装最新的vuex的版本。所以会出现报错。 报错就安装这个 npm install --save vuex3 2.创建文件夹&#xff0c; 有的时候安装好会自动创建vuex的文件夹 &#xf…...

第53篇-某商城sign参数分析-webpack【2023-03-07】

声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、网站分析三、完整代码一、前言 今天再来试一个webpack的例子吧,网址: aHR0cHM6Ly9tLnlxYi5jb20vYmFuay9…...

探秘MySQL——排查与调优

文章目录一、问题排查一&#xff1a;SQL执行出错二、问题排查二&#xff1a;慢查询0.几个重要参数1.配置慢查询日志命令行配置&#xff08;重启失效&#xff09;修改配置文件&#xff08;永久生效&#xff09;2.查看慢查询日志3.问题排查1&#xff1a;Look_time耗时4.问题排查2…...

【9.数据页结构】

概述 InnoDB 的数据是按「数据页」为单位来读写的&#xff0c;也就是说&#xff0c;当需要读一条记录的时候&#xff0c;并不是将这个记录本身从磁盘读出来&#xff0c;而是以页为单位&#xff0c;将其整体读入内存。数据库的 I/O 操作的最小单位是页&#xff0c;InnoDB 数据页…...

演唱会总是抢不到票?教你用Python制作一个自动抢票脚本

人生苦短 我用python 这个大家应该都知道吧&#xff1f; 是中国综合类现场娱乐票务营销平台&#xff0c; 业务覆盖演唱会、 话剧、音乐剧、体育赛事等领域。 如何快速抢票&#xff1f; 那么&#xff0c; 今天带大家用Python来制作一个自动抢票的脚本小程序 本文源码python安…...

【系统开发】WebSocket + SpringBoot + Vue 搭建简易网页聊天室

文章目录一、数据库搭建二、后端搭建2.1 引入关键依赖2.2 WebSocket配置类2.3 配置跨域2.4 发送消息的控制类三、前端搭建3.1 自定义文件websocket.js3.2 main.js中全局引入websocket3.3 App.vue中声明websocket对象3.4 聊天室界面.vue3.5 最终效果一、数据库搭建 很简单的一个…...

Learning C++ No.14【STL No.4】

引言&#xff1a; 北京时间&#xff1a;2023/3/9/12:58&#xff0c;下午两点有课&#xff0c;现在先把引言给搞定&#xff0c;这样就能激励我更早的把这篇博客给写完了&#xff0c;万事开头难这句话还是很有道理的&#xff0c;刚好利用现在昏昏欲睡的时候&#xff0c;把这个没…...

高速PCB设计指南(八)

七、产品内部的电磁兼容性设计 1 印刷电路板设计中的电磁兼容性 1.1 印刷线路板中的公共阻抗耦合问题 数字地与模拟地分开&#xff0c;地线加宽。 1.2 印刷线路板的布局 ※对高速、中速和低速混用时&#xff0c;注意不同的布局区域。 ※对低模拟电路和数字逻辑要分离。…...

什么是腾讯云关系型数据库(MySQL/SQL Server/MariaDB/PostgreSQL详解)

什么是腾讯云关系型数据库&#xff1f;腾讯云关系型数据库提供 MySQL、SQL Server、MariaDB、PostgreSQL详细介绍。腾讯云关系型数据库让您在云中轻松部署、管理和扩展的关系型数据库&#xff0c;提供安全可靠、伸缩灵活的按需云数据库服务。腾讯云关系型数据库提供 MySQL、SQL…...

进程通信相关概念

一、概念 1.1 通信方式有哪些 管道&#xff1a;水管&#xff0c;男纸条放入水管&#xff0c;女看了拿走不回复 消息队列&#xff1a;大盒子&#xff0c;男放入纸条&#xff0c;女看了不拿走&#xff0c;男女都可放 共享内存&#xff1a;直接桌子&#xff0c;男放桌上&#…...

05.Java的运算符

1.运算符计算机的最基本的用途之一就是执行数学运算&#xff0c;比如&#xff1a;int a 10;int b 20;a b;a < b;上述 和 < 等就是运算符&#xff0c;即&#xff1a;对操作数进行操作时的符号&#xff0c;不同运算符操作的含义不同。作为一门计算机语言&#xff0c;Ja…...

轮转数组(力扣189)

轮转数组 题目描述&#xff1a; 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例1&#xff1a; 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7…...

主流的“对象转换工具”使用示例大全以及性能的对比

目录 前言 源码地址 代码示例 引入依赖 先定两个实体用于转换 定义一个接口让所有转换器都集成 Apache BeanUtils BeanCopier bean-mapping bean-mapping-asm Dozer 自己写get/set JMapper json2json MapStruct&#xff08;推荐&#xff09; ModelMapper OriK…...

分享10个不错的C语言开源项目

今天跟大家分享10个重量级的C语言开源项目&#xff0c;C语言确实经得住考验&#xff1a; Redis&#xff1a;Redis是一个开源的高性能的键值对数据库。它以C语言编写&#xff0c;具有极高的性能和可靠性。 Nginx&#xff1a;Nginx是一个高性能的HTTP和反向代理服务器&#xff0…...

【阅读笔记】JavaScript设计模式与开发实践2--闭包与单例、策略模式

目录闭包与高阶函数Function 扩展函数柯里化函数单例模式透明的单例模式惰性单例策略模式策略模式发展策略模式实现闭包与高阶函数 Array.prototype.sort 接受一个函数当作参数&#xff0c;用户可以自行在该函数内指定排序方式 // 由小到大排序 let res [1, 4, 2].sort((a, …...

设计模式(二十)----行为型模式之责任链模式

1、概述 在现实生活中&#xff0c;常常会出现这样的事例&#xff1a;一个请求有多个对象可以处理&#xff0c;但每个对象的处理条件或权限不同。例如&#xff0c;公司员工请假&#xff0c;可批假的领导有部门负责人、副总经理、总经理等&#xff0c;但每个领导能批准的天数不同…...

数据持久化层--冷热分离

业务场景 有一个系统的主要功能是这样的:它会对接客户的邮件服务器,自动收取发到几个特定客服邮箱的邮件,每收到一封客服邮件,就自动生成一个工单。之后系统就会根据一些规则将工单分派给不同的客服专员处理。 这家媒体集团客户两年多产生了近2000万的工单,工单的操作记…...

Ubuntu16.04系统 VSCode中python开发插件的安装

VSCode中python开发插件的安装 1. python python插件提供了代码分析&#xff0c;高亮&#xff0c;规范化等很多基本功能 2. Python for vscode 3. Python Preview 实时可视化你的代码结果。如果你Leedcode等题时&#xff0c;可以安装这个插件。能为VSCode切换各种主题皮肤…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...

鸿蒙HarmonyOS 5军旗小游戏实现指南

1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;采用DevEco Studio实现&#xff0c;包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...

PH热榜 | 2025-06-08

1. Thiings 标语&#xff1a;一套超过1900个免费AI生成的3D图标集合 介绍&#xff1a;Thiings是一个不断扩展的免费AI生成3D图标库&#xff0c;目前已有超过1900个图标。你可以按照主题浏览&#xff0c;生成自己的图标&#xff0c;或者下载整个图标集。所有图标都可以在个人或…...