Index: xen-4.12.4-testing/Config.mk
===================================================================
--- xen-4.12.4-testing.orig/Config.mk
+++ xen-4.12.4-testing/Config.mk
@@ -82,7 +82,7 @@ EXTRA_INCLUDES += $(EXTRA_PREFIX)/includ
 EXTRA_LIB += $(EXTRA_PREFIX)/lib
 endif
 
-PYTHON      ?= python
+PYTHON      ?= python3
 PYTHON_PREFIX_ARG ?= --prefix="$(prefix)"
 # The above requires that prefix contains *no spaces*. This variable is here
 # to permit the user to set PYTHON_PREFIX_ARG to '' to workaround this bug:
Index: xen-4.12.4-testing/tools/configure
===================================================================
--- xen-4.12.4-testing.orig/tools/configure
+++ xen-4.12.4-testing/tools/configure
@@ -6953,7 +6953,7 @@ if echo "$PYTHON" | grep -q "^/"; then :
     PYTHON=`basename $PYTHONPATH`
 
 elif test -z "$PYTHON"; then :
-  PYTHON="python"
+  PYTHON="python3"
 else
   as_fn_error $? "PYTHON specified, but is not an absolute path" "$LINENO" 5
 fi
@@ -7002,15 +7002,15 @@ if test x"${PYTHONPATH}" = x"no"
 then
     as_fn_error $? "Unable to find $PYTHON, please install $PYTHON" "$LINENO" 5
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for python version >= 2.3 " >&5
-$as_echo_n "checking for python version >= 2.3 ... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for python3 version >= 3.0 " >&5
+$as_echo_n "checking for python3 version >= 3.0 ... " >&6; }
 `$PYTHON -c 'import sys; sys.exit(eval("sys.version_info < (2, 3)"))'`
 if test "$?" != "0"
 then
     python_version=`$PYTHON -V 2>&1`
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
-    as_fn_error $? "$python_version is too old, minimum required version is 2.3" "$LINENO" 5
+    as_fn_error $? "$python_version is too old, minimum required version is 3.0" "$LINENO" 5
 else
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
@@ -7419,7 +7419,7 @@ if test "$cross_compiling" != yes; then
 ac_previous_cppflags=$CPPFLAGS
 ac_previous_ldflags=$LDFLAGS
 ac_python_version=`$PYTHON -c 'import distutils.sysconfig; \
-    print distutils.sysconfig.get_config_var("VERSION")'`
+    print(distutils.sysconfig.get_config_var(\"VERSION\"))'`
 # Extract the first word of "$PYTHON-config", so it can be a program name with args.
 set dummy $PYTHON-config; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
@@ -7464,20 +7464,20 @@ fi
 if test x"$pyconfig" = x"no"; then :
 
         CPPFLAGS="$CFLAGS `$PYTHON -c 'import distutils.sysconfig; \
-        print "-I" + distutils.sysconfig.get_config_var("INCLUDEPY")'`"
+        print("-I" + distutils.sysconfig.get_config_var(\"INCLUDEPY\"))'`"
     CPPFLAGS="$CPPFLAGS `$PYTHON -c 'import distutils.sysconfig; \
-        print distutils.sysconfig.get_config_var("CFLAGS")'`"
+        print(distutils.sysconfig.get_config_var(\"CFLAGS\"))'`"
     PYTHON_LIBS="$LDFLAGS `$PYTHON -c 'import distutils.sysconfig; \
-        print distutils.sysconfig.get_config_var("LIBS")'`"
+        print(distutils.sysconfig.get_config_var(\"LIBS\"))'`"
     PYTHON_LIBS="$LDFLAGS `$PYTHON -c 'import distutils.sysconfig; \
-        print distutils.sysconfig.get_config_var("SYSLIBS")'`"
+        print(distutils.sysconfig.get_config_var(\"SYSLIBS\"))'`"
     LDFLAGS="$LDFLAGS `$PYTHON -c 'import distutils.sysconfig; \
-        print "-L" + distutils.sysconfig.get_python_lib(plat_specific=1,\
-        standard_lib=1) + "/config"'`"
+        print("-L" + distutils.sysconfig.get_python_lib(plat_specific=1,\
+        standard_lib=1) + "/config")'`"
     LDFLAGS="$LDFLAGS `$PYTHON -c 'import distutils.sysconfig; \
-        print distutils.sysconfig.get_config_var("LINKFORSHARED")'`"
+        print(distutils.sysconfig.get_config_var(\"LINKFORSHARED\"))'`"
     LDFLAGS="$LDFLAGS `$PYTHON -c 'import distutils.sysconfig; \
-        print distutils.sysconfig.get_config_var("LDFLAGS")'`"
+        print(distutils.sysconfig.get_config_var(\"LDFLAGS\"))'`"
 
 else
 
@@ -7494,7 +7494,6 @@ else
   as_fn_error $? "Unable to find Python development headers" "$LINENO" 5
 fi
 
-
 as_ac_Lib=`$as_echo "ac_cv_lib_python$ac_python_version''_PyArg_ParseTuple" | $as_tr_sh`
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PyArg_ParseTuple in -lpython$ac_python_version" >&5
 $as_echo_n "checking for PyArg_ParseTuple in -lpython$ac_python_version... " >&6; }
Index: xen-4.12.4-testing/tools/python/test.py
===================================================================
--- xen-4.12.4-testing.orig/tools/python/test.py
+++ xen-4.12.4-testing/tools/python/test.py
@@ -1,4 +1,4 @@
-#! /usr/bin/env python2.3
+#!/usr/bin/python3
 ##############################################################################
 #
 # Copyright (c) 2001, 2002 Zope Corporation and Contributors.
@@ -289,9 +289,9 @@ class ImmediateTestResult(unittest._Text
     def stopTest(self, test):
         self._testtimes[test] = time.time() - self._testtimes[test]
         if gc.garbage:
-            print "The following test left garbage:"
-            print test
-            print gc.garbage
+            print("The following test left garbage:")
+            print(test)
+            print(gc.garbage)
             # XXX Perhaps eat the garbage here, so that the garbage isn't
             #     printed for every subsequent test.
 
@@ -301,23 +301,23 @@ class ImmediateTestResult(unittest._Text
                              and
                              t not in self._threads)]
         if new_threads:
-            print "The following test left new threads behind:"
-            print test
-            print "New thread(s):", new_threads
+            print("The following test left new threads behind:")
+            print(test)
+            print("New thread(s):", new_threads)
 
     def print_times(self, stream, count=None):
-        results = self._testtimes.items()
+        results = list(self._testtimes.items())
         results.sort(lambda x, y: cmp(y[1], x[1]))
         if count:
             n = min(count, len(results))
             if n:
-                print >>stream, "Top %d longest tests:" % n
+                print("Top %d longest tests:" % n, file=stream)
         else:
             n = len(results)
         if not n:
             return
         for i in range(n):
-            print >>stream, "%6dms" % int(results[i][1] * 1000), results[i][0]
+            print("%6dms" % int(results[i][1] * 1000), results[i][0], file=stream)
 
     def _print_traceback(self, msg, err, test, errlist):
         if self.showAll or self.dots or self._progress:
@@ -369,7 +369,7 @@ class ImmediateTestResult(unittest._Text
         if self._progress:
             self.stream.write("\r")
         if self._debug:
-            raise err[0], err[1], err[2]
+            raise err[0](err[1]).with_traceback(err[2])
         self._print_traceback("Error in test %s" % test, err,
                               test, self.errors)
 
@@ -377,7 +377,7 @@ class ImmediateTestResult(unittest._Text
         if self._progress:
             self.stream.write("\r")
         if self._debug:
-            raise err[0], err[1], err[2]
+            raise err[0](err[1]).with_traceback(err[2])
         self._print_traceback("Failure in test %s" % test, err,
                               test, self.failures)
 
@@ -480,11 +480,11 @@ class PathInit:
         kind = functional and "FUNCTIONAL" or "UNIT"
         if libdir:
             extra = os.path.join(self.org_cwd, libdir)
-            print "Running %s tests from %s" % (kind, extra)
+            print("Running %s tests from %s" % (kind, extra))
             self.libdir = extra
             sys.path.insert(0, extra)
         else:
-            print "Running %s tests from %s" % (kind, self.cwd)
+            print("Running %s tests from %s" % (kind, self.cwd))
         # Make sure functional tests find ftesting.zcml
         if functional:
             config_file = 'ftesting.zcml'
@@ -492,7 +492,7 @@ class PathInit:
                 # We chdired into build, so ftesting.zcml is in the
                 # parent directory
                 config_file = os.path.join('..', 'ftesting.zcml')
-            print "Parsing %s" % config_file
+            print("Parsing %s" % config_file)
             from zope.app.tests.functional import FunctionalTestSetup
             FunctionalTestSetup(config_file)
 
@@ -530,7 +530,7 @@ class TestFileFinder:
         if not "__init__.py" in files:
             if not files or files == ["CVS"]:
                 return
-            print "not a package", dir
+            print("not a package", dir)
             return
 
         # Put matching files in matches.  If matches is non-empty,
@@ -549,9 +549,9 @@ class TestFileFinder:
             __import__(pkg)
         # We specifically do not want to catch ImportError since that's useful
         # information to know when running the tests.
-        except RuntimeError, e:
+        except RuntimeError as e:
             if VERBOSE:
-                print "skipping %s because: %s" % (pkg, e)
+                print("skipping %s because: %s" % (pkg, e))
             return
         else:
             self.files.extend(matches)
@@ -698,16 +698,16 @@ class TrackRefs:
         ct = [(type2count[t] - self.type2count.get(t, 0),
                type2all[t] - self.type2all.get(t, 0),
                t)
-              for t in type2count.iterkeys()]
+              for t in type2count.keys()]
         ct.sort()
         ct.reverse()
         printed = False
         for delta1, delta2, t in ct:
             if delta1 or delta2:
                 if not printed:
-                    print "%-55s %8s %8s" % ('', 'insts', 'refs')
+                    print("%-55s %8s %8s" % ('', 'insts', 'refs'))
                     printed = True
-                print "%-55s %8d %8d" % (t, delta1, delta2)
+                print("%-55s %8d %8d" % (t, delta1, delta2))
 
         self.type2count = type2count
         self.type2all = type2all
@@ -729,25 +729,25 @@ def runner(files, test_filter, debug):
         if TIMESFN:
             r.print_times(open(TIMESFN, "w"))
             if VERBOSE:
-                print "Wrote timing data to", TIMESFN
+                print("Wrote timing data to", TIMESFN)
         if TIMETESTS:
             r.print_times(sys.stdout, TIMETESTS)
     except:
         if DEBUGGER:
-            print "%s:" % (sys.exc_info()[0], )
-            print sys.exc_info()[1]
+            print("%s:" % (sys.exc_info()[0], ))
+            print(sys.exc_info()[1])
             pdb.post_mortem(sys.exc_info()[2])
         else:
             raise
 
 def remove_stale_bytecode(arg, dirname, names):
-    names = map(os.path.normcase, names)
+    names = list(map(os.path.normcase, names))
     for name in names:
         if name.endswith(".pyc") or name.endswith(".pyo"):
             srcname = name[:-1]
             if srcname not in names:
                 fullname = os.path.join(dirname, name)
-                print "Removing stale bytecode file", fullname
+                print("Removing stale bytecode file", fullname)
                 os.unlink(fullname)
 
 def main(module_filter, test_filter, libdir):
@@ -773,12 +773,12 @@ def main(module_filter, test_filter, lib
             runner(files, test_filter, DEBUG)
             gc.collect()
             if gc.garbage:
-                print "GARBAGE:", len(gc.garbage), gc.garbage
+                print("GARBAGE:", len(gc.garbage), gc.garbage)
                 return
             if REFCOUNT:
                 prev = rc
                 rc = sys.gettotalrefcount()
-                print "totalrefcount=%-8d change=%-6d" % (rc, rc - prev)
+                print("totalrefcount=%-8d change=%-6d" % (rc, rc - prev))
                 track.update()
     else:
         runner(files, test_filter, DEBUG)
@@ -801,7 +801,7 @@ def configure_logging():
     else:
         logging.basicConfig()
 
-    if os.environ.has_key("LOGGING"):
+    if "LOGGING" in os.environ:
         level = int(os.environ["LOGGING"])
         logging.getLogger().setLevel(level)
 
@@ -865,8 +865,8 @@ def process_args(argv=None):
 
     # import the config file
     if os.path.isfile(config_filename):
-        print 'Configuration file found.'
-        execfile(config_filename, globals())
+        print('Configuration file found.')
+        exec(compile(open(config_filename).read(), config_filename, 'exec'), globals())
 
 
     try:
@@ -884,9 +884,9 @@ def process_args(argv=None):
     # fixme: add the long names
     # fixme: add the extra documentation
     # fixme: test for functional first!
-    except getopt.error, msg:
-        print msg
-        print "Try `python %s -h' for more information." % argv[0]
+    except getopt.error as msg:
+        print(msg)
+        print("Try `python %s -h' for more information." % argv[0])
         sys.exit(2)
 
     for k, v in opts:
@@ -916,13 +916,13 @@ def process_args(argv=None):
             RUN_UNIT = True
             RUN_FUNCTIONAL = True
         elif k in ("-h", "--help"):
-            print __doc__
+            print(__doc__)
             sys.exit(0)
         elif k in ("-g", "--gc-threshold"):
             GC_THRESHOLD = int(v)
         elif k in ("-G", "--gc-option"):
             if not v.startswith("DEBUG_"):
-                print "-G argument must be DEBUG_ flag, not", repr(v)
+                print("-G argument must be DEBUG_ flag, not", repr(v))
                 sys.exit(1)
             GC_FLAGS.append(v)
         elif k in ('-k', '--keepbytecode'):
@@ -968,30 +968,30 @@ def process_args(argv=None):
         import pychecker.checker
 
     if REFCOUNT and not hasattr(sys, "gettotalrefcount"):
-        print "-r ignored, because it needs a debug build of Python"
+        print("-r ignored, because it needs a debug build of Python")
         REFCOUNT = False
 
     if sys.version_info < ( 2,3,2 ):
-        print """\
+        print("""\
         ERROR: Your python version is not supported by Zope3.
-        Zope3 needs Python 2.3.2 or greater. You are running:""" + sys.version
+        Zope3 needs Python 2.3.2 or greater. You are running:""" + sys.version)
         sys.exit(1)
 
     if GC_THRESHOLD is not None:
         if GC_THRESHOLD == 0:
             gc.disable()
-            print "gc disabled"
+            print("gc disabled")
         else:
             gc.set_threshold(GC_THRESHOLD)
-            print "gc threshold:", gc.get_threshold()
+            print("gc threshold:", gc.get_threshold())
 
     if GC_FLAGS:
         val = 0
         for flag in GC_FLAGS:
             v = getattr(gc, flag, None)
             if v is None:
-                print "Unknown gc flag", repr(flag)
-                print gc.set_debug.__doc__
+                print("Unknown gc flag", repr(flag))
+                print(gc.set_debug.__doc__)
                 sys.exit(1)
             val |= v
         gcdebug |= v
@@ -1009,10 +1009,10 @@ def process_args(argv=None):
         if BUILD_INPLACE:
             cmd += "_ext -i"
         if VERBOSE:
-            print cmd
+            print(cmd)
         sts = os.system(cmd)
         if sts:
-            print "Build failed", hex(sts)
+            print("Build failed", hex(sts))
             sys.exit(1)
 
     k = []
@@ -1027,9 +1027,9 @@ def process_args(argv=None):
         if VERBOSE:
             kind = functional and "FUNCTIONAL" or "UNIT"
             if LEVEL == 0:
-                print "Running %s tests at all levels" % kind
+                print("Running %s tests at all levels" % kind)
             else:
-                print "Running %s tests at level %d" % (kind, LEVEL)
+                print("Running %s tests at level %d" % (kind, LEVEL))
 
 # This was to avoid functional tests outside of z3, but this doesn't really
 # work right.
@@ -1073,20 +1073,20 @@ def process_args(argv=None):
                               globals=globals(), locals=vars())
                 r = tracer.results()
                 path = "/tmp/trace.%s" % os.getpid()
-                import cPickle
+                import pickle
                 f = open(path, "wb")
-                cPickle.dump(r, f)
+                pickle.dump(r, f)
                 f.close()
-                print path
+                print(path)
                 r.write_results(show_missing=True,
                                 summary=True, coverdir=coverdir)
             else:
                 bad = main(MODULE_FILTER, TEST_FILTER, LIBDIR)
                 if bad:
                     sys.exit(1)
-        except ImportError, err:
-            print err
-            print sys.path
+        except ImportError as err:
+            print(err)
+            print(sys.path)
             raise
 
 
Index: xen-4.12.4-testing/tools/configure.ac
===================================================================
--- xen-4.12.4-testing.orig/tools/configure.ac
+++ xen-4.12.4-testing/tools/configure.ac
@@ -355,10 +355,10 @@ esac
 AS_IF([echo "$PYTHON" | grep -q "^/"], [
     PYTHONPATH=$PYTHON
     PYTHON=`basename $PYTHONPATH`
-],[test -z "$PYTHON"], [PYTHON="python"],
+],[test -z "$PYTHON"], [PYTHON="python3"],
 [AC_MSG_ERROR([PYTHON specified, but is not an absolute path])])
 AX_PATH_PROG_OR_FAIL([PYTHONPATH], [$PYTHON])
-AX_CHECK_PYTHON_VERSION([2], [3])
+AX_CHECK_PYTHON_VERSION([3], [0])
 
 AS_IF([test "$cross_compiling" != yes], [
     AX_CHECK_PYTHON_DEVEL()
Index: xen-4.12.4-testing/m4/python_devel.m4
===================================================================
--- xen-4.12.4-testing.orig/m4/python_devel.m4
+++ xen-4.12.4-testing/m4/python_devel.m4
@@ -2,25 +2,25 @@ AC_DEFUN([AX_CHECK_PYTHON_DEVEL], [
 ac_previous_cppflags=$CPPFLAGS
 ac_previous_ldflags=$LDFLAGS
 ac_python_version=`$PYTHON -c 'import distutils.sysconfig; \
-    print distutils.sysconfig.get_config_var("VERSION")'`
+    print(distutils.sysconfig.get_config_var("VERSION"))'`
 AC_PATH_PROG([pyconfig], [$PYTHON-config], [no])
 AS_IF([test x"$pyconfig" = x"no"], [
     dnl For those that don't have python-config
     CPPFLAGS="$CFLAGS `$PYTHON -c 'import distutils.sysconfig; \
-        print "-I" + distutils.sysconfig.get_config_var("INCLUDEPY")'`"
+        print("-I" + distutils.sysconfig.get_config_var("INCLUDEPY"))'`"
     CPPFLAGS="$CPPFLAGS `$PYTHON -c 'import distutils.sysconfig; \
-        print distutils.sysconfig.get_config_var("CFLAGS")'`"
+        print(distutils.sysconfig.get_config_var("CFLAGS"))'`"
     PYTHON_LIBS="$LDFLAGS `$PYTHON -c 'import distutils.sysconfig; \
-        print distutils.sysconfig.get_config_var("LIBS")'`"
+        print(distutils.sysconfig.get_config_var("LIBS"))'`"
     PYTHON_LIBS="$LDFLAGS `$PYTHON -c 'import distutils.sysconfig; \
-        print distutils.sysconfig.get_config_var("SYSLIBS")'`"
+        print(distutils.sysconfig.get_config_var("SYSLIBS"))'`"
     LDFLAGS="$LDFLAGS `$PYTHON -c 'import distutils.sysconfig; \
-        print "-L" + distutils.sysconfig.get_python_lib(plat_specific=1,\
-        standard_lib=1) + "/config"'`"
+        print("-L" + distutils.sysconfig.get_python_lib(plat_specific=1,\
+        standard_lib=1) + "/config")'`"
     LDFLAGS="$LDFLAGS `$PYTHON -c 'import distutils.sysconfig; \
-        print distutils.sysconfig.get_config_var("LINKFORSHARED")'`"
+        print(distutils.sysconfig.get_config_var("LINKFORSHARED"))'`"
     LDFLAGS="$LDFLAGS `$PYTHON -c 'import distutils.sysconfig; \
-        print distutils.sysconfig.get_config_var("LDFLAGS")'`"
+        print(distutils.sysconfig.get_config_var("LDFLAGS"))'`"
 ], [
     dnl If python-config is found use it
     CPPFLAGS="$CFLAGS `$PYTHON-config --cflags`"
@@ -30,9 +30,6 @@ AS_IF([test x"$pyconfig" = x"no"], [
 
 AC_CHECK_HEADER([Python.h], [],
     [AC_MSG_ERROR([Unable to find Python development headers])],)
-AC_CHECK_LIB(python$ac_python_version, PyArg_ParseTuple, [],
-    [AC_MSG_ERROR([Unable to find a suitable python development library])],
-    [$PYTHON_LIBS])
 CPPFLAGS=$ac_previous_cppflags
 LDFLAGS=$ac_previous_ldflags
 ])
Index: xen-4.12.4-testing/tools/libxl/idl.py
===================================================================
--- xen-4.12.4-testing.orig/tools/libxl/idl.py
+++ xen-4.12.4-testing/tools/libxl/idl.py
@@ -11,7 +11,7 @@ DIR_BOTH = 3
 _default_namespace = ""
 def namespace(s):
     if type(s) != str:
-        raise TypeError, "Require a string for the default namespace."
+        raise TypeError("Require a string for the default namespace.")
     global _default_namespace
     _default_namespace = s
 
@@ -269,7 +269,7 @@ class KeyedUnion(Aggregate):
         if not isinstance(keyvar_type, Enumeration):
             raise ValueError
 
-        kv_kwargs = dict([(x.lstrip('keyvar_'),y) for (x,y) in kwargs.items() if x.startswith('keyvar_')])
+        kv_kwargs = dict([(x.lstrip('keyvar_'),y) for (x,y) in list(kwargs.items()) if x.startswith('keyvar_')])
         
         self.keyvar = Field(keyvar_type, keyvar_name, **kv_kwargs)
 
@@ -315,7 +315,7 @@ class Array(Type):
         kwargs.setdefault('json_parse_type', 'JSON_ARRAY')
         Type.__init__(self, namespace=elem_type.namespace, typename=elem_type.rawname + " *", **kwargs)
 
-        lv_kwargs = dict([(x.lstrip('lenvar_'),y) for (x,y) in kwargs.items() if x.startswith('lenvar_')])
+        lv_kwargs = dict([(x.lstrip('lenvar_'),y) for (x,y) in list(kwargs.items()) if x.startswith('lenvar_')])
 
         self.lenvar = Field(integer, lenvar_name, **lv_kwargs)
         self.elem_type = elem_type
@@ -346,12 +346,12 @@ class OrderedDict(dict):
         return [(x,self[x]) for x in self.__ordered]
 
 def parse(f):
-    print >>sys.stderr, "Parsing %s" % f
+    print("Parsing %s" % f, file=sys.stderr)
 
     globs = {}
     locs = OrderedDict()
 
-    for n,t in globals().items():
+    for n,t in list(globals().items()):
         if isinstance(t, Type):
             globs[n] = t
         elif isinstance(t,type(object)) and issubclass(t, Type):
@@ -362,11 +362,10 @@ def parse(f):
             globs[n] = t
 
     try:
-        execfile(f, globs, locs)
-    except SyntaxError,e:
-        raise SyntaxError, \
-              "Errors were found at line %d while processing %s:\n\t%s"\
-              %(e.lineno,f,e.text)
+        exec(compile(open(f).read(), f, 'exec'), globs, locs)
+    except SyntaxError as e:
+        raise SyntaxError("Errors were found at line %d while processing %s:\n\t%s"\
+              %(e.lineno,f,e.text))
 
     types = [t for t in locs.ordered_values() if isinstance(t,Type)]
 
Index: xen-4.12.4-testing/tools/libxl/gentest.py
===================================================================
--- xen-4.12.4-testing.orig/tools/libxl/gentest.py
+++ xen-4.12.4-testing/tools/libxl/gentest.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 import os
 import sys
@@ -86,7 +86,7 @@ def gen_rand_init(ty, v, indent = "    "
 
 if __name__ == '__main__':
     if len(sys.argv) < 3:
-        print >>sys.stderr, "Usage: gentest.py <idl> <implementation>"
+        print("Usage: gentest.py <idl> <implementation>", file=sys.stderr)
         sys.exit(1)
 
     random.seed(os.getenv('LIBXL_TESTIDL_SEED'))
Index: xen-4.12.4-testing/tools/libxl/gentypes.py
===================================================================
--- xen-4.12.4-testing.orig/tools/libxl/gentypes.py
+++ xen-4.12.4-testing/tools/libxl/gentypes.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 import sys
 import re
@@ -576,14 +576,14 @@ def libxl_C_enum_from_string(ty, str, e,
 
 if __name__ == '__main__':
     if len(sys.argv) != 6:
-        print >>sys.stderr, "Usage: gentypes.py <idl> <header> <header-private> <header-json> <implementation>"
+        print("Usage: gentypes.py <idl> <header> <header-private> <header-json> <implementation>", file=sys.stderr)
         sys.exit(1)
 
     (_, idlname, header, header_private, header_json, impl) = sys.argv
 
     (builtins,types) = idl.parse(idlname)
 
-    print "outputting libxl type definitions to %s" % header
+    print("outputting libxl type definitions to %s" % header)
 
     f = open(header, "w")
 
@@ -633,7 +633,7 @@ if __name__ == '__main__':
     f.write("""#endif /* %s */\n""" % (header_define))
     f.close()
 
-    print "outputting libxl JSON definitions to %s" % header_json
+    print("outputting libxl JSON definitions to %s" % header_json)
 
     f = open(header_json, "w")
 
@@ -657,7 +657,7 @@ if __name__ == '__main__':
     f.write("""#endif /* %s */\n""" % header_json_define)
     f.close()
 
-    print "outputting libxl type internal definitions to %s" % header_private
+    print("outputting libxl type internal definitions to %s" % header_private)
 
     f = open(header_private, "w")
 
@@ -683,7 +683,7 @@ if __name__ == '__main__':
     f.write("""#endif /* %s */\n""" % header_json_define)
     f.close()
 
-    print "outputting libxl type implementations to %s" % impl
+    print("outputting libxl type implementations to %s" % impl)
 
     f = open(impl, "w")
     f.write("""
Index: xen-4.12.4-testing/tools/ocaml/libs/xl/genwrap.py
===================================================================
--- xen-4.12.4-testing.orig/tools/ocaml/libs/xl/genwrap.py
+++ xen-4.12.4-testing/tools/ocaml/libs/xl/genwrap.py
@@ -1,8 +1,9 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 import sys,os
 
 import idl
+from functools import reduce
 
 # typename -> ( ocaml_type, c_from_ocaml, ocaml_from_c )
 builtins = {
@@ -78,7 +79,7 @@ def ocaml_type_of(ty):
     elif isinstance(ty,idl.Array):
         return "%s array" % ocaml_type_of(ty.elem_type)
     elif isinstance(ty,idl.Builtin):
-        if not builtins.has_key(ty.typename):
+        if ty.typename not in builtins:
             raise NotImplementedError("Unknown Builtin %s (%s)" % (ty.typename, type(ty)))
         typename,_,_ = builtins[ty.typename]
         if not typename:
@@ -251,7 +252,7 @@ def gen_ocaml_ml(ty, interface, indent="
             else:
                 s += "\texternal default : ctx -> %sunit -> t = \"stub_libxl_%s_init\"\n" % (union_args, ty.rawname)
 
-        if functions.has_key(ty.rawname):
+        if ty.rawname in functions:
             for name,args in functions[ty.rawname]:
                 s += "\texternal %s : " % name
                 s += " -> ".join(args)
@@ -278,7 +279,7 @@ def c_val(ty, c, o, indent="", parent =
         else:
             s += "%s = Int_val(%s);" % (c, o)
     elif isinstance(ty,idl.Builtin):
-        if not builtins.has_key(ty.typename):
+        if ty.typename not in builtins:
             raise NotImplementedError("Unknown Builtin %s (%s)" % (ty.typename, type(ty)))
         _,fn,_ = builtins[ty.typename]
         if not fn:
@@ -375,7 +376,7 @@ def ocaml_Val(ty, o, c, indent="", paren
         else:
             s += "%s = Val_int(%s);" % (o, c)
     elif isinstance(ty,idl.Builtin):
-        if not builtins.has_key(ty.typename):
+        if ty.typename not in builtins:
             raise NotImplementedError("Unknown Builtin %s (%s)" % (ty.typename, type(ty)))
         _,_,fn = builtins[ty.typename]
         if not fn:
@@ -513,14 +514,14 @@ def gen_c_defaults(ty):
 def autogen_header(open_comment, close_comment):
     s = open_comment + " AUTO-GENERATED FILE DO NOT EDIT " + close_comment + "\n"
     s += open_comment + " autogenerated by \n"
-    s += reduce(lambda x,y: x + " ", range(len(open_comment + " ")), "")
+    s += reduce(lambda x,y: x + " ", list(range(len(open_comment + " "))), "")
     s += "%s" % " ".join(sys.argv)
     s += "\n " + close_comment + "\n\n"
     return s
 
 if __name__ == '__main__':
     if len(sys.argv) < 4:
-        print >>sys.stderr, "Usage: genwrap.py <idl> <mli> <ml> <c-inc>"
+        print("Usage: genwrap.py <idl> <mli> <ml> <c-inc>", file=sys.stderr)
         sys.exit(1)
 
     (_,types) = idl.parse(sys.argv[1])
@@ -533,7 +534,7 @@ if __name__ == '__main__':
 
     for t in blacklist:
         if t not in [ty.rawname for ty in types]:
-            print "unknown type %s in blacklist" % t
+            print("unknown type %s in blacklist" % t)
 
     types = [ty for ty in types if not ty.rawname in blacklist]
 
@@ -564,7 +565,7 @@ if __name__ == '__main__':
             cinc.write("\n")
         cinc.write(gen_Val_ocaml(ty))
         cinc.write("\n")
-        if functions.has_key(ty.rawname):
+        if ty.rawname in functions:
             cinc.write(gen_c_stub_prototype(ty, functions[ty.rawname]))
             cinc.write("\n")
         if ty.init_fn is not None:
Index: xen-4.12.4-testing/tools/ocaml/libs/xentoollog/genlevels.py
===================================================================
--- xen-4.12.4-testing.orig/tools/ocaml/libs/xentoollog/genlevels.py
+++ xen-4.12.4-testing/tools/ocaml/libs/xentoollog/genlevels.py
@@ -1,6 +1,7 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 import sys
+from functools import reduce
 
 def read_levels():
 	f = open('../../../libs/toollog/include/xentoollog.h', 'r')
@@ -86,14 +87,14 @@ def gen_c(level):
 def autogen_header(open_comment, close_comment):
     s = open_comment + " AUTO-GENERATED FILE DO NOT EDIT " + close_comment + "\n"
     s += open_comment + " autogenerated by \n"
-    s += reduce(lambda x,y: x + " ", range(len(open_comment + " ")), "")
+    s += reduce(lambda x,y: x + " ", list(range(len(open_comment + " "))), "")
     s += "%s" % " ".join(sys.argv)
     s += "\n " + close_comment + "\n\n"
     return s
 
 if __name__ == '__main__':
 	if len(sys.argv) < 3:
-		print >>sys.stderr, "Usage: genlevels.py <mli> <ml> <c-inc>"
+		print("Usage: genlevels.py <mli> <ml> <c-inc>", file=sys.stderr)
 		sys.exit(1)
 
 	levels, olevels = read_levels()
Index: xen-4.12.4-testing/tools/include/xen-foreign/mkheader.py
===================================================================
--- xen-4.12.4-testing.orig/tools/include/xen-foreign/mkheader.py
+++ xen-4.12.4-testing/tools/include/xen-foreign/mkheader.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 import sys, re;
 from structs import unions, structs, defines;
@@ -205,8 +205,8 @@ for struct in structs:
     output = re.sub("\\b(%s)_t\\b" % struct, "\\1_%s_t" % arch, output);
 
 # replace: integer types
-integers = inttypes[arch].keys();
-integers.sort(lambda a, b: cmp(len(b),len(a)));
+integers = list(inttypes[arch].keys());
+integers.sort(key = len, reverse=True)
 for type in integers:
     output = re.sub("\\b%s\\b" % type, inttypes[arch][type], output);
 
Index: xen-4.12.4-testing/tools/include/xen-foreign/mkchecker.py
===================================================================
--- xen-4.12.4-testing.orig/tools/include/xen-foreign/mkchecker.py
+++ xen-4.12.4-testing/tools/include/xen-foreign/mkchecker.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 import sys;
 from structs import structs, compat_arches;
@@ -37,7 +37,7 @@ for struct in structs:
     f.write('\tprintf("%%-25s |", "%s");\n' % struct);
     for a in archs:
         s = struct + "_" + a;
-        if compat_arches.has_key(a):
+        if a in compat_arches:
             compat = compat_arches[a]
             c = struct + "_" + compat;
         else:
Index: xen-4.12.4-testing/xen/tools/gen-cpuid.py
===================================================================
--- xen-4.12.4-testing.orig/xen/tools/gen-cpuid.py
+++ xen-4.12.4-testing/xen/tools/gen-cpuid.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
 # -*- coding: utf-8 -*-
 
 import sys, os, re
@@ -336,14 +336,14 @@ def crunch_numbers(state):
 
         state.deep_deps[feat] = seen[1:]
 
-    state.deep_features = deps.keys()
-    state.nr_deep_deps = len(state.deep_deps.keys())
+    state.deep_features = list(deps.keys())
+    state.nr_deep_deps = len(list(state.deep_deps.keys()))
 
     # Calculate the bitfield name declarations
-    for word in xrange(state.nr_entries):
+    for word in range(state.nr_entries):
 
         names = []
-        for bit in xrange(32):
+        for bit in range(32):
 
             name = state.names.get(word * 32 + bit, "")
 
@@ -417,7 +417,7 @@ def write_results(state):
 """)
 
     try:
-        _tmp = state.values.iteritems()
+        _tmp = state.values.items()
     except AttributeError:
         _tmp = state.values.items()
 
Index: xen-4.12.4-testing/xen/tools/compat-build-source.py
===================================================================
--- xen-4.12.4-testing.orig/xen/tools/compat-build-source.py
+++ xen-4.12.4-testing/xen/tools/compat-build-source.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
 
 import re,sys
 
Index: xen-4.12.4-testing/xen/tools/compat-build-header.py
===================================================================
--- xen-4.12.4-testing.orig/xen/tools/compat-build-header.py
+++ xen-4.12.4-testing/xen/tools/compat-build-header.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
 
 import re,sys
 
Index: xen-4.12.4-testing/xen/xsm/flask/gen-policy.py
===================================================================
--- xen-4.12.4-testing.orig/xen/xsm/flask/gen-policy.py
+++ xen-4.12.4-testing/xen/xsm/flask/gen-policy.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
 import sys
 
 policy_size = 0
Index: xen-4.12.4-testing/xen/tools/fig-to-oct.py
===================================================================
--- xen-4.12.4-testing.orig/xen/tools/fig-to-oct.py
+++ xen-4.12.4-testing/xen/tools/fig-to-oct.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
 import sys
 
 chars_per_line = 18
Index: xen-4.12.4-testing/tools/misc/xensymoops
===================================================================
--- xen-4.12.4-testing.orig/tools/misc/xensymoops
+++ xen-4.12.4-testing/tools/misc/xensymoops
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
 
 # An oops analyser for Xen
 # Usage: xensymoops path-to-xen.s < oops-message
@@ -43,12 +43,12 @@ def read_oops():
     return (eip_addr, stack_addresses)
 
 def usage():
-    print >> sys.stderr, """Usage: %s path-to-asm < oops-msg
+    print("""Usage: %s path-to-asm < oops-msg
     The oops message should be fed to the standard input.  The
     command-line argument specifies the path to the Xen assembly dump
     produced by \"make debug\".  The location of EIP and the backtrace
     will be output to standard output.
-    """ % sys.argv[0]
+    """ % sys.argv[0], file=sys.stderr)
     sys.exit()
 
 ##### main
@@ -99,7 +99,7 @@ while True:
 
     # if this address was seen as a potential code address in the backtrace then
     # record it in the backtrace list
-    if stk_addrs.has_key(address):
+    if address in stk_addrs:
         backtrace.append((stk_addrs[address], address, func))
 
     # if this was the address that EIP...
@@ -107,12 +107,12 @@ while True:
         eip_func = func
 
 
-print "EIP %s in function %s" % (eip_addr, eip_func)
-print "Backtrace:"
+print("EIP %s in function %s" % (eip_addr, eip_func))
+print("Backtrace:")
 
 # sorting will order primarily by the first element of each tuple,
 # i.e. the order in the original oops
 backtrace.sort()
 
 for (i, a, f) in backtrace:
-    print "%s in function %s" % ( a, f )
+    print("%s in function %s" % ( a, f ))
