blob: fc1693ba84b41d2524dc38114203310e435dfa96 [file] [log] [blame]
#!/usr/bin/python2
#
# Copyright (c) 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import logging, os
from autotest_lib.client.bin import test, utils
from autotest_lib.client.common_lib import error
from autotest_lib.client.cros.power import power_utils
class security_SMMLocked(test.test):
"""
Verify SMM has SMRAM unmapped and that the SMM registers are locked.
"""
version = 1
executable = 'smm'
def setup(self):
os.chdir(self.srcdir)
utils.make(self.executable)
def run_once(self):
errors = 0
cpu_arch = utils.get_cpu_arch()
if cpu_arch == "arm":
logging.debug('ok: skipping SMM test for %s.', cpu_arch)
return
cpu_arch = power_utils.get_x86_cpu_arch()
if cpu_arch == 'Stoney':
# The SMM registers (MSRC001_0112 and MSRC001_0113) can be
# locked from being altered by setting MSRC001_0015[SmmLock].
# Bit 0 : 1=SMM code in the ASeg and TSeg range and the SMM
# registers are read-only and SMI interrupts are
# not intercepted in SVM for Stoney.
Stoney_SMMLock = {'0xc0010015': [('0', 1)]}
self._registers = power_utils.Registers()
errors = self._registers.verify_msr(Stoney_SMMLock)
else:
r = utils.run("%s/%s" % (self.srcdir, self.executable),
stdout_tee=utils.TEE_TO_LOGS,
stderr_tee=utils.TEE_TO_LOGS,
ignore_status=True)
if r.exit_status != 0 or len(r.stderr) > 0:
raise error.TestFail(r.stderr)
if 'skipping' in r.stdout:
logging.debug(r.stdout)
return
if 'ok' not in r.stdout:
raise error.TestFail(r.stdout)
if errors:
logging.error('Test Failed for %s', cpu_arch)
raise error.TestFail(r.stdout)