#!/bin/bash # # Copyright (c) 2017 Wind River Systems, Inc. # # SPDX-License-Identifier: Apache-2.0 # # This script logs to user.log # # An instance with vTPM enable will have a QEMU config section in its XML file. # e.g. # # # # # # # # # # For more information see the vTPM HLD in /folk/cgts/docs/security/ # # The script is called with the following parameters # e.g. /etc/libvirt/hooks/qemu # # Save the instance's XML. The guest qemu hook scrips are given the full XML description # on their stdin. XML_DATA=$(/bin/cat) GUEST_NAME=$1 shift OPERATION=$* logger -p info -t $0 "hook qemu file guest $GUEST_NAME with operation $OPERATION" # CPU Low latency setup: # # A cpu is set to low latency when: # 1) host is set to subfunction=lowlatency in platform.conf and # 2) domain has dedicated pinning # # example of section when domain has dedicated pinning: # # # # # # # # example of section when domain has shared pinning: # # 4096 # # # # # # if [ "${OPERATION}" == "prepare begin -" ] || [ "${OPERATION}" == "stopped end -" ]; then # verify this host is set as lowlatency lowlat=$(cat /etc/platform/platform.conf 2>/dev/null | grep -E 'subfunction.*lowlatency') if [ -n "${lowlat}" ]; then # grab the settings and remove single quotes CPUTUNE=$(echo ${XML_DATA} | grep -oP '(?<=)' | sed "s/'//g") # grab all cpuset pinned to a unique CPU. Treat them as dedicated CPUSET=($(echo ${CPUTUNE} | grep -oP '(?<=cpuset=)[^/]+(?=.+emulator)' | grep -vP '[^0-9]')) if [ ${#CPUSET[@]} -ne 0 ]; then # convert to a comma separated list CPUS=$(IFS=, ; echo "${CPUSET[*]}") if [ "${OPERATION}" == "prepare begin -" ]; then /usr/bin/set-cpu-wakeup-latency.sh "low" "${CPUS}" else /usr/bin/set-cpu-wakeup-latency.sh "high" "${CPUS}" fi fi fi fi VTPM_OPER="" if [ "$OPERATION" == "prepare begin -" ]; then # Get the instance's uuid UUID=$(echo $XML_DATA | grep -oP '(?<=).*?(?=)') if [ -z "$UUID" ]; then # This should not happen logger -p err -t $0 "Failed to retrieve uuid for guest $GUEST_NAME" exit 1 fi # Grab the qemu line "&1 > /dev/null rc=$? if [[ $rc != 0 ]]; then logger -p err -t $0 "setup_vtpm failed with return value $rc for device $VTPM and guest $UUID" # Do not return error if we were just doing a clear if [ "$VTPM_OPER" != "clear" ]; then exit 1; fi fi fi exit 0