11.1Smaxv#!/bin/sh
21.1Smaxv#
31.6Smartin# $NetBSD: smtoff,v 1.6 2020/09/08 12:52:18 martin Exp $
41.1Smaxv#
51.1Smaxv# Public Domain.
61.1Smaxv#
71.1Smaxv
81.1Smaxv# PROVIDE: smtoff
91.6Smartin# REQUIRE: root bootconf CRITLOCALMOUNTED tty
101.1Smaxv
111.1Smaxv$_rc_subr_loaded . /etc/rc.subr
121.1Smaxv
131.1Smaxvname="smtoff"
141.1Smaxvrcvar=$name
151.1Smaxv
161.1Smaxvstart_cmd="smtoff_start"
171.1Smaxvstop_cmd="smtoff_stop"
181.1Smaxv
191.1Smaxv# ------------------------------------------------------------------------------
201.1Smaxv
211.1Smaxv#
221.1Smaxv# The format of the output is:
231.1Smaxv#
241.1Smaxv#     ...
251.1Smaxv#     cpu0: SMT ID 1
261.1Smaxv#     ...
271.1Smaxv#
281.1Smaxv# Return the value.
291.1Smaxv#
301.1SmaxvGetSmtId() {
311.2Skre	cpuctl identify "$1" |
321.2Skre	while read cpuN smt id N junk
331.2Skre	do
341.2Skre		test -n "$junk" && continue
351.2Skre
361.2Skre		case "${smt} ${id}" in
371.2Skre		'SMT ID')
381.2Skre			case "$N" in
391.2Skre			[0-9]|[1-9][0-9]|[1-9][0-9]*[0-9])
401.2Skre				printf %s "$N"
411.2Skre				return
421.2Skre				;;
431.2Skre			esac
441.2Skre			;;
451.2Skre		esac
461.2Skre	done
471.1Smaxv}
481.1Smaxv
491.1SmaxvCountCPUs() {
501.2Skre	sysctl -n hw.ncpu
511.1Smaxv}
521.1Smaxv
531.1Smaxv# ------------------------------------------------------------------------------
541.1Smaxv
551.1Smaxv#
561.1Smaxv# Disable SMT. We skip cpu0.
571.1Smaxv#
581.1Smaxvsmtoff_start()
591.1Smaxv{
601.1Smaxv	ncpus=$(CountCPUs)
611.1Smaxv	i=1
621.1Smaxv
631.2Skre	while [ "$i" -lt "$ncpus" ]
641.1Smaxv	do
651.2Skre		smtid=$(GetSmtId "$i" 2>/dev/null)
661.2Skre
671.2Skre		case "$smtid" in
681.3Skre		'')			# Didn't get the ID? Then maybe no SMT.
691.2Skre			;;
701.1Smaxv
711.2Skre		0)			# The first thread is never disabled.
721.2Skre			;;
731.2Skre
741.2Skre		*)
751.2Skre			cpuctl offline "$i"
761.2Skre			;;
771.2Skre		esac
781.1Smaxv
791.1Smaxv		i=$(($i+1))
801.1Smaxv	done
811.1Smaxv}
821.1Smaxv
831.1Smaxv#
841.1Smaxv# Enable SMT. We basically turn on each CPU.
851.1Smaxv#
861.1Smaxvsmtoff_stop()
871.1Smaxv{
881.1Smaxv	ncpus=$(CountCPUs)
891.1Smaxv	i=1
901.1Smaxv
911.2Skre	while [ "$i" -lt "$ncpus" ]
921.1Smaxv	do
931.2Skre		cpuctl online "$i"
941.1Smaxv		i=$(($i+1))
951.1Smaxv	done
961.1Smaxv}
971.1Smaxv
981.1Smaxvload_rc_config $name
991.1Smaxvrun_rc_command "$1"
100