1d201506cSStephen Warren# Copyright (c) 2015 Stephen Warren 2d201506cSStephen Warren# Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved. 3d201506cSStephen Warren# 4d201506cSStephen Warren# SPDX-License-Identifier: GPL-2.0 5d201506cSStephen Warren 6d201506cSStephen Warren# Logic to interact with the sandbox port of U-Boot, running as a sub-process. 7d201506cSStephen Warren 8d201506cSStephen Warrenimport time 9d201506cSStephen Warrenfrom u_boot_spawn import Spawn 10d201506cSStephen Warrenfrom u_boot_console_base import ConsoleBase 11d201506cSStephen Warren 12d201506cSStephen Warrenclass ConsoleSandbox(ConsoleBase): 13e8debf39SStephen Warren """Represents a connection to a sandbox U-Boot console, executed as a sub- 14e8debf39SStephen Warren process.""" 15d201506cSStephen Warren 16d201506cSStephen Warren def __init__(self, log, config): 17e8debf39SStephen Warren """Initialize a U-Boot console connection. 18d201506cSStephen Warren 19d201506cSStephen Warren Args: 20d201506cSStephen Warren log: A multiplexed_log.Logfile instance. 21d201506cSStephen Warren config: A "configuration" object as defined in conftest.py. 22d201506cSStephen Warren 23d201506cSStephen Warren Returns: 24d201506cSStephen Warren Nothing. 25e8debf39SStephen Warren """ 26d201506cSStephen Warren 27d201506cSStephen Warren super(ConsoleSandbox, self).__init__(log, config, max_fifo_fill=1024) 28d201506cSStephen Warren 29d201506cSStephen Warren def get_spawn(self): 30e8debf39SStephen Warren """Connect to a fresh U-Boot instance. 31d201506cSStephen Warren 32d201506cSStephen Warren A new sandbox process is created, so that U-Boot begins running from 33d201506cSStephen Warren scratch. 34d201506cSStephen Warren 35d201506cSStephen Warren Args: 36d201506cSStephen Warren None. 37d201506cSStephen Warren 38d201506cSStephen Warren Returns: 39d201506cSStephen Warren A u_boot_spawn.Spawn object that is attached to U-Boot. 40e8debf39SStephen Warren """ 41d201506cSStephen Warren 4277bcb22dSStephen Warren cmd = [ 4377bcb22dSStephen Warren self.config.build_dir + '/u-boot', 4477bcb22dSStephen Warren '-d', 4577bcb22dSStephen Warren self.config.build_dir + '/arch/sandbox/dts/test.dtb' 4677bcb22dSStephen Warren ] 47*d27f2fc1SStephen Warren return Spawn(cmd, cwd=self.config.source_dir) 48d201506cSStephen Warren 49d201506cSStephen Warren def kill(self, sig): 50e8debf39SStephen Warren """Send a specific Unix signal to the sandbox process. 51d201506cSStephen Warren 52d201506cSStephen Warren Args: 53d201506cSStephen Warren sig: The Unix signal to send to the process. 54d201506cSStephen Warren 55d201506cSStephen Warren Returns: 56d201506cSStephen Warren Nothing. 57e8debf39SStephen Warren """ 58d201506cSStephen Warren 59d201506cSStephen Warren self.log.action('kill %d' % sig) 60d201506cSStephen Warren self.p.kill(sig) 61d201506cSStephen Warren 62d201506cSStephen Warren def validate_exited(self): 63e8debf39SStephen Warren """Determine whether the sandbox process has exited. 64d201506cSStephen Warren 65d201506cSStephen Warren If required, this function waits a reasonable time for the process to 66d201506cSStephen Warren exit. 67d201506cSStephen Warren 68d201506cSStephen Warren Args: 69d201506cSStephen Warren None. 70d201506cSStephen Warren 71d201506cSStephen Warren Returns: 72d201506cSStephen Warren Boolean indicating whether the process has exited. 73e8debf39SStephen Warren """ 74d201506cSStephen Warren 75d201506cSStephen Warren p = self.p 76d201506cSStephen Warren self.p = None 77d201506cSStephen Warren for i in xrange(100): 78d201506cSStephen Warren ret = not p.isalive() 79d201506cSStephen Warren if ret: 80d201506cSStephen Warren break 81d201506cSStephen Warren time.sleep(0.1) 82d201506cSStephen Warren p.close() 83d201506cSStephen Warren return ret 84