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): 13*e8debf39SStephen Warren """Represents a connection to a sandbox U-Boot console, executed as a sub- 14*e8debf39SStephen Warren process.""" 15d201506cSStephen Warren 16d201506cSStephen Warren def __init__(self, log, config): 17*e8debf39SStephen 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. 25*e8debf39SStephen Warren """ 26d201506cSStephen Warren 27d201506cSStephen Warren super(ConsoleSandbox, self).__init__(log, config, max_fifo_fill=1024) 28d201506cSStephen Warren 29d201506cSStephen Warren def get_spawn(self): 30*e8debf39SStephen 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. 40*e8debf39SStephen Warren """ 41d201506cSStephen Warren 42d201506cSStephen Warren return Spawn([self.config.build_dir + '/u-boot']) 43d201506cSStephen Warren 44d201506cSStephen Warren def kill(self, sig): 45*e8debf39SStephen Warren """Send a specific Unix signal to the sandbox process. 46d201506cSStephen Warren 47d201506cSStephen Warren Args: 48d201506cSStephen Warren sig: The Unix signal to send to the process. 49d201506cSStephen Warren 50d201506cSStephen Warren Returns: 51d201506cSStephen Warren Nothing. 52*e8debf39SStephen Warren """ 53d201506cSStephen Warren 54d201506cSStephen Warren self.log.action('kill %d' % sig) 55d201506cSStephen Warren self.p.kill(sig) 56d201506cSStephen Warren 57d201506cSStephen Warren def validate_exited(self): 58*e8debf39SStephen Warren """Determine whether the sandbox process has exited. 59d201506cSStephen Warren 60d201506cSStephen Warren If required, this function waits a reasonable time for the process to 61d201506cSStephen Warren exit. 62d201506cSStephen Warren 63d201506cSStephen Warren Args: 64d201506cSStephen Warren None. 65d201506cSStephen Warren 66d201506cSStephen Warren Returns: 67d201506cSStephen Warren Boolean indicating whether the process has exited. 68*e8debf39SStephen Warren """ 69d201506cSStephen Warren 70d201506cSStephen Warren p = self.p 71d201506cSStephen Warren self.p = None 72d201506cSStephen Warren for i in xrange(100): 73d201506cSStephen Warren ret = not p.isalive() 74d201506cSStephen Warren if ret: 75d201506cSStephen Warren break 76d201506cSStephen Warren time.sleep(0.1) 77d201506cSStephen Warren p.close() 78d201506cSStephen Warren return ret 79