|  | #!/bin/bash | 
|  |  | 
|  | CPU_SYS_DIR=/sys/devices/system/cpu/ | 
|  | NR_CPUS=0 | 
|  | CPU= | 
|  | SHOW_LAYOUT=0 | 
|  |  | 
|  |  | 
|  | function usage() | 
|  | { | 
|  | echo "usage:" | 
|  | echo "        $0 [cpu] [-L]" | 
|  | echo | 
|  | echo "option:" | 
|  | echo "        [cpu]" | 
|  | echo "          Logical cpu id." | 
|  | echo "        -L" | 
|  | echo "          Show processor layout." | 
|  | echo "        -h" | 
|  | echo "          Show this help." | 
|  | exit 1 | 
|  | } | 
|  |  | 
|  | function parse_args() | 
|  | { | 
|  | while getopts "hL" OPTION | 
|  | do | 
|  | case $OPTION in | 
|  | L) | 
|  | SHOW_LAYOUT=1 | 
|  | ;; | 
|  | *) | 
|  | usage | 
|  | exit 1 | 
|  | ;; | 
|  | esac | 
|  | done | 
|  |  | 
|  | CPU=${!OPTIND} | 
|  | } | 
|  |  | 
|  | parse_args $* | 
|  |  | 
|  | [ "$1" == "-h" ] && usage | 
|  |  | 
|  | declare -a CPUS | 
|  | declare -a CPU_FILE | 
|  | declare -a CPU_PIR | 
|  | declare -a CORE_ID | 
|  | declare -a CHIP_ID | 
|  |  | 
|  | declare -a CHIP_EQ | 
|  | declare -a CHIP_EX | 
|  | declare -a CHIP_CORES | 
|  |  | 
|  | declare -A CORE_MATRIX | 
|  |  | 
|  | for cpu_file in $(find $CPU_SYS_DIR -name "cpu[0-9]*") | 
|  | do | 
|  | cpu=$(basename $cpu_file | tr -dc '0-9') | 
|  | [ -n "$cpu" ] && NR_CPUS=$(expr $NR_CPUS + 1) | 
|  |  | 
|  | CPU_VALID[$cpu]=0 | 
|  | [ -n "$CPU" ] && [ $cpu != $CPU ] && continue | 
|  | [ ! -e $cpu_file/pir ] && continue | 
|  |  | 
|  | CPU_VALID[$cpu]=1 | 
|  |  | 
|  | CPU_FILE[$cpu]=$cpu_file | 
|  | pir=$(cat $cpu_file/pir) | 
|  | CPU_PIR[$cpu]=$pir | 
|  | CORE_ID[$cpu]=$(perl -e '{ printf("%d", (0x'$pir' >> 2) & 0x3f); }') | 
|  | CHIP_ID[$cpu]=$(perl -e '{ printf("%x", (0x'$pir' >> 8) & 0x7f); }') | 
|  | done | 
|  |  | 
|  | i=0 | 
|  | chip_id=-1 | 
|  | core_id=-1 | 
|  | prev_eq_id=-1 | 
|  | prev_ex_id=-1 | 
|  | num_threads=0 | 
|  | CPU_LIST=" " | 
|  | while [ $i -lt $NR_CPUS ] | 
|  | do | 
|  | [ ${CPU_VALID[$i]} -eq 0 ] && i=$(expr $i + 1) && continue | 
|  |  | 
|  | [ "$chip_id" != "${CHIP_ID[$i]}" ] && core_id=-1 && prev_eq_id=-1 && prev_ex_id=-1 | 
|  | chip_id=${CHIP_ID[$i]} | 
|  | if [ "$core_id" != ${CORE_ID[$i]} ] | 
|  | then | 
|  | if [ $num_threads -ne 0 ]; then | 
|  | echo "THREADS: $num_threads CPUs: $CPU_LIST" | 
|  | CPU_LIST=" " | 
|  | fi | 
|  | CPU_LIST="$CPU_LIST$i " | 
|  | echo -n "CHIP ID: ${CHIP_ID[$i]} " | 
|  | echo -n "CORE ID: ${CORE_ID[$i]} " | 
|  | CHIP_CORES[$chip_id]="${CHIP_CORES[$chip_id]},${CORE_ID[$i]}" | 
|  | CORE_MATRIX[$chip_id,${CORE_ID[$i]}]=1 | 
|  | eq_id=$(perl -e '{ printf("%d", (('${CORE_ID[$i]}' & 0x1c) >> 2)); }') | 
|  | if [ $eq_id != $prev_eq_id ] | 
|  | then | 
|  | CHIP_EQ[$chip_id]="${CHIP_EQ[$chip_id]},$eq_id" | 
|  | prev_eq_id=$eq_id | 
|  | fi | 
|  | ex_id=$(perl -e '{ printf("%d", (('${CORE_ID[$i]}') >> 1)); }') | 
|  | if [ $ex_id != $prev_ex_id ] | 
|  | then | 
|  | CHIP_EX[$chip_id]="${CHIP_EX[$chip_id]},$ex_id" | 
|  | prev_ex_id=$ex_id | 
|  | fi | 
|  | num_threads=1 | 
|  | else | 
|  | CPU_LIST="$CPU_LIST$i " | 
|  | num_threads=$(expr $num_threads + 1) | 
|  | fi | 
|  | core_id=${CORE_ID[$i]} | 
|  |  | 
|  | i=$(expr $i + 1) | 
|  | done | 
|  | echo "THREADS: $num_threads CPUs: $CPU_LIST" | 
|  |  | 
|  | echo | 
|  | echo "-----------------------------" | 
|  | for chip_id in ${!CHIP_CORES[@]} | 
|  | do | 
|  | echo "p[$chip_id]" | 
|  | CHIP_CORES[$chip_id]="$(echo ${CHIP_CORES[$chip_id]} | cut -c 2-)" | 
|  | CHIP_EQ[$chip_id]="$(echo ${CHIP_EQ[$chip_id]} | cut -c 2-)" | 
|  | CHIP_EX[$chip_id]="$(echo ${CHIP_EX[$chip_id]} | cut -c 2-)" | 
|  | echo "   eq[${CHIP_EQ[$chip_id]}]" | 
|  | echo "   ex[${CHIP_EX[$chip_id]}]" | 
|  | echo "    c[${CHIP_CORES[$chip_id]}]" | 
|  | done | 
|  | echo "-----------------------------" | 
|  |  | 
|  |  | 
|  | [ $SHOW_LAYOUT -eq 0 ] && exit | 
|  |  | 
|  | # Print chip layout | 
|  |  | 
|  | function print_header() | 
|  | { | 
|  | local _row_=$1 | 
|  |  | 
|  | for q in 0 2 4 | 
|  | do | 
|  | quad=$(perl -e '{ printf("%02d", ('$q' + '$_row_')); }') | 
|  | echo -n "        +---EQ$quad----+ " | 
|  | done | 
|  | echo | 
|  | } | 
|  |  | 
|  | function print_core_info() | 
|  | { | 
|  | local _row_=$1 | 
|  | local _cpos_=$2   # Core position | 
|  |  | 
|  | for q in 0 2 4 | 
|  | do | 
|  | quad=$(perl -e '{ printf("%02d", ('$q' + '$_row_')); }') | 
|  | core_id=$(perl -e '{ printf("%d", ('$_cpos_' + ('$quad' * 4))); }') | 
|  | core_id_str=$(perl -e '{ printf("%-2d", ('$_cpos_' + ('$quad' * 4))); }') | 
|  | ex=$(perl -e '{ printf("%-2d", ('$core_id' >> 1)); }') | 
|  | if [ -n "${CORE_MATRIX[$chip_id,$core_id]}" ] | 
|  | then | 
|  | echo -n "        |EX-$ex   C$core_id_str|" | 
|  | else | 
|  | echo -n "        |           |" | 
|  | fi | 
|  | done | 
|  | echo | 
|  | if [ $_cpos_ -eq 3 ] | 
|  | then | 
|  | echo "        +-----------+         +-----------+        +-----------+" | 
|  | else | 
|  | echo "        + - - - - - +        + - - - - - +        + - - - - - +" | 
|  | fi | 
|  | } | 
|  |  | 
|  | echo | 
|  | echo "----------Processor Layout-------------------" | 
|  | for chip_id in ${!CHIP_CORES[@]} | 
|  | do | 
|  | echo "p[$chip_id]" | 
|  |  | 
|  | for row in 0 1 | 
|  | do | 
|  | print_header $row | 
|  | for core_pos in 0 1 2 3 | 
|  | do | 
|  | print_core_info $row $core_pos | 
|  | done | 
|  | echo | 
|  |  | 
|  | done | 
|  | echo | 
|  |  | 
|  | done |