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