#!/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:]
mbtype=''

if '-pmu-args' in APU_args:
    MB_args = APU_args[APU_args.index('-pmu-args')+1]
    APU_args.remove('-pmu-args')
    APU_args.remove(MB_args)
    MB_args = MB_args.split()
    PMU_rom = MB_args[MB_args.index('-kernel')+1]
    mbtype='PMU'
elif '-plm-args' in APU_args:
    MB_args = APU_args[APU_args.index('-plm-args')+1]
    APU_args.remove('-plm-args')
    APU_args.remove(MB_args)
    MB_args = MB_args.split()
    mbtype='PLM'
else:
    error_msg = '\nMultiarch not setup properly.'
    sys.exit(error_msg)

error_msg = None
if (mbtype == 'PMU' and os.path.exists(PMU_rom)) or mbtype == 'PLM':

    # 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]]

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

    # Debug prints
    print('\n%s instance cmd: %s\n' % (mbtype, mb_cmd))
    print('APU instance cmd: %s\n' % apu_cmd)


    # Invoke QEMU pmu instance
    process_pmu = subprocess.Popen(mb_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:
    if mbtype == 'PMU':
        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)
