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