#!/bin/bash
#set -x
arg_cnt=$#
script_name=$0
#Uncorrectable Error Status Register
uesta_bit_definitions=(
"[0] Undefined"
"[1-3] Reserved"
"[4] Data Link Protocol Error Status"
"[5] Surprise Down Error Status"
"[6-11] Reserved"
"[12] Poisoned TLP Received Status"
"[13] Flow Control Protocol Error Status"
"[14] Completion Timeout Status"
"[15] Completer Abort Status"
"[16] Unexpected Completion Status"
"[17] Receiver Overflow Status"
"[18] Malformed TLP Status"
"[19] ECRC Error Status"
"[20] Unsupported Request Error Status"
"[21] ACS Violation Status"
"[22] Uncorrectable Internal Error Status"
"[23] MC Blocked TLP Status"
"[24] AtomicOp Egress Blocked Status"
"[25] TLP Prefix Blocked Error Status"
"[26] Poisoned TLP Egress Blocked Status"
"[27-31] Reserved"
)
#Uncorrectable Error Mask Register
uemask_bit_definitions=(
"[0] Undefined"
"[1-3] Reserved"
"[4] Data Link Protocol Error Mask"
"[5] Surprise Down Error Mask"
"[6-11] Reserved"
"[12] Poisoned TLP Received Mask"
"[13] Flow Control Protocol Error Mask"
"[14] Completion Timeout Mask"
"[15] Completer Abort Mask"
"[16] Unexpected Completion Mask"
"[17] Receiver Overflow Mask"
"[18] Malformed TLP Mask"
"[19] ECRC Error Mask"
"[20] Unsupported Request Error Mask"
"[21] ACS Violation Mask"
"[22] Uncorrectable Internal Error Mask"
"[23] MC Blocked TLP Mask"
"[24] AtomicOp Egress Blocked Mask"
"[25] TLP Prefix Blocked Error Mask"
"[26] Poisoned TLP Egress Blocked Mask"
"[27-31] Reserved"
)
#Uncorrectable Error Severity Register
uesev_bit_definitions=(
"[0] Undefined"
"[1-3] Reserved"
"[4] Data Link Protocol Error Severity"
"[5] Surprise Down Error Severity"
"[6-11] Reserved"
"[12] Poisoned TLP Received Severity"
"[13] Flow Control Protocol Error Severity"
"[14] Completion Timeout Severity"
"[15] Completer Abort Severity"
"[16] Unexpected Completion Severity"
"[17] Receiver Overflow Severity"
"[18] Malformed TLP Severity"
"[19] ECRC Error Severity"
"[20] Unsupported Request Error Severity"
"[21] ACS Violation Severity"
"[22] Uncorrectable Internal Error Severity"
"[23] MC Blocked TLP Severity"
"[24] AtomicOp Egress Blocked Severity"
"[25] TLP Prefix Blocked Error Severity"
"[26] Poisoned TLP Egress Blocked Severity"
"[27-31] Reserved"
)
#Correctable Error Status Register
cesta_bit_definitions=(
"[0] Receiver Error Status"
"[1-5] Reserved"
"[6] Bad TLP Status"
"[7] Bad DLLP Status"
"[8] REPLAY_NUM Rollover Status"
"[9-11] Reserved"
"[12] Replay Timer Timeout Status"
"[13] Advisory Non-Fatal Error Status"
"[14] Corrected Internal Error Status"
"[15] Header Log Overflow Status"
"[16-31] Reserved"
)
#Correctable Error Mask Register
cemask_bit_definitions=(
"[0] Receiver Error Mask"
"[1-5] Reserved"
"[6] Bad TLP Mask"
"[7] Bad DLLP Mask"
"[8] REPLAY_NUM Rollover Mask"
"[9-11] Reserved"
"[12] Replay Timer Timeout Mask"
"[13] Advisory Non-Fatal Error Mask"
"[14] Corrected Internal Error Mask"
"[15] Header Log Overflow Mask"
"[16-31] Reserved"
)
# 函数:将十进制数转换为十六进制
function hex() {
printf "%x" "$1"
}
# 函数:提取 bit 或 bit 范围的值
# 参数:
# $1: 寄存器值(十进制)
# $2: bit 定义(如 "[0]" 或 "[2-7]")
# 返回值:
# 输出 bit 或 bit 范围的值(16 进制)
extract_bit_value() {
local reg_value=$1
local bit_def=$2
if [[ $bit_def =~ \[([0-9]+)-([0-9]+)\] ]]; then
# 处理 bit 范围
local start=${BASH_REMATCH[1]}
local end=${BASH_REMATCH[2]}
local range_value=0
# 校验 start 和 end 是否合法
if [ $start -ge $end ]; then
echo "Error: Invalid bit range '$bit_def' (start >= end)."
return 1
fi
# 提取范围内的比特值并计算十六进制
for (( i=end; i>=start; i-- )); do
local bit_value=$(( (reg_value >> i) & 1 ))
range_value=$(( (range_value << 1) | bit_value ))
done
printf "0x%X" "$range_value"
elif [[ $bit_def =~ \[([0-9]+)\] ]]; then
# 处理单个 bit
local pos=${BASH_REMATCH[1]}
local bit_value=$(( (reg_value >> pos) & 1 ))
printf "0x%X" "$bit_value"
else
echo "Error: Invalid bit definition format '$bit_def'."
return 1
fi
}
# 函数:打印寄存器的 bit 定义
# 参数:
# $1: 寄存器名称
# $2: 寄存器偏移量(16进制)
# $3: 寄存器值(16进制)
# $4: bit 定义数组
print_bit_definitions() {
local reg_name=$1
local reg_offset=$2
local reg_value=$3
local bit_definitions=("${!4}")
# 将十六进制数转换为十进制
local decimal_value=$((reg_value))
# 打印寄存器信息
echo "----------------------------------------"
echo "Register Name: $reg_name"
echo "Register Offset: $reg_offset"
echo "Register Value (Hex): 0x$(printf "%X" "$reg_value")"
echo "Register Value (Dec): $decimal_value"
echo "----------------------------------------"
printf "%-20s | %-10s | %s\n" "Bit Definition" "Value (Hex)" "Description"
echo "----------------------------------------"
# 解析每个 bit 定义
for bit_def in "${bit_definitions[@]}"; do
# 提取描述信息
local description=$(echo "$bit_def" | sed -E 's/\[[^]]+\]\s*//')
local bit_range=$(echo "$bit_def" | grep -o '\[[^]]\+\]')
# 提取 bit 值
local bit_value=$(extract_bit_value "$decimal_value" "$bit_range")
if [ $? -ne 0 ]; then
echo "Error: Failed to extract value for '$bit_def'."
continue
fi
# 打印结果
printf "%-20s | %-10s | %s\n" "$bit_range" "$bit_value" "$description"
done
echo "----------------------------------------"
}
#################################################
#解析Uncorrectable Error Status Register
function Aer_ParseUncorrectable_Error_Status() {
local read_val=$1
local reg_offset=0x10
local reg_name="Uncorrectable Error Status Register"
echo -e "---------------Aer_ParseUncorrectable_Error_Status: $reg_name offset $reg_offset is: $read_val---------------"
print_bit_definitions "$reg_name" "$reg_offset" "$read_val" uesta_bit_definitions[@]
}
#解析Uncorrectable Error Mask Register
function Aer_ParseUncorrectable_Error_Mask() {
local read_val=$1
local reg_offset=0x8
local reg_name="Uncorrectable Error Mask Register"
echo -e "---------------Aer_ParseUncorrectable_Error_Mask: $reg_name offset $reg_offset is: $read_val---------------"
print_bit_definitions "$reg_name" "$reg_offset" "$read_val" uemask_bit_definitions[@]
}
#解析Uncorrectable Error Severity Register
function Aer_ParseUncorrectable_Error_Severity() {
local read_val=$1
local reg_offset=0xC
local reg_name="Uncorrectable Error Severity Register"
echo -e "---------------Aer_ParseUncorrectable_Error_Severity: $bdf $reg_name offset $reg_offset is: $read_val---------------"
print_bit_definitions "$reg_name" "$reg_offset" "$read_val" uesev_bit_definitions[@]
}
#解析Correctable Error Status Register并解析
function Aer_ParseCorrectable_Error_Status() {
local read_val=$1
local reg_offset=0x10
local reg_name="Correctable Error Status Register"
echo -e "---------------Aer_ParseCorrectable_Error_Status: $reg_name offset $reg_offset is: $read_val---------------"
print_bit_definitions "$reg_name" "$reg_offset" "$read_val" cesta_bit_definitions[@]
}
#解析Correctable Error Mask Register
function Aer_ParseCorrectable_Error_Mask() {
local read_val=$1
local reg_offset=0x14
local reg_name="Correctable Error Mask Register"
echo -e "---------------Aer_ParseCorrectable_Error_Mask: $bdf $reg_name offset $reg_offset is: $read_val---------------"
print_bit_definitions "$reg_name" "$reg_offset" "$read_val" cemask_bit_definitions[@]
}
function Usage()
{
printf "Usage:\n"
echo "Uncorrectable Error Parse: $script_name uncorr 0x123 0x456 0x789"
echo "1st argument is error type (uncorr)"
echo "2nd argument is uncorrectable error status reg value (hex)"
echo "3rd argument is uncorrectable error mask reg value (hex)"
echo "4th argument is uncorrectable error severity value (hex)"
echo ""
echo "Correctable Error Parse: $script_name corr 0x123 0x456"
echo "1st argument is error type (corr)"
echo "2nd argument is uncorrectable error status reg value (hex)"
echo "3rd argument is uncorrectable error mask reg value (hex)"
}
function main()
{
local error_type=$1
local error_status=$2
#echo "error_type: $error_type, error_status: $error_status"
if [ $arg_cnt -eq 0 ] || [ "$error_type" == "-h" ] || [ "$error_type" == "--help" ];then
Usage
exit 0
fi
#local error_mask=$3
if [ "$error_type" == "uncorr" ];then
local uncor_mask=$3
local uncor_severity=$4
Aer_ParseUncorrectable_Error_Status "$error_status"
Aer_ParseUncorrectable_Error_Mask "$uncor_mask"
Aer_ParseUncorrectable_Error_Severity "$uncor_severity"
elif [ "$error_type" == "corr" ];then
local cor_mask=$3
Aer_ParseCorrectable_Error_Status "$error_status"
Aer_ParseCorrectable_Error_Mask "$cor_mask"
else
echo "error_type: $error_type is invalid, must be uncorr or corr"
fi
}
#./aer_parse.sh uncorr 0x00044000 0x04500000 0x00462030
main "$@"
【102】PCIe Aer Reg解析
于 2025-01-23 17:33:19 首次发布