xref: /rk3399_rockchip-uboot/test/py/u_boot_console_sandbox.py (revision ebe621d5fb2f5c15aff50e0610372f2751fd152f)
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