当前位置: 首页 > 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切换各种主题皮肤…...

buuctf-pwn write-ups (12)

文章目录buu093-wustctf2020_easyfastbuu094-ciscn_2019_es_1buu095-wdb2018_guessbuu096-gyctf_2020_some_thing_excetingbuu097-axb_2019_heapbuu098-oneshot_tjctf_2016buu099-护网杯_2018_gettingstartbuu100-wustctf2020_number_gamebuu101-zctf2016_note2buu093-wustctf2…...

Linux- 系统随你玩之--网络上的黑客帝国

文章目录1、前言2、TCPDump介绍2.1、问题来了&#xff1a; 所有用户都可以采用该命令吗&#xff1f;2.2、抓包原理2.3、特点2.3.1、参数化支持2.2.2、 TCP功能3、 服务器安装Tcpdump3.1、安装3.2、检查安装是否正常。4、tcpdump 命令4.1、常用功能选项4.2、输出内容5、实操5.1、…...

Python每日一练(20230312)

目录 1. 提示用户输入的简单菜单 ★ 2. 字母异位词分组 ★★ 3. 俄罗斯套娃信封问题 ★★★ &#x1f31f; 每日一练刷题专栏 C/C 每日一练 ​专栏 Python 每日一练 专栏 1. 提示用户输入的简单菜单 如果用户选择菜单选项1&#xff0c;提示用户输入1到10之间的整数&a…...

人生又有几个四年

机缘 不知不觉&#xff0c;已经来 csdn 创作四周年啦~ 我是在刚工作不到一年的时候接触 csdn 的&#xff0c;当时在学习 node&#xff0c;对 node 的文件相关的几个 api 总是搞混&#xff0c;本来还想着在传统的纸质笔记本上记一下&#xff0c;但是想想我大学记了好久的笔记本…...

第九章:Java集合

第九章&#xff1a;Java集合 9.1&#xff1a;Java集合框架概述 数组、集合都是对多个数据进行存储(内存层面&#xff0c;不涉及持久化)操作的结构&#xff0c;简称Java容器。 数组存储多个数据方面的特点 一旦初始化以后&#xff0c;其长度就确定了。数组一旦定义好&#xff…...

嵌入式学习笔记——STM32的USART通信概述

文章目录前言常用通信协议分类及其特征介绍通信协议通信协议分类1.同步异步通信2.全双工/半双工/单工3.现场总线/板级总线4. 串行/并行通信5. 有线通信、无线通信STM32通信协议的配置方式使用通信协议控制器实现使用IO口模拟的方式实现STM32串口通信概述什么是串口通信STM32F40…...

MySQL性能优化

MySQL性能调优 存储数据类型优化 尽量避免使用 NULL尽量使用可以的最小数据类型。但也要确保没有低估需要存储的范围整型比字符串操作代价更低使用 MySQL 内建的数据类型&#xff08;比如date、time、datetime&#xff09;&#xff0c;比用字符串更快 基本数据类型 数字 整数…...

C语言/动态通讯录

本文使用了malloc、realloc、calloc等和内存开辟有关的函数。 文章目录 前言 二、头文件 三、主界面 四、通讯录功能函数 1.全代码 2.增加联系人 3.删除联系人 4.查找联系人 5.修改联系人 6.展示联系人 7.清空联系人 8.退出通讯录 总结 前言 为了使用通讯录时&#xff0c;可以…...

我用Compose做了一个地图轮子OmniMap

一、前言 半年前&#xff0c;我发布过一篇介绍&#xff1a;Compose里面如何使用地图&#xff0c;比如高德地图 的文章&#xff0c;原本是没有想造什么轮子的✍️ 闲来无事&#xff0c;有一天看到了评论区留言让我把源码地址分享出来&#xff0c;我感觉我太懒了&#xff0c;后来…...

STM32之SPI

SPISPI介绍SPI是串行外设接口(Serial Peripherallnterface)的缩写&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚&#xff0c;同时为PCB的布局上节省空间&#xff0c;提供方便…...

湘潭外包网络推广公司/seo推广是什么意思

多线程 当我们写的爬虫是单线程的时候&#xff0c;一旦到一个地方卡的不动了&#xff0c;那就永远的等下去吧&#xff0c;我们可以使用多线程来改变这个问题。 爬虫使用多线程来处理网络请求&#xff0c;使用线程来处理URL队列中的url&#xff0c;然后将url返回的结果保存再另…...

网站logo在哪里/seo超级外链

GridFS的原理是将大文件分割为多个比较大的块&#xff0c;将每个块作为独立的文档进行存储。&#xff08;1&#xff09;GridFS中的块会被存贮到专用的集合中&#xff0c;默认为fs.chunks;&#xff08;2&#xff09;除了将文件的每一个块单独存储外&#xff0c;还需要将每个文件…...

中交路桥建设网站/腾讯朋友圈广告怎么投放

分支预测 在stackoverflow上有一个非常有名的问题&#xff1a; 为什么处理有序数组要比非有序数组快&#xff0c;可见分支预测对代码运行效率有非常大的影响。 现代CPU都支持分支预测(branch prediction)和指令流水线(instruction pipeline)&#xff0c;这两个结合可以极大提高…...

wordpress分菜单/职业技能培训有哪些

这个帖子里的方法有点过时了&#xff0c;不推荐继续使用。有的时候会碰到这么一种情况&#xff0c;带着电脑和手机出去蹭网&#xff0c;无奈只有一个账号&#xff0c;手机上了电脑就没得用了&#xff0c;电脑用了手机就上不了网。如果能用电脑连接 Wifi 然后再开热点给手机用该…...

wordpress斜杠自动成-/seo网站课程

一、场景 相信很多phper都会遇到这样的场景&#xff0c;操作数据库一次性请求返回结果集过大&#xff0c;而又需要对结果集进行处理从而导致PHP内存开销过大。当然如果你使用过ThinkPHP和Laravel框架&#xff08;其他框架或许也有类似方法&#xff0c;未使用过尚不清&#xff…...

如何在自己电脑上做网站服务器/数据网站

2.1 问题 创建randpass.py脚本&#xff0c;要求如下&#xff1a; 编写一个能生成8位随机密码的程序 使用random的choice函数随机取出字符 改进程序&#xff0c;用户可以自己决定生成多少位的密码 2.2 方案 导入random模块&#xff0c;通过random静态对象调用choice()方法&…...