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 42*89ab8410SStephen Warren cmd = [] 43*89ab8410SStephen Warren if self.config.gdbserver: 44*89ab8410SStephen Warren cmd += ['gdbserver', self.config.gdbserver] 45*89ab8410SStephen Warren cmd += [ 4677bcb22dSStephen Warren self.config.build_dir + '/u-boot', 4777bcb22dSStephen Warren '-d', 4877bcb22dSStephen Warren self.config.build_dir + '/arch/sandbox/dts/test.dtb' 4977bcb22dSStephen Warren ] 50d27f2fc1SStephen Warren return Spawn(cmd, cwd=self.config.source_dir) 51d201506cSStephen Warren 52d201506cSStephen Warren def kill(self, sig): 53e8debf39SStephen Warren """Send a specific Unix signal to the sandbox process. 54d201506cSStephen Warren 55d201506cSStephen Warren Args: 56d201506cSStephen Warren sig: The Unix signal to send to the process. 57d201506cSStephen Warren 58d201506cSStephen Warren Returns: 59d201506cSStephen Warren Nothing. 60e8debf39SStephen Warren """ 61d201506cSStephen Warren 62d201506cSStephen Warren self.log.action('kill %d' % sig) 63d201506cSStephen Warren self.p.kill(sig) 64d201506cSStephen Warren 65d201506cSStephen Warren def validate_exited(self): 66e8debf39SStephen Warren """Determine whether the sandbox process has exited. 67d201506cSStephen Warren 68d201506cSStephen Warren If required, this function waits a reasonable time for the process to 69d201506cSStephen Warren exit. 70d201506cSStephen Warren 71d201506cSStephen Warren Args: 72d201506cSStephen Warren None. 73d201506cSStephen Warren 74d201506cSStephen Warren Returns: 75d201506cSStephen Warren Boolean indicating whether the process has exited. 76e8debf39SStephen Warren """ 77d201506cSStephen Warren 78d201506cSStephen Warren p = self.p 79d201506cSStephen Warren self.p = None 80d201506cSStephen Warren for i in xrange(100): 81d201506cSStephen Warren ret = not p.isalive() 82d201506cSStephen Warren if ret: 83d201506cSStephen Warren break 84d201506cSStephen Warren time.sleep(0.1) 85d201506cSStephen Warren p.close() 86d201506cSStephen Warren return ret 87