[meta-xilinx] [meta-xilinx-bsp][PATCH 1/3] qemu multiarch: Replace shell based wrapper with python one
Manjukumar Matha
manjukumar.harthikote-matha at xilinx.com
Wed Dec 19 17:05:35 PST 2018
From: Alejandro Enedino Hernandez Samaniego <alejandr at xilinx.com>
The qemu-system-aarch64-multiarch wrapper parses the arguments
passed to it, and launches two separate instances of qemu
with the correct arguments for PMU and APU respectively.
Using a python based wrapper gives us more control over
how the calls to the qemu instances are made and how the
arguments are passed.
This patch replaces the old wrapper with a python based one
providing the same functionality as the old one but also
enables testimage to be run on qemu instances, switching the
tcp serial ports passed to qemu to be able to read the output
from qemurunner correctly
Signed-off-by: Alejandro Enedino Hernandez Samaniego <alejandr at xilinx.com>
Signed-off-by: Manjukumar Matha <manjukumar.harthikote-matha at xilinx.com>
---
.../qemu/files/qemu-system-aarch64-multiarch | 84 ++++++++++++++--------
1 file changed, 53 insertions(+), 31 deletions(-)
diff --git a/meta-xilinx-bsp/recipes-devtools/qemu/files/qemu-system-aarch64-multiarch b/meta-xilinx-bsp/recipes-devtools/qemu/files/qemu-system-aarch64-multiarch
index 15124c1..2c92c68 100644
--- a/meta-xilinx-bsp/recipes-devtools/qemu/files/qemu-system-aarch64-multiarch
+++ b/meta-xilinx-bsp/recipes-devtools/qemu/files/qemu-system-aarch64-multiarch
@@ -1,32 +1,54 @@
-#!/bin/bash
-
-BINPATH=$(dirname $0)
-MACHINE_PATH=$(mktemp -d)
-
-APU_ARGS=
-PMU_ARGS=
-
-while [ ! -z "$1" ]; do
- if [ "$1" = "-pmu-args" ]; then
- PMU_ARGS+=" $2"
- shift
- else
- APU_ARGS+=" $1"
- fi
- shift
-done
-
-PMU_ROM=$(last=; for i in $PMU_ARGS; do if [ "$last" = "-kernel" ]; then echo "$i"; break; fi; last=$i; done)
-if [ ! -e $PMU_ROM ]; then
- echo "------"
- echo "Error: Missing PMU ROM - $PMU_ROM"
- echo " See 'meta-xilinx/README.qemu.md' for more information on accquiring the PMU ROM."
- echo "------"
- exit 255
-fi
-
-# start the PMU instance
-$BINPATH/qemu-system-microblazeel $PMU_ARGS -machine-path $MACHINE_PATH &
-# start the APU instance
-$BINPATH/qemu-system-aarch64 $APU_ARGS -machine-path $MACHINE_PATH
+#!/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)
--
2.7.4
More information about the meta-xilinx
mailing list