#!/usr/local/bin/cbsd
#v11.1.17
MYARG=""
MYOPTARG=""
MYDESC="Show cpu topology"
CBSDMODULE="sys"

. ${subr}
init $*

. ${strings}
. ${tools}


cpu_topology_in_ascii_art()
{
	local cores_per_sock=0

	cores_per_sock=$(( cores_max / sockets_num ))

	# CPU pinning still in WIP, so at the moment all vm/jails
	# use all cores: get all list
	local jail_list=$( jorder )
	local bhyve_list=$( border )

	[ -z "${jail_list}" -a -z "${bhyve_list}" ] && jail_list="no any environments"

	for i in $( /usr/bin/seq 1 ${sockets_num} ); do

		socket_id=$(( i - 1 ))

		eval _mythreads="\$threads_by_socket${socket_id}"
		eval _mycores="\$cores_by_socket${socket_id}"

		${ECHO} "${LYELLOW}Socket ${socket_id}:${NORMAL}"
		${ECHO} "+-----------------------+"
		${ECHO} "|			|"
		for x in ${_mythreads}; do
			[ -n "${jail_list}" ] && ${ECHO} "|   ${GREEN}core ${x} (THR)${NORMAL}	| - ${GREEN}Jails:${jail_list}${NORMAL}"
			[ -n "${bhyve_list}" ] && ${ECHO} "|   ${LGREEN}core ${x} (THR)${NORMAL}	| - ${LGREEN}Bhyve:${bhyve_list}${NORMAL}"
		done
		for x in ${_mycores}; do
			[ -n "${jail_list}" ] && ${ECHO} "|   ${GREEN}core ${x} (SMT)${NORMAL}	| - ${GREEN}Jails:${jail_list}${NORMAL}"
			[ -n "${bhyve_list}" ] && ${ECHO} "|   ${LGREEN}core ${x} (SMT)${NORMAL}	| - ${LGREEN}Bhyve:${bhyve_list}${NORMAL}"
		done
		${ECHO} "|			|"
		${ECHO} "+-----------------------+"
	done
}

/sbin/sysctl -qn kern.sched.topology_spec > /tmp/top.$$
trap "/bin/rm -f /tmp/top.$$" HUP INT ABRT BUS TERM EXIT

sockets_num=
cores_num=
threads_num=
cores_max=

eval $( ${miscdir}/dump_cpu_topology /tmp/top.$$ 2>/dev/null )

#sockets_num="2"
#cores_num="8"
#threads_num="8"
#cores_max="16"
#cores_by_socket0="6 4 2 0 "
#threads_by_socket0="7 5 3 1 "
#cores_by_socket1="14 12 10 8 "
#threads_by_socket1="15 13 11 9 "

${ECHO} "${MAGENTA}Model: ${GREEN}${cpumodel}${NORMAL}"
${ECHO} "${MAGENTA}Sockets num: ${GREEN}${sockets_num}${NORMAL}"
${ECHO} "${MAGENTA}Cores num: ${GREEN}${cores_num}${NORMAL}"
${ECHO} "${MAGENTA}Threads num: ${GREEN}${threads_num}${NORMAL}"
${ECHO} "--"
${ECHO} "${MAGENTA}Core max: ${GREEN}${cores_max}${NORMAL}"

cpu_topology_in_ascii_art
