【102】PCIe Aer Reg解析

#!/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 "$@"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

linjiasen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值