【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命令介绍会进一步说明。
- LUN:Logical 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找到,下面是代码的大致说明:
- 等待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);
- 写入
KCS_WRITE_START
,并等待IBF=0:
KcsData = KCS_WRITE_START;IoWrite8 ((KcsIoBase + 1), KcsData);if ((Status = KcsCheckStatus (IpmiTimeoutPeriod, KcsWriteState, &Idle)) != EFI_SUCCESS) {return Status;}
- 开始写入数据,等待数据写入完成之后,最后写入
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]);}
- 开始接收数据:
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);}
- 结束数据接收,并将数据返回。
以上只是简单的介绍,还有一些诸如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_CAPABILITIES | Get Chassis Capabilities | 必需 |
0x01 - IPMI_CHASSIS_GET_STATUS | Get Chassis Status | 必需 |
0x02 - IPMI_CHASSIS_CONTROL | Chassis Control | 必需 |
0x03 - IPMI_CHASSIS_RESET | Chassis Reset | 可选 |
0x04 - IPMI_CHASSIS_IDENTIFY | Chassis Identify | 可选 |
0x05 - IPMI_CHASSIS_SET_CAPABILITIES | Set Chassis Capabilities | 可选 |
0x06 - IPMI_CHASSIS_SET_POWER_RESTORE_POLICY | Set Power Restore Policy | 可选 |
0x07 - IPMI_CHASSIS_GET_SYSTEM_RESTART_CAUSE | Get System Restart Cause | 可选 |
0x08 - IPMI_CHASSIS_SET_SYSTEM_BOOT_OPTIONS | Set System Boot Options | 可选 |
0x09 - IPMI_CHASSIS_GET_SYSTEM_BOOT_OPTIONS | Get System Boot Options | 可选 |
0x0A - IPMI_CHASSIS_SET_FRONT_PANEL_BUTTON_ENABLES | Set Front Panel Enables | 可选 |
0x0B - IPMI_CHASSIS_SET_POWER_CYCLE_INTERVALS | Set Power Cycle Interval | 可选 |
0x0F - IPMI_CHASSIS_GET_POH_COUNTER | Get 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 |
---|---|---|
0x00 | Set Event Receiver | 必需 |
0x01 | Get Event Receiver | 必需 |
0x02 - IPMI_SENSOR_PLATFORM_EVENT_MESSAGE | Platform Event (aka Event Message) | 必需 |
0x10 | Get PEF Capabilities | 必需 |
0x11 | Arm PEF Postpone Timer | 必需 |
0x12 | Set PEF Configuration Parameters | 必需 |
0x13 | Get PEF Configuration Parameters | 必需 |
0x14 | Set Last Processed Event ID | 必需 |
0x15 | Get Last Processed Event ID | 必需 |
0x16 | Alert Immediate | 可选 |
0x17 | PET Acknowledge | 可选 |
0x20 | Get Device SDR Info | 可选 |
0x21 | Get Deivce SDR | 可选 |
0x22 | Reserve Device SDR Repository | 可选 |
0x23 | Get Sensor Reading Factors | 可选 |
0x24 | Set Sensor Hysteresis | 可选 |
0x25 | Get Sensor Hysteresis | 可选 |
0x26 | Set Sensor Threshold | 可选 |
0x27 | Get Sensor Threshold | 可选 |
0x28 | Set Sensor Event Enable | 可选 |
0x29 | Get Sensor Event Enable | 可选 |
0x2A | Re-arm Sensor Events | 可选 |
0x2B | Get Sensor Event Status | 可选 |
0x2D | Get Sensor Reading | 必需 |
0x2E | Set Sensor Type | 可选 |
0x2F | Get Sensor Type | 可选 |
0x30 | Set Sensor Reading And Event Status | 可选 |
NetFn 0x06 - IPMI_NETFN_APP
对应头文件edk2\MdePkg\Include\IndustryStandard\IpmiNetFnApp.h,部分存在空白的是没有在代码中出现的:
Cmd | 说明 | O/M |
---|---|---|
0x01 - IPMI_APP_GET_DEVICE_ID | Get Device ID | 必需 |
0x02 - IPMI_APP_COLD_RESET | Cold Rest | 可选 |
0x03 - IPMI_APP_WARM_RESET | Warm Rest | 可选 |
0x04 - IPMI_APP_GET_SELFTEST_RESULTS | Get Selft Test Results | 必需 |
0x05 - IPMI_APP_MANUFACTURING_TEST_ON | Manufacturing Test On | 可选 |
0x06 - IPMI_APP_SET_ACPI_POWERSTATE | Set ACPI Power State | 可选 |
0x07 - IPMI_APP_GET_ACPI_POWERSTATE | Get ACPI Power State | 可选 |
0x08 - IPMI_APP_GET_DEVICE_GUID | Get Device GUID | 可选 |
0x09 | Get NetFun Support | 可选 |
0x0A | Get Command Support | 可选 |
0x0B | Get Command Sub-function Support | 可选 |
0x0C | Get Configurable Commands | 可选 |
0x0D | Get Configurable Command Sub-functions | 可选 |
0x22 - IPMI_APP_RESET_WATCHDOG_TIMER | Reset Watchdog Timer | 必需 |
0x24 - IPMI_APP_SET_WATCHDOG_TIMER | Set Watchdog Timer | 必需 |
0x25 - IPMI_APP_GET_WATCHDOG_TIMER | Get Watchdog Timer | 必需 |
0x2E - IPMI_APP_SET_BMC_GLOBAL_ENABLES | Set BMC Global Enables | 必需 |
0x2F - IPMI_APP_GET_BMC_GLOBAL_ENABLES | Get BMC Global Enables | 必需 |
0x30 - IPMI_APP_CLEAR_MESSAGE_FLAGS | Clear Message Flags | 必需 |
0x31 - IPMI_APP_GET_MESSAGE_FLAGS | Get Message Flags | 必需 |
0x32 - IPMI_APP_ENABLE_MESSAGE_CHANNEL_RECEIVE | Enable Message Channel Receive | 可选 |
0x33 - IPMI_APP_GET_MESSAGE | Get Message | 必需 |
0x34 - IPMI_APP_SEND_MESSAGE | Send Message | 必需 |
0x35 - IPMI_APP_READ_EVENT_MSG_BUFFER | Read Event Message Buffer | 可选 |
0x36 - IPMI_APP_GET_BT_INTERFACE_CAPABILITY | Get BT Interface Capabilities | 必需 |
0x37 - IPMI_APP_GET_SYSTEM_GUID | Get System GUID | 可选 |
0x38 - IPMI_APP_GET_CHANNEL_AUTHENTICATION_CAPABILITIES | Get Channel Authentication Capabilities | 可选 |
0x39 - IPMI_APP_GET_SESSION_CHALLENGE | Get Session Challenge | 可选 |
0x3A - IPMI_APP_ACTIVATE_SESSION | Activate Session | 可选 |
0x3B - IPMI_APP_SET_SESSION_PRIVELEGE_LEVEL | Set Session Privilege Level | 可选 |
0x3C - IPMI_APP_CLOSE_SESSION | Close Session | 可选 |
0x3D - IPMI_APP_GET_SESSION_INFO | Get Session Info | 可选 |
0x3F - IPMI_APP_GET_AUTHCODE | Get AuthCode | 可选 |
0x40 - IPMI_APP_SET_CHANNEL_ACCESS | Set Channel Access | 可选 |
0x41 - IPMI_APP_GET_CHANNEL_ACCESS | Get Channel Access | 可选 |
0x42 - IPMI_APP_GET_CHANNEL_INFO | Get Channel Info | 可选 |
0x43 - IPMI_APP_SET_USER_ACCESS | Set User Access | 可选 |
0x44 - IPMI_APP_GET_USER_ACCESS | Get User Access | 可选 |
0x45 - IPMI_APP_SET_USER_NAME | Set User Name | 可选 |
0x46 - IPMI_APP_GET_USER_NAME | Get User Name | 可选 |
0x47 - IPMI_APP_SET_USER_PASSWORD | Set User Password | 可选 |
0x48 - IPMI_APP_ACTIVATE_PAYLOAD | Activate Payload | 可选 |
0x49 - IPMI_APP_DEACTIVATE_PAYLOAD | Deactivate Payload | 可选 |
0x4A - IPMI_APP_GET_PAYLOAD_ACTIVATION_STATUS | Get Payload Activation Status | 可选 |
0x4B - IPMI_APP_GET_PAYLOAD_INSTANCE_INFO | Get Payload Instance Info | 可选 |
0x4C - IPMI_APP_SET_USER_PAYLOAD_ACCESS | Set User Payload Access Command | 可选 |
0x4D - IPMI_APP_GET_USER_PAYLOAD_ACCESS | Get User Payload Access Command | 可选 |
0x4E - IPMI_APP_GET_CHANNEL_PAYLOAD_SUPPORT | Get Channel Payload Support Command | 可选 |
0x4F - IPMI_APP_GET_CHANNEL_PAYLOAD_VERSION | Get Channel Payload Version Command | 可选 |
0x50 - IPMI_APP_GET_CHANNEL_OEM_PAYLOAD_INFO | Get Channel OEM Payload Info Command | 可选 |
0x52 - IPMI_APP_MASTER_WRITE_READ | Master Write-Read | 必需 |
0x54 - IPMI_APP_GET_CHANNEL_CIPHER_SUITES | Get Channel Cipher Suites | 可选 |
0x55 - IPMI_APP_SUSPEND_RESUME_PAYLOAD_ENCRYPTION | Suspend/Resume Payload Encryption Command | 可选 |
0x56 - IPMI_APP_SET_CHANNEL_SECURITY_KEYS | Set Channel Security Keys | 可选 |
0x57 - IPMI_APP_GET_SYSTEM_INTERFACE_CAPABILITIES | Get System Interface Capabilities | 可选 |
0x58 | Set System Info Parameters | 可选 |
0x59 | Get System Info Parameters | 可选 |
0x60 | Set Command Enables | 可选 |
0x61 | Get Command Enables | 可选 |
0x62 | Set Command Sub-function Enables | 可选 |
0x63 | Get Command Sub-function Enables | 可选 |
0x64 | Get 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_AREAINFO | Get FRU Inventory Area Info | 必需 |
0x11 - IPMI_STORAGE_READ_FRU_DATA | Read FRU Data | 必需 |
0x12 - IPMI_STORAGE_WRITE_FRU_DATA | Write FRU Data | 必需 |
0x20 - IPMI_STORAGE_GET_SDR_REPOSITORY_INFO | Get SDR Repository Info | 必需 |
0x21 - IPMI_STORAGE_GET_SDR_REPOSITORY_ALLOCATION_INFO | Get SDR Pepository Allocation Info | 可选 |
0x22 - IPMI_STORAGE_RESERVE_SDR_REPOSITORY | Reserve SDR Repository | 必需 |
0x23 - IPMI_STORAGE_GET_SDR | Get SDR | 必需 |
0x24 - IPMI_STORAGE_ADD_SDR | Add SDR | 必需 |
0x25 - IPMI_STORAGE_PARTIAL_ADD_SDR | Partial Add SDR | 必需 |
0x26 - IPMI_STORAGE_DELETE_SDR | Delete SDR | 可选 |
0x27 - IPMI_STORAGE_CLEAR_SDR | Clear SDR Repository | 必需 |
0x28 - IPMI_STORAGE_GET_SDR_REPOSITORY_TIME | Get SDR Repository Time | 可选 |
0x29 - IPMI_STORAGE_SET_SDR_REPOSITORY_TIME | Set SDR Repository Time | 可选 |
0x2A - IPMI_STORAGE_ENTER_SDR_UPDATE_MODE | Enter SDR Pepository Update Mode | 可选 |
0x2B - IPMI_STORAGE_EXIT_SDR_UPDATE_MODE | Exit SDR Repository Update Mode | 可选 |
0x2C - IPMI_STORAGE_RUN_INIT_AGENT | Run Initialization Agent | 可选 |
0x40 - IPMI_STORAGE_GET_SEL_INFO | Get SEL Info | 必需 |
0x41 - IPMI_STORAGE_GET_SEL_ALLOCATION_INFO | Get SEL Allocation Info | 可选 |
0x42 - IPMI_STORAGE_RESERVE_SEL | Reserve SEL | 可选 |
0x43 - IPMI_STORAGE_GET_SEL_ENTRY | Get SEL Entry | 必需 |
0x44 - IPMI_STORAGE_ADD_SEL_ENTRY | Add SEL Entry | 必需 |
0x45 - IPMI_STORAGE_PARTIAL_ADD_SEL_ENTRY | Partial Add SEL Entry | 必需 |
0x46 - IPMI_STORAGE_DELETE_SEL_ENTRY | Delete SEL Entry | 可选 |
0x47 - IPMI_STORAGE_CLEAR_SEL | Clear SEL | 必需 |
0x48 - IPMI_STORAGE_GET_SEL_TIME | Get SEL Time | 必需 |
0x49 - IPMI_STORAGE_SET_SEL_TIME | Set SEL Time | 必需 |
0x5A - IPMI_STORAGE_GET_AUXILLARY_LOG_STATUS | Get Auxiliary Log Status | 可选 |
0x5B - IPMI_STORAGE_SET_AUXILLARY_LOG_STATUS | Set Auxiliary Log Status | 可选 |
0x5C - IPMI_STORAGE_GET_SEL_TIME_UTC_OFFSET | Get SEL Timer UTC Offset | 可选 |
0x5D - IPMI_STORAGE_SET_SEL_TIME_UTC_OFFSET | Set SEL Timer UTC Offset | 可选 |
NetFn 0x0C - IPMI_NETFN_TRANSPORT
对应头文件edk2\MdePkg\Include\IndustryStandard\IpmiNetFnTransport.h,部分存在空白的是没有在代码中出现的:
Cmd | 说明 | O/M |
---|---|---|
0x01 - IPMI_TRANSPORT_SET_LAN_CONFIG_PARAMETERS | Set LAN Configuration Parameters | 必需 |
0x02 - IPMI_TRANSPORT_GET_LAN_CONFIG_PARAMETERS | Get LAN Configuration Parameters | 必需 |
0x03 - IPMI_TRANSPORT_SUSPEND_BMC_ARPS | Suspend BMC ARPs | 可选 |
0x04 - IPMI_TRANSPORT_GET_PACKET_STATISTICS | Get IP/UDP/RMCP Statistics | 可选 |
0x10 - IPMI_TRANSPORT_SET_SERIAL_CONFIGURATION | Set Serial/Modem Configuration | 必需 |
0x11 - IPMI_TRANSPORT_GET_SERIAL_CONFIGURATION | Get Serial/Modem Configuration | 必需 |
0x12 - IPMI_TRANSPORT_SET_SERIAL_MUX | Set Serial/Modem Mux | 可选 |
0x13 - IPMI_TRANSPORT_GET_TAP_RESPONSE_CODE | Get TAP Response Codes | 可选 |
0x14 - IPMI_TRANSPORT_SET_PPP_UDP_PROXY_TXDATA | Set PPP UDP Proxy Transmit Data | 可选 |
0x15 - IPMI_TRANSPORT_GET_PPP_UDP_PROXY_TXDATA | Get PPP UDP Proxy Transmit Data | 可选 |
0x16 - IPMI_TRANSPORT_SEND_PPP_UDP_PROXY_PACKET | Send PPP UDP Proxy Packet | 可选 |
0x17 - IPMI_TRANSPORT_GET_PPP_UDP_PROXY_RX | Get PPP UDP Proxy Receive Data | 可选 |
0x18 - IPMI_TRANSPORT_SERIAL_CONNECTION_ACTIVE | Serial/Modem Connection Active | 必需 |
0x19 - IPMI_TRANSPORT_CALLBACK | Callback | 可选 |
0x1A - IPMI_TRANSPORT_SET_USER_CALLBACK_OPTIONS | Set User Callback Options | 可选 |
0x1B - IPMI_TRANSPORT_GET_USER_CALLBACK_OPTIONS | Get User Callback Options | 可选 |
0x1C | Set Serial Routing Mux | 可选 |
0x20 - IPMI_TRANSPORT_SOL_ACTIVATING | SOL Activating | 可选 |
0x21 - IPMI_TRANSPORT_SET_SOL_CONFIG_PARAM | Set SOL Configuration Parameters | 可选 |
0x22 - IPMI_TRANSPORT_GET_SOL_CONFIG_PARAM | Get SOL Configuration Parameters | 可选 |
0x30 | Forwarded Command | 可选 |
0x31 | Set Forwarded Commands | 可选 |
0x32 | Get Forwarded Commands | 可选 |
0x33 | Enable Forwarded Commands | 可选 |
NetFn 0x2C - IPMI_NETFN_GROUP_EXT
对应头文件edk2\MdePkg\Include\IndustryStandard\IpmiNetFnGroupExtension.h,但是里面没有具体的内容,属于扩展用的,这其实也导致了额外的问题,因为不同的BIOS供应商提供的命令可能会有不同,导致维护困难。
相关文章:
【UEFI实战】BIOS与IPMI
KCS KCS全称是Keyboard Controller Style,关于这个名称不用过多的追究,只需要知道它是系统(BIOS和OS)和BMC通信的一种基本方式即可。本文将介绍BIOS下的KCS接口,包括接口使用方式和数据。内容参考自《ipmi-second-gen…...
90%的人都不算会网络安全,这才是真正的白帽子技术【红队】
我敢说,现在网上90%的文章都没有把网络安全该学的东西讲清楚。 为什么?因为全网更多的都是在讲如何去渗透和公鸡,却没有把网安最注重的防御讲明白。 老话说得好:“攻击,是为了更好的防御。”如果连初衷都忘了&#x…...
关于vuex的使用
1.首先安装vuex npm install vuex --save 这时如果直接安装vuex,不指定版本的话,就会直接安装最新的vuex的版本。所以会出现报错。 报错就安装这个 npm install --save vuex3 2.创建文件夹, 有的时候安装好会自动创建vuex的文件夹 …...
第53篇-某商城sign参数分析-webpack【2023-03-07】
声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、网站分析三、完整代码一、前言 今天再来试一个webpack的例子吧,网址: aHR0cHM6Ly9tLnlxYi5jb20vYmFuay9…...
探秘MySQL——排查与调优
文章目录一、问题排查一:SQL执行出错二、问题排查二:慢查询0.几个重要参数1.配置慢查询日志命令行配置(重启失效)修改配置文件(永久生效)2.查看慢查询日志3.问题排查1:Look_time耗时4.问题排查2…...
【9.数据页结构】
概述 InnoDB 的数据是按「数据页」为单位来读写的,也就是说,当需要读一条记录的时候,并不是将这个记录本身从磁盘读出来,而是以页为单位,将其整体读入内存。数据库的 I/O 操作的最小单位是页,InnoDB 数据页…...
演唱会总是抢不到票?教你用Python制作一个自动抢票脚本
人生苦短 我用python 这个大家应该都知道吧? 是中国综合类现场娱乐票务营销平台, 业务覆盖演唱会、 话剧、音乐剧、体育赛事等领域。 如何快速抢票? 那么, 今天带大家用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】
引言: 北京时间:2023/3/9/12:58,下午两点有课,现在先把引言给搞定,这样就能激励我更早的把这篇博客给写完了,万事开头难这句话还是很有道理的,刚好利用现在昏昏欲睡的时候,把这个没…...
高速PCB设计指南(八)
七、产品内部的电磁兼容性设计 1 印刷电路板设计中的电磁兼容性 1.1 印刷线路板中的公共阻抗耦合问题 数字地与模拟地分开,地线加宽。 1.2 印刷线路板的布局 ※对高速、中速和低速混用时,注意不同的布局区域。 ※对低模拟电路和数字逻辑要分离。…...
什么是腾讯云关系型数据库(MySQL/SQL Server/MariaDB/PostgreSQL详解)
什么是腾讯云关系型数据库?腾讯云关系型数据库提供 MySQL、SQL Server、MariaDB、PostgreSQL详细介绍。腾讯云关系型数据库让您在云中轻松部署、管理和扩展的关系型数据库,提供安全可靠、伸缩灵活的按需云数据库服务。腾讯云关系型数据库提供 MySQL、SQL…...
进程通信相关概念
一、概念 1.1 通信方式有哪些 管道:水管,男纸条放入水管,女看了拿走不回复 消息队列:大盒子,男放入纸条,女看了不拿走,男女都可放 共享内存:直接桌子,男放桌上&#…...
05.Java的运算符
1.运算符计算机的最基本的用途之一就是执行数学运算,比如:int a 10;int b 20;a b;a < b;上述 和 < 等就是运算符,即:对操作数进行操作时的符号,不同运算符操作的含义不同。作为一门计算机语言,Ja…...
轮转数组(力扣189)
轮转数组 题目描述: 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例1: 输入: 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(推荐) ModelMapper OriK…...
分享10个不错的C语言开源项目
今天跟大家分享10个重量级的C语言开源项目,C语言确实经得住考验: Redis:Redis是一个开源的高性能的键值对数据库。它以C语言编写,具有极高的性能和可靠性。 Nginx:Nginx是一个高性能的HTTP和反向代理服务器࿰…...
【阅读笔记】JavaScript设计模式与开发实践2--闭包与单例、策略模式
目录闭包与高阶函数Function 扩展函数柯里化函数单例模式透明的单例模式惰性单例策略模式策略模式发展策略模式实现闭包与高阶函数 Array.prototype.sort 接受一个函数当作参数,用户可以自行在该函数内指定排序方式 // 由小到大排序 let res [1, 4, 2].sort((a, …...
设计模式(二十)----行为型模式之责任链模式
1、概述 在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。例如,公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同…...
数据持久化层--冷热分离
业务场景 有一个系统的主要功能是这样的:它会对接客户的邮件服务器,自动收取发到几个特定客服邮箱的邮件,每收到一封客服邮件,就自动生成一个工单。之后系统就会根据一些规则将工单分派给不同的客服专员处理。 这家媒体集团客户两年多产生了近2000万的工单,工单的操作记…...
Ubuntu16.04系统 VSCode中python开发插件的安装
VSCode中python开发插件的安装 1. python python插件提供了代码分析,高亮,规范化等很多基本功能 2. Python for vscode 3. Python Preview 实时可视化你的代码结果。如果你Leedcode等题时,可以安装这个插件。能为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、问题来了: 所有用户都可以采用该命令吗?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. 俄罗斯套娃信封问题 ★★★ 🌟 每日一练刷题专栏 C/C 每日一练 专栏 Python 每日一练 专栏 1. 提示用户输入的简单菜单 如果用户选择菜单选项1,提示用户输入1到10之间的整数&a…...
人生又有几个四年
机缘 不知不觉,已经来 csdn 创作四周年啦~ 我是在刚工作不到一年的时候接触 csdn 的,当时在学习 node,对 node 的文件相关的几个 api 总是搞混,本来还想着在传统的纸质笔记本上记一下,但是想想我大学记了好久的笔记本…...
第九章:Java集合
第九章:Java集合 9.1:Java集合框架概述 数组、集合都是对多个数据进行存储(内存层面,不涉及持久化)操作的结构,简称Java容器。 数组存储多个数据方面的特点 一旦初始化以后,其长度就确定了。数组一旦定义好ÿ…...
嵌入式学习笔记——STM32的USART通信概述
文章目录前言常用通信协议分类及其特征介绍通信协议通信协议分类1.同步异步通信2.全双工/半双工/单工3.现场总线/板级总线4. 串行/并行通信5. 有线通信、无线通信STM32通信协议的配置方式使用通信协议控制器实现使用IO口模拟的方式实现STM32串口通信概述什么是串口通信STM32F40…...
MySQL性能优化
MySQL性能调优 存储数据类型优化 尽量避免使用 NULL尽量使用可以的最小数据类型。但也要确保没有低估需要存储的范围整型比字符串操作代价更低使用 MySQL 内建的数据类型(比如date、time、datetime),比用字符串更快 基本数据类型 数字 整数…...
C语言/动态通讯录
本文使用了malloc、realloc、calloc等和内存开辟有关的函数。 文章目录 前言 二、头文件 三、主界面 四、通讯录功能函数 1.全代码 2.增加联系人 3.删除联系人 4.查找联系人 5.修改联系人 6.展示联系人 7.清空联系人 8.退出通讯录 总结 前言 为了使用通讯录时,可以…...
我用Compose做了一个地图轮子OmniMap
一、前言 半年前,我发布过一篇介绍:Compose里面如何使用地图,比如高德地图 的文章,原本是没有想造什么轮子的✍️ 闲来无事,有一天看到了评论区留言让我把源码地址分享出来,我感觉我太懒了,后来…...
STM32之SPI
SPISPI介绍SPI是串行外设接口(Serial Peripherallnterface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便…...
湘潭外包网络推广公司/seo推广是什么意思
多线程 当我们写的爬虫是单线程的时候,一旦到一个地方卡的不动了,那就永远的等下去吧,我们可以使用多线程来改变这个问题。 爬虫使用多线程来处理网络请求,使用线程来处理URL队列中的url,然后将url返回的结果保存再另…...
网站logo在哪里/seo超级外链
GridFS的原理是将大文件分割为多个比较大的块,将每个块作为独立的文档进行存储。(1)GridFS中的块会被存贮到专用的集合中,默认为fs.chunks;(2)除了将文件的每一个块单独存储外,还需要将每个文件…...
中交路桥建设网站/腾讯朋友圈广告怎么投放
分支预测 在stackoverflow上有一个非常有名的问题: 为什么处理有序数组要比非有序数组快,可见分支预测对代码运行效率有非常大的影响。 现代CPU都支持分支预测(branch prediction)和指令流水线(instruction pipeline),这两个结合可以极大提高…...
wordpress分菜单/职业技能培训有哪些
这个帖子里的方法有点过时了,不推荐继续使用。有的时候会碰到这么一种情况,带着电脑和手机出去蹭网,无奈只有一个账号,手机上了电脑就没得用了,电脑用了手机就上不了网。如果能用电脑连接 Wifi 然后再开热点给手机用该…...
wordpress斜杠自动成-/seo网站课程
一、场景 相信很多phper都会遇到这样的场景,操作数据库一次性请求返回结果集过大,而又需要对结果集进行处理从而导致PHP内存开销过大。当然如果你使用过ThinkPHP和Laravel框架(其他框架或许也有类似方法,未使用过尚不清ÿ…...
如何在自己电脑上做网站服务器/数据网站
2.1 问题 创建randpass.py脚本,要求如下: 编写一个能生成8位随机密码的程序 使用random的choice函数随机取出字符 改进程序,用户可以自己决定生成多少位的密码 2.2 方案 导入random模块,通过random静态对象调用choice()方法&…...