aboutsummaryrefslogtreecommitdiffstats
path: root/meta-xilinx-bsp/recipes-devtools/qemu/files/qemu-system-aarch64-multiarch
blob: 2c92c686fbfc8652697e1132b2a14597f0a7a414 (plain)
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
#!/usr/bin/env python3

# Xilinx QEMU wrapper to launch both PMU and APU instances (multiarch)
import os
import subprocess
import sys
import tempfile
import shutil

binpath = os.path.dirname(os.path.abspath(__file__))
mach_path = tempfile.mkdtemp()


# Separate PMU and APU arguments
APU_args = sys.argv[1:]
PMU_args = APU_args[APU_args.index('-pmu-args')+1]
APU_args.remove('-pmu-args')
APU_args.remove(PMU_args)
PMU_args = PMU_args.split()

PMU_rom = PMU_args[PMU_args.index('-kernel')+1]
error_msg = None

if os.path.exists(PMU_rom):

    # We need to switch tcp serial arguments (if they exist, e.g. qemurunner) to get the output correctly
    tcp_serial_ports = [i for i, s in enumerate(APU_args) if 'tcp:127.0.0.1:' in s]

    # We can only switch these if there are exactly two, otherwise we can't assume what is being executed so we leave it as is
    if len(tcp_serial_ports) == 2:
        APU_args[tcp_serial_ports[0]],APU_args[tcp_serial_ports[1]] = APU_args[tcp_serial_ports[1]],APU_args[tcp_serial_ports[0]]

    pmu_cmd =  binpath + '/qemu-system-microblazeel ' + ' '.join(PMU_args) + ' -machine-path ' + mach_path
    apu_cmd =  binpath + '/qemu-system-aarch64 ' + ' '.join(APU_args) + ' -machine-path ' + mach_path

    # Debug prints
    print('\nPMU instance cmd: %s\n' % pmu_cmd)
    print('APU instance cmd: %s\n' % apu_cmd)


    # Invoke QEMU pmu instance
    process_pmu = subprocess.Popen(pmu_cmd, shell=True, stderr=subprocess.PIPE)

    # Invoke QEMU APU instance
    process_apu = subprocess.Popen(apu_cmd, shell=True, stderr=subprocess.PIPE)
    if process_apu.wait():
        error_msg = '\nQEMU APU instance failed:\n%s' % process_apu.stderr.read().decode()

else:
    error_msg = '\nError: Missing PMU ROM: %s' % PMU_rom
    error_msg += '\nSee "meta-xilinx/README.qemu.md" for more information on accquiring the PMU ROM.\n'

shutil.rmtree(mach_path)
sys.exit(error_msg)