Path: blob/master/tools/testing/selftests/drivers/sdsi/sdsi_test.py
26288 views
#!/usr/bin/env python31# SPDX-License-Identifier: GPL-2.023from struct import pack4from time import sleep56import errno7import glob8import os9import subprocess1011try:12import pytest13except ImportError:14print("Unable to import pytest python module.")15print("\nIf not already installed, you may do so with:")16print("\t\tpip3 install pytest")17exit(1)1819SOCKETS = glob.glob('/sys/bus/auxiliary/devices/intel_vsec.sdsi.*')20NUM_SOCKETS = len(SOCKETS)2122MODULE_NAME = 'intel_sdsi'23DEV_PREFIX = 'intel_vsec.sdsi'24CLASS_DIR = '/sys/bus/auxiliary/devices'25GUID = "0x6dd191"2627def read_bin_file(file):28with open(file, mode='rb') as f:29content = f.read()30return content3132def get_dev_file_path(socket, file):33return CLASS_DIR + '/' + DEV_PREFIX + '.' + str(socket) + '/' + file3435def kmemleak_enabled():36kmemleak = "/sys/kernel/debug/kmemleak"37return os.path.isfile(kmemleak)3839class TestSDSiDriver:40def test_driver_loaded(self):41lsmod_p = subprocess.Popen(('lsmod'), stdout=subprocess.PIPE)42result = subprocess.check_output(('grep', '-q', MODULE_NAME), stdin=lsmod_p.stdout)4344@pytest.mark.parametrize('socket', range(0, NUM_SOCKETS))45class TestSDSiFilesClass:4647def read_value(self, file):48f = open(file, "r")49value = f.read().strip("\n")50return value5152def get_dev_folder(self, socket):53return CLASS_DIR + '/' + DEV_PREFIX + '.' + str(socket) + '/'5455def test_sysfs_files_exist(self, socket):56folder = self.get_dev_folder(socket)57print (folder)58assert os.path.isfile(folder + "guid") == True59assert os.path.isfile(folder + "provision_akc") == True60assert os.path.isfile(folder + "provision_cap") == True61assert os.path.isfile(folder + "state_certificate") == True62assert os.path.isfile(folder + "registers") == True6364def test_sysfs_file_permissions(self, socket):65folder = self.get_dev_folder(socket)66mode = os.stat(folder + "guid").st_mode & 0o77767assert mode == 0o444 # Read all68mode = os.stat(folder + "registers").st_mode & 0o77769assert mode == 0o400 # Read owner70mode = os.stat(folder + "provision_akc").st_mode & 0o77771assert mode == 0o200 # Read owner72mode = os.stat(folder + "provision_cap").st_mode & 0o77773assert mode == 0o200 # Read owner74mode = os.stat(folder + "state_certificate").st_mode & 0o77775assert mode == 0o400 # Read owner7677def test_sysfs_file_ownership(self, socket):78folder = self.get_dev_folder(socket)7980st = os.stat(folder + "guid")81assert st.st_uid == 082assert st.st_gid == 08384st = os.stat(folder + "registers")85assert st.st_uid == 086assert st.st_gid == 08788st = os.stat(folder + "provision_akc")89assert st.st_uid == 090assert st.st_gid == 09192st = os.stat(folder + "provision_cap")93assert st.st_uid == 094assert st.st_gid == 09596st = os.stat(folder + "state_certificate")97assert st.st_uid == 098assert st.st_gid == 099100def test_sysfs_file_sizes(self, socket):101folder = self.get_dev_folder(socket)102103if self.read_value(folder + "guid") == GUID:104st = os.stat(folder + "registers")105assert st.st_size == 72106107st = os.stat(folder + "provision_akc")108assert st.st_size == 1024109110st = os.stat(folder + "provision_cap")111assert st.st_size == 1024112113st = os.stat(folder + "state_certificate")114assert st.st_size == 4096115116def test_no_seek_allowed(self, socket):117folder = self.get_dev_folder(socket)118rand_file = bytes(os.urandom(8))119120f = open(folder + "provision_cap", "wb", 0)121f.seek(1)122with pytest.raises(OSError) as error:123f.write(rand_file)124assert error.value.errno == errno.ESPIPE125f.close()126127f = open(folder + "provision_akc", "wb", 0)128f.seek(1)129with pytest.raises(OSError) as error:130f.write(rand_file)131assert error.value.errno == errno.ESPIPE132f.close()133134def test_registers_seek(self, socket):135folder = self.get_dev_folder(socket)136137# Check that the value read from an offset of the entire138# file is none-zero and the same as the value read139# from seeking to the same location140f = open(folder + "registers", "rb")141data = f.read()142f.seek(64)143id = f.read()144assert id != bytes(0)145assert data[64:] == id146f.close()147148@pytest.mark.parametrize('socket', range(0, NUM_SOCKETS))149class TestSDSiMailboxCmdsClass:150def test_provision_akc_eoverflow_1017_bytes(self, socket):151152# The buffer for writes is 1k, of with 8 bytes must be153# reserved for the command, leaving 1016 bytes max.154# Check that we get an overflow error for 1017 bytes.155node = get_dev_file_path(socket, "provision_akc")156rand_file = bytes(os.urandom(1017))157158f = open(node, 'wb', 0)159with pytest.raises(OSError) as error:160f.write(rand_file)161assert error.value.errno == errno.EOVERFLOW162f.close()163164@pytest.mark.parametrize('socket', range(0, NUM_SOCKETS))165class TestSdsiDriverLocksClass:166def test_enodev_when_pci_device_removed(self, socket):167node = get_dev_file_path(socket, "provision_akc")168dev_name = DEV_PREFIX + '.' + str(socket)169driver_dir = CLASS_DIR + '/' + dev_name + "/driver/"170rand_file = bytes(os.urandom(8))171172f = open(node, 'wb', 0)173g = open(node, 'wb', 0)174175with open(driver_dir + 'unbind', 'w') as k:176print(dev_name, file = k)177178with pytest.raises(OSError) as error:179f.write(rand_file)180assert error.value.errno == errno.ENODEV181182with pytest.raises(OSError) as error:183g.write(rand_file)184assert error.value.errno == errno.ENODEV185186f.close()187g.close()188189# Short wait needed to allow file to close before pulling driver190sleep(1)191192p = subprocess.Popen(('modprobe', '-r', 'intel_sdsi'))193p.wait()194p = subprocess.Popen(('modprobe', '-r', 'intel_vsec'))195p.wait()196p = subprocess.Popen(('modprobe', 'intel_vsec'))197p.wait()198199# Short wait needed to allow driver time to get inserted200# before continuing tests201sleep(1)202203def test_memory_leak(self, socket):204if not kmemleak_enabled():205pytest.skip("kmemleak not enabled in kernel")206207dev_name = DEV_PREFIX + '.' + str(socket)208driver_dir = CLASS_DIR + '/' + dev_name + "/driver/"209210with open(driver_dir + 'unbind', 'w') as k:211print(dev_name, file = k)212213sleep(1)214215subprocess.check_output(('modprobe', '-r', 'intel_sdsi'))216subprocess.check_output(('modprobe', '-r', 'intel_vsec'))217218with open('/sys/kernel/debug/kmemleak', 'w') as f:219print('scan', file = f)220sleep(5)221222assert os.stat('/sys/kernel/debug/kmemleak').st_size == 0223224subprocess.check_output(('modprobe', 'intel_vsec'))225sleep(1)226227228