Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | # SPDX-License-Identifier: GPL-2.0 # Copyright (c) 2015 Stephen Warren # Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved. # Logic to interact with the sandbox port of U-Boot, running as a sub-process. import time from u_boot_spawn import Spawn from u_boot_console_base import ConsoleBase class ConsoleSandbox(ConsoleBase): """Represents a connection to a sandbox U-Boot console, executed as a sub- process.""" def __init__(self, log, config): """Initialize a U-Boot console connection. Args: log: A multiplexed_log.Logfile instance. config: A "configuration" object as defined in conftest.py. Returns: Nothing. """ super(ConsoleSandbox, self).__init__(log, config, max_fifo_fill=1024) self.sandbox_flags = [] def get_spawn(self): """Connect to a fresh U-Boot instance. A new sandbox process is created, so that U-Boot begins running from scratch. Args: None. Returns: A u_boot_spawn.Spawn object that is attached to U-Boot. """ bcfg = self.config.buildconfig config_spl = bcfg.get('config_spl', 'n') == 'y' fname = '/spl/u-boot-spl' if config_spl else '/u-boot' print(fname) cmd = [] if self.config.gdbserver: cmd += ['gdbserver', self.config.gdbserver] cmd += [ self.config.build_dir + fname, '-v', '-d', self.config.dtb ] cmd += self.sandbox_flags return Spawn(cmd, cwd=self.config.source_dir) def restart_uboot_with_flags(self, flags): """Run U-Boot with the given command-line flags Args: flags: List of flags to pass, each a string Returns: A u_boot_spawn.Spawn object that is attached to U-Boot. """ try: self.sandbox_flags = flags return self.restart_uboot() finally: self.sandbox_flags = [] def kill(self, sig): """Send a specific Unix signal to the sandbox process. Args: sig: The Unix signal to send to the process. Returns: Nothing. """ self.log.action('kill %d' % sig) self.p.kill(sig) def validate_exited(self): """Determine whether the sandbox process has exited. If required, this function waits a reasonable time for the process to exit. Args: None. Returns: Boolean indicating whether the process has exited. """ p = self.p self.p = None for i in range(100): ret = not p.isalive() if ret: break time.sleep(0.1) p.close() return ret |