#!/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)
