blob: 16a4e5a030fdc285550bc39e00f63e7c2df8bb29 [file] [log] [blame]
#!/bin/bash
# Refer to help text in the usage function for details.
CPU_SYS_DIR=/sys/devices/system/cpu/
NR_CPUS=0
CPU=
SHOW_LAYOUT=0
function usage()
{
echo "This script runs on HOST OS and gives core-id"
echo "corresponding to the chip-id."
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