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*a811779bSSimon Glass bcfg = self.config.buildconfig 43*a811779bSSimon Glass config_spl = bcfg.get('config_spl', 'n') == 'y' 44*a811779bSSimon Glass fname = '/spl/u-boot-spl' if config_spl else '/u-boot' 45*a811779bSSimon Glass print fname 4689ab8410SStephen Warren cmd = [] 4789ab8410SStephen Warren if self.config.gdbserver: 4889ab8410SStephen Warren cmd += ['gdbserver', self.config.gdbserver] 4989ab8410SStephen Warren cmd += [ 50*a811779bSSimon Glass self.config.build_dir + fname, 51eed095daSStephen Warren '-v', 5277bcb22dSStephen Warren '-d', 530671960bSSimon Glass self.config.dtb 5477bcb22dSStephen Warren ] 55d27f2fc1SStephen Warren return Spawn(cmd, cwd=self.config.source_dir) 56d201506cSStephen Warren 57d201506cSStephen Warren def kill(self, sig): 58e8debf39SStephen Warren """Send a specific Unix signal to the sandbox process. 59d201506cSStephen Warren 60d201506cSStephen Warren Args: 61d201506cSStephen Warren sig: The Unix signal to send to the process. 62d201506cSStephen Warren 63d201506cSStephen Warren Returns: 64d201506cSStephen Warren Nothing. 65e8debf39SStephen Warren """ 66d201506cSStephen Warren 67d201506cSStephen Warren self.log.action('kill %d' % sig) 68d201506cSStephen Warren self.p.kill(sig) 69d201506cSStephen Warren 70d201506cSStephen Warren def validate_exited(self): 71e8debf39SStephen Warren """Determine whether the sandbox process has exited. 72d201506cSStephen Warren 73d201506cSStephen Warren If required, this function waits a reasonable time for the process to 74d201506cSStephen Warren exit. 75d201506cSStephen Warren 76d201506cSStephen Warren Args: 77d201506cSStephen Warren None. 78d201506cSStephen Warren 79d201506cSStephen Warren Returns: 80d201506cSStephen Warren Boolean indicating whether the process has exited. 81e8debf39SStephen Warren """ 82d201506cSStephen Warren 83d201506cSStephen Warren p = self.p 84d201506cSStephen Warren self.p = None 85d201506cSStephen Warren for i in xrange(100): 86d201506cSStephen Warren ret = not p.isalive() 87d201506cSStephen Warren if ret: 88d201506cSStephen Warren break 89d201506cSStephen Warren time.sleep(0.1) 90d201506cSStephen Warren p.close() 91d201506cSStephen Warren return ret 92