xref: /linux/tools/testing/selftests/x86/bugs/its_sysfs.py (revision 6f5bf947bab06f37ff931c359fd5770c4d9cbf87)
1*7a9b709eSPawan Gupta#!/usr/bin/env python3
2*7a9b709eSPawan Gupta# SPDX-License-Identifier: GPL-2.0
3*7a9b709eSPawan Gupta#
4*7a9b709eSPawan Gupta# Copyright (c) 2025 Intel Corporation
5*7a9b709eSPawan Gupta#
6*7a9b709eSPawan Gupta# Test for Indirect Target Selection(ITS) mitigation sysfs status.
7*7a9b709eSPawan Gupta
8*7a9b709eSPawan Guptaimport sys, os, re
9*7a9b709eSPawan Guptathis_dir = os.path.dirname(os.path.realpath(__file__))
10*7a9b709eSPawan Guptasys.path.insert(0, this_dir + '/../../kselftest')
11*7a9b709eSPawan Guptaimport ksft
12*7a9b709eSPawan Gupta
13*7a9b709eSPawan Guptafrom common import *
14*7a9b709eSPawan Gupta
15*7a9b709eSPawan Guptabug = "indirect_target_selection"
16*7a9b709eSPawan Guptamitigation = get_sysfs(bug)
17*7a9b709eSPawan Gupta
18*7a9b709eSPawan GuptaITS_MITIGATION_ALIGNED_THUNKS	= "Mitigation: Aligned branch/return thunks"
19*7a9b709eSPawan GuptaITS_MITIGATION_RETPOLINE_STUFF	= "Mitigation: Retpolines, Stuffing RSB"
20*7a9b709eSPawan GuptaITS_MITIGATION_VMEXIT_ONLY		= "Mitigation: Vulnerable, KVM: Not affected"
21*7a9b709eSPawan GuptaITS_MITIGATION_VULNERABLE       = "Vulnerable"
22*7a9b709eSPawan Gupta
23*7a9b709eSPawan Guptadef check_mitigation():
24*7a9b709eSPawan Gupta    if mitigation == ITS_MITIGATION_ALIGNED_THUNKS:
25*7a9b709eSPawan Gupta        if cmdline_has(f'{bug}=stuff') and sysfs_has("spectre_v2", "Retpolines"):
26*7a9b709eSPawan Gupta            bug_check_fail(bug, ITS_MITIGATION_ALIGNED_THUNKS, ITS_MITIGATION_RETPOLINE_STUFF)
27*7a9b709eSPawan Gupta            return
28*7a9b709eSPawan Gupta        if cmdline_has(f'{bug}=vmexit') and cpuinfo_has('its_native_only'):
29*7a9b709eSPawan Gupta            bug_check_fail(bug, ITS_MITIGATION_ALIGNED_THUNKS, ITS_MITIGATION_VMEXIT_ONLY)
30*7a9b709eSPawan Gupta            return
31*7a9b709eSPawan Gupta        bug_check_pass(bug, ITS_MITIGATION_ALIGNED_THUNKS)
32*7a9b709eSPawan Gupta        return
33*7a9b709eSPawan Gupta
34*7a9b709eSPawan Gupta    if mitigation == ITS_MITIGATION_RETPOLINE_STUFF:
35*7a9b709eSPawan Gupta        if cmdline_has(f'{bug}=stuff') and sysfs_has("spectre_v2", "Retpolines"):
36*7a9b709eSPawan Gupta            bug_check_pass(bug, ITS_MITIGATION_RETPOLINE_STUFF)
37*7a9b709eSPawan Gupta            return
38*7a9b709eSPawan Gupta        if sysfs_has('retbleed', 'Stuffing'):
39*7a9b709eSPawan Gupta            bug_check_pass(bug, ITS_MITIGATION_RETPOLINE_STUFF)
40*7a9b709eSPawan Gupta            return
41*7a9b709eSPawan Gupta        bug_check_fail(bug, ITS_MITIGATION_RETPOLINE_STUFF, ITS_MITIGATION_ALIGNED_THUNKS)
42*7a9b709eSPawan Gupta
43*7a9b709eSPawan Gupta    if mitigation == ITS_MITIGATION_VMEXIT_ONLY:
44*7a9b709eSPawan Gupta        if cmdline_has(f'{bug}=vmexit') and cpuinfo_has('its_native_only'):
45*7a9b709eSPawan Gupta            bug_check_pass(bug, ITS_MITIGATION_VMEXIT_ONLY)
46*7a9b709eSPawan Gupta            return
47*7a9b709eSPawan Gupta        bug_check_fail(bug, ITS_MITIGATION_VMEXIT_ONLY, ITS_MITIGATION_ALIGNED_THUNKS)
48*7a9b709eSPawan Gupta
49*7a9b709eSPawan Gupta    if mitigation == ITS_MITIGATION_VULNERABLE:
50*7a9b709eSPawan Gupta        if sysfs_has("spectre_v2", "Vulnerable"):
51*7a9b709eSPawan Gupta            bug_check_pass(bug, ITS_MITIGATION_VULNERABLE)
52*7a9b709eSPawan Gupta        else:
53*7a9b709eSPawan Gupta            bug_check_fail(bug, "Mitigation", ITS_MITIGATION_VULNERABLE)
54*7a9b709eSPawan Gupta
55*7a9b709eSPawan Gupta    bug_status_unknown(bug, mitigation)
56*7a9b709eSPawan Gupta    return
57*7a9b709eSPawan Gupta
58*7a9b709eSPawan Guptaksft.print_header()
59*7a9b709eSPawan Guptaksft.set_plan(1)
60*7a9b709eSPawan Guptaksft.print_msg(f'{bug}: {mitigation} ...')
61*7a9b709eSPawan Gupta
62*7a9b709eSPawan Guptaif not basic_checks_sufficient(bug, mitigation):
63*7a9b709eSPawan Gupta    check_mitigation()
64*7a9b709eSPawan Gupta
65*7a9b709eSPawan Guptaksft.finished()
66