# Copyright (c) 2014 The Chromium OS 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, subprocess from autotest_lib.client.bin import test, utils from autotest_lib.client.common_lib import error class hardware_UnsafeMemory(test.test): """ This test runs for the specified number of seconds checking for user-controllable memory corruption using the rowhammer-test tools: https://code.google.com/a/google.com/p/rowhammer-test """ version = 1 _DIR_NAME = 'rowhammer-test-4d619293e1c7' def setup(self): os.chdir(os.path.join(self.srcdir, self._DIR_NAME)) utils.make('clean') utils.make('all') def get_thermals(self): therm0 = '-' therm1 = '-' try: therm0 = utils.read_file( '/sys/devices/virtual/thermal/thermal_zone0/temp') except: pass try: therm1 = utils.read_file( '/sys/devices/virtual/thermal/thermal_zone1/temp') except: pass return (therm0, therm1) def run_once(self, sec=(60*25)): """ Executes the test and logs the output. @param sec: seconds to test memory """ self._hammer_path = os.path.join(self.srcdir, self._DIR_NAME, 'rowhammer_test') logging.info('cmd: %s %d' % (self._hammer_path, sec)) # Grab the CPU temperature before hand if possible. logging.info('start temp: %s %s' % self.get_thermals()) try: output = subprocess.check_output([self._hammer_path, '%d' % sec]) logging.info("run complete. Output below:") logging.info(output) except subprocess.CalledProcessError, e: logging.error("Unsafe memory found!") logging.error(e.output) logging.info('end temp: %s %s' % self.get_thermals()) raise error.TestFail('Unsafe memory found!') logging.info('end temp: %s %s' % self.get_thermals()) return True