util: Install scons 3.1 from pip in gcn-gpu dockerfile
[gem5.git] / util / gen_arm_fs_files.py
index 40d7aee07a5557868748f6f9d13f3adb3306f685..ea05fe189db4ca77e163ab34914594e6bd4b5b84 100755 (executable)
@@ -1,5 +1,17 @@
 #!/usr/bin/env python2.7
 
+# Copyright (c) 2020 ARM Limited
+# All rights reserved.
+#
+# The license below extends only to copyright in the software and shall
+# not be construed as granting a license to any other intellectual
+# property including but not limited to intellectual property relating
+# to a hardware implementation of the functionality of the software
+# licensed hereunder.  You may use the software subject to the license
+# terms below provided that you ensure that this notice is replicated
+# unmodified and in its entirety in all distributions of the software,
+# modified or unmodified, in source code or in binary form.
+#
 # Copyright (c) 2017-2018 Metempsy Technology Consulting
 # All rights reserved.
 #
@@ -52,9 +64,263 @@ def run_cmd(explanation, working_dir, cmd, stdout = None):
     print "Error running phase %s. Returncode: %d" % (explanation, return_code)
     sys.exit(1)
 
+def linux_clone():
+    kernel_vexpress_gem5_dir = os.path.join(
+        options.dest_dir, "linux-kernel-vexpress_gem5")
+
+    run_cmd("clone linux kernel for VExpress_GEM5_V1 platform",
+        options.dest_dir,
+        ["git", "clone", "https://gem5.googlesource.com/arm/linux",
+         kernel_vexpress_gem5_dir])
+
+def linux64():
+    kernel_vexpress_gem5_dir = os.path.join(
+        options.dest_dir, "linux-kernel-vexpress_gem5")
+
+    linux_bin = os.path.join(
+        binaries_dir, "vmlinux.vexpress_gem5_v1_64")
+
+    with open(revisions_dir + "/linux", "w+") as rev_file:
+        run_cmd("write revision of linux-kernel-vexpress_gem5 repo",
+            kernel_vexpress_gem5_dir,
+            ["git", "rev-parse", "--short", "HEAD"],
+            rev_file)
+
+    run_cmd("configure kernel for arm64",
+        kernel_vexpress_gem5_dir,
+        ["make", "ARCH=arm64", "CROSS_COMPILE=aarch64-linux-gnu-",
+         "gem5_defconfig", make_jobs_str])
+    run_cmd("compile kernel for arm64",
+        kernel_vexpress_gem5_dir,
+        ["make", "ARCH=arm64", "CROSS_COMPILE=aarch64-linux-gnu-",
+        make_jobs_str])
+    run_cmd("copy arm64 vmlinux",
+        kernel_vexpress_gem5_dir,
+        ["cp", "vmlinux", linux_bin])
+    run_cmd("cleanup arm64 kernel compilation",
+        kernel_vexpress_gem5_dir,
+        ["make", "distclean"])
+
+def linux32():
+    kernel_vexpress_gem5_dir = os.path.join(
+        options.dest_dir, "linux-kernel-vexpress_gem5")
+
+    linux_bin = os.path.join(
+        binaries_dir, "vmlinux.vexpress_gem5_v1")
+
+    run_cmd("configure kernel for arm",
+        kernel_vexpress_gem5_dir,
+        ["make", "ARCH=arm", "CROSS_COMPILE=arm-linux-gnueabihf-",
+         "gem5_defconfig"])
+    run_cmd("compile kernel for arm",
+        kernel_vexpress_gem5_dir,
+        ["make", "ARCH=arm", "CROSS_COMPILE=arm-linux-gnueabihf-",
+        make_jobs_str])
+    run_cmd("copy arm vmlinux",
+        kernel_vexpress_gem5_dir,
+        ["cp", "vmlinux", linux_bin])
+
+def linux():
+    """
+    Checkout and build linux kernel for VExpress_GEM5_V1 (arm and arm64)
+    """
+    linux_clone()
+    linux64()
+    linux32()
+
+def linux_legacy():
+    """
+    Checkout and build linux kernel and DTB for VExpress_EMM64/EMM
+    """
+    kernel_vexpress_emm64_dir = os.path.join(options.dest_dir,
+        "linux-kernel-vexpress_emm64")
+    run_cmd("clone linux kernel for VExpress_EMM64 platform",
+        options.dest_dir,
+        ["git", "clone", "https://gem5.googlesource.com/arm/linux-arm64-legacy",
+         kernel_vexpress_emm64_dir])
+    with open(revisions_dir + "/linux-arm64-legacy", "w+") as rev_file:
+        run_cmd("write revision of linux-kernel-vexpress_emm64 repo",
+            kernel_vexpress_emm64_dir,
+            ["git", "rev-parse", "--short", "HEAD"],
+            rev_file)
+    run_cmd("configure kernel",
+        kernel_vexpress_emm64_dir,
+        ["make", "ARCH=arm64", "CROSS_COMPILE=aarch64-linux-gnu-",
+         "CC=aarch64-linux-gnu-gcc-4.8", "gem5_defconfig"])
+    run_cmd("compile kernel",
+        kernel_vexpress_emm64_dir,
+        ["make", "ARCH=arm64", "CROSS_COMPILE=aarch64-linux-gnu-",
+         "CC=aarch64-linux-gnu-gcc-4.8", make_jobs_str])
+    run_cmd("copy vmlinux",
+        kernel_vexpress_emm64_dir,
+        ["cp", "vmlinux", binaries_dir + "/vmlinux.vexpress_emm64"])
+    run_cmd("copy DTB",
+        kernel_vexpress_emm64_dir,
+        ["cp", "arch/arm64/boot/dts/aarch64_gem5_server.dtb", binaries_dir])
+
+    kernel_vexpress_emm_dir = options.dest_dir + "/linux-kernel-vexpress_emm"
+    run_cmd("clone linux kernel for VExpress_EMM platform",
+        options.dest_dir,
+        ["git", "clone", "https://gem5.googlesource.com/arm/linux-arm-legacy",
+         kernel_vexpress_emm_dir])
+    with open(revisions_dir + "/linux-arm-legacy", "w+") as rev_file:
+        run_cmd("write revision of linux-kernel-vexpress_emm64 repo",
+            kernel_vexpress_emm_dir,
+            ["git", "rev-parse", "--short", "HEAD"],
+            rev_file)
+    run_cmd("configure kernel",
+        kernel_vexpress_emm_dir,
+        ["make", "ARCH=arm", "CROSS_COMPILE=arm-linux-gnueabihf-",
+         "CC=arm-linux-gnueabihf-gcc-4.8", "vexpress_gem5_server_defconfig"])
+    run_cmd("compile kernel",
+        kernel_vexpress_emm_dir,
+        ["make", "ARCH=arm", "CROSS_COMPILE=arm-linux-gnueabihf-",
+         "CC=arm-linux-gnueabihf-gcc-4.8", make_jobs_str])
+    run_cmd("copy vmlinux",
+        kernel_vexpress_emm_dir,
+        ["cp", "vmlinux", binaries_dir + "/vmlinux.vexpress_emm"])
+    run_cmd("rename DTB for 1 CPU",
+        kernel_vexpress_emm_dir,
+        ["cp", "arch/arm/boot/dts/vexpress-v2p-ca15-tc1-gem5.dtb",
+         binaries_dir + "/vexpress-v2p-ca15-tc1-gem5_1cpus.dtb"])
+    run_cmd("copy DTBs",
+        kernel_vexpress_emm_dir,
+        ["cp"] + glob(kernel_vexpress_emm_dir + "/arch/arm/boot/dts/*gem5_*dtb") +
+        [binaries_dir])
+
+def dtbs():
+    """
+    Build DTBs for VExpress_GEM5_V1
+    """
+    dt_dir = gem5_dir + "/system/arm/dt"
+    run_cmd("compile DTBs for VExpress_GEM5_V1 platform",
+        dt_dir,
+        ["make", make_jobs_str])
+    run_cmd("copy DTBs",
+        dt_dir,
+        ["cp"] + glob(dt_dir + "/*dtb") + [binaries_dir])
+
+def bootloaders():
+    """
+    Build bootloaders arm64/arm
+    """
+
+    bootloader_arm64_dir = gem5_dir + "/system/arm/bootloader/arm64"
+    run_cmd("compile arm64 bootloader",
+        bootloader_arm64_dir,
+        ["make"])
+    run_cmd("copy arm64 bootloader",
+        bootloader_arm64_dir,
+        ["cp", "boot.arm64", "boot_emm.arm64", "boot_v2.arm64", binaries_dir])
+
+    bootloader_arm_dir = gem5_dir + "/system/arm/bootloader/arm"
+    run_cmd("compile arm bootloader",
+        bootloader_arm_dir,
+        ["make"])
+    run_cmd("copy arm bootloaders",
+        bootloader_arm_dir,
+        ["cp", "boot.arm", "boot_emm.arm", binaries_dir])
+
+def m5():
+    """
+    Build m5 binaries
+    """
+    m5_dir = gem5_dir + "/util/m5"
+    run_cmd("compile arm64 m5",
+        m5_dir,
+        ["make", "-f", "Makefile.aarch64"])
+    run_cmd("copy arm64 m5",
+        m5_dir,
+        ["cp", "m5", binaries_dir + "/m5.aarch64"])
+    run_cmd("clean arm64 m5",
+        m5_dir,
+        ["make", "clean", "-f", "Makefile.aarch64"])
+    run_cmd("compile arm m5",
+        m5_dir,
+        ["make", "-f", "Makefile.arm"])
+    run_cmd("copy arm m5",
+        m5_dir,
+        ["cp", "m5", binaries_dir + "/m5.aarch32"])
+
+def xen():
+    """
+    Build Xen for aarch64
+    """
+    xen_dir = os.path.join(options.dest_dir, "xen")
+    bootwrapper_dir = os.path.join(options.dest_dir, "bootwrapper")
+    linux_cmdline = "console=hvc0 root=/dev/vda rw mem=1G"
+    xen_cmdline = "dtuart=/uart@1c090000 console=dtuart no-bootscrub " + \
+                  "dom0_mem=1G loglvl=all guest_loglvl=all"
+
+    run_cmd("clone Xen",
+        options.dest_dir,
+        ["git", "clone", "git://xenbits.xen.org/xen.git",
+         xen_dir])
+
+    run_cmd("clone boot-wrapper-aarch64",
+        options.dest_dir,
+        ["git", "clone", "git://git.kernel.org/pub/" +
+            "scm/linux/kernel/git/mark/boot-wrapper-aarch64.git",
+         bootwrapper_dir])
+
+    # Need to compile arm64 Linux
+    linux_dir = os.path.join(options.dest_dir, "linux-kernel-vexpress_gem5")
+    linux_bin = os.path.join(linux_dir,
+        "arch", "arm64", "boot", "Image")
+    if not os.path.exists(linux_bin):
+        linux_clone()
+        linux64()
+
+    # Need to compile DTBs
+    dtb_bin = os.path.join(binaries_dir, "armv8_gem5_v2_1cpu.dtb")
+    if not os.path.exists(dtb_bin):
+        dtbs()
+
+    # Building Xen
+    run_cmd("building xen for aarch64",
+        xen_dir,
+        ["make", "dist-xen", "XEN_TARGET_ARCH=arm64",
+         "CROSS_COMPILE=aarch64-linux-gnu-",
+         "CONFIG_EARLY_PRINTK=vexpress", make_jobs_str])
+
+    # Building boot-wrapper-aarch64
+    run_cmd("autoreconf boot-wrapper-aarch64",
+        bootwrapper_dir, ["autoreconf", "-i"])
+    run_cmd("configure boot-wrapper-aarch64",
+        bootwrapper_dir, ["./configure",
+            "--host=aarch64-linux-gnu",
+            "--with-kernel-dir={}".format(linux_dir),
+            "--with-dtb={}".format(dtb_bin),
+            "--with-cmdline='{}'".format(linux_cmdline),
+            "--with-xen-cmdline='{}'".format(xen_cmdline),
+            "--with-xen={}".format(os.path.join(xen_dir, "xen", "xen")),
+            "--enable-psci",
+            "--enable-gicv3"])
+    run_cmd("build boot-wrapper-aarch64",
+        bootwrapper_dir, ["make"])
+
+    # Copying the final binary
+    run_cmd("copy xen binary",
+        bootwrapper_dir, ["cp", "xen-system.axf", binaries_dir])
+
+    with open(os.path.join(revisions_dir, "xen"), "w+") as rev_file:
+        run_cmd("write revision of xen repo",
+            xen_dir,
+            ["git", "rev-parse", "--short", "HEAD"],
+            rev_file)
+
 script_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
 gem5_dir = os.path.dirname(script_dir)
 
+all_binaries = {
+    "linux" : linux,
+    "linux-legacy" : linux_legacy,
+    "dtbs" : dtbs,
+    "bootloaders" : bootloaders,
+    "m5" : m5,
+    "xen" : xen,
+}
+
 parser = OptionParser()
 
 parser.add_option("--gem5-dir", default = gem5_dir,
@@ -68,10 +334,13 @@ parser.add_option("--dest-dir", default = "/tmp",
            "repositories. Generated files will be copied to "
            "DEST_DIR/binaries (which must not exist). The default "
            "value is %default")
-parser.add_option("--make-jobs", type = "int", default = 1,
+parser.add_option("-j", "--make-jobs", type = "int", default = 1,
     metavar = "MAKE_JOBS",
     help = "Number of jobs to use with the 'make' commands. Default value: "
            "%default")
+parser.add_option("-b", "--fs-binaries", action="append",
+    choices=all_binaries.keys(), default=[],
+    help = "List of FS files to be generated. Defaulting to all")
 
 (options, args) = parser.parse_args()
 
@@ -103,30 +372,6 @@ if os.path.exists(revisions_dir):
     print "Error: %s already exists." %revisions_dir
     sys.exit(1)
 
-# Some basic dependency checking
-needed_programs = [
-    "make",
-    "aarch64-linux-gnu-gcc",
-    "arm-linux-gnueabihf-gcc",
-    "aarch64-linux-gnu-gcc-4.8",
-    "arm-linux-gnueabihf-gcc-4.8",
-    "gcc",
-    "bc",
-    "dtc",
-    "arm-linux-gnueabi-gcc"
-]
-
-for program in needed_programs:
-    if not spawn.find_executable(program):
-        print "Error: command %s not found in $PATH" % program
-        print ("If running on an Debian-based linux, please try the following "
-               "cmd to get all the necessary packages: ")
-        print ("sudo apt-get install -y make gcc bc gcc-aarch64-linux-gnu "
-              "gcc-4.8-aarch64-linux-gnu gcc-4.8-arm-linux-gnueabihf "
-              "gcc-arm-linux-gnueabihf device-tree-compiler "
-              "gcc-arm-linux-gnueabi")
-        sys.exit(1)
-
 os.mkdir(binaries_dir);
 os.mkdir(revisions_dir);
 
@@ -139,145 +384,9 @@ run_cmd("write revision of gem5 repo",
     rev_file)
 rev_file.close()
 
-# Checkout and build linux kernel for VExpress_GEM5_V1 (arm and arm64)
-kernel_vexpress_gem5_dir = options.dest_dir + "/linux-kernel-vexpress_gem5"
-run_cmd("clone linux kernel for VExpress_GEM5_V1 platform",
-    options.dest_dir,
-    ["git", "clone", "https://gem5.googlesource.com/arm/linux",
-     kernel_vexpress_gem5_dir])
-rev_file = open(revisions_dir + "/linux", "w+")
-run_cmd("write revision of linux-kernel-vexpress_gem5 repo",
-    kernel_vexpress_gem5_dir,
-    ["git", "rev-parse", "--short", "HEAD"],
-    rev_file)
-rev_file.close()
-run_cmd("configure kernel for arm64",
-    kernel_vexpress_gem5_dir,
-    ["make", "ARCH=arm64", "CROSS_COMPILE=aarch64-linux-gnu-",
-     "gem5_defconfig", make_jobs_str])
-run_cmd("compile kernel for arm64",
-    kernel_vexpress_gem5_dir,
-    ["make", "ARCH=arm64", "CROSS_COMPILE=aarch64-linux-gnu-", make_jobs_str])
-run_cmd("copy arm64 vmlinux",
-    kernel_vexpress_gem5_dir,
-    ["cp", "vmlinux", binaries_dir + "/vmlinux.vexpress_gem5_v1_64"])
-run_cmd("cleanup arm64 kernel compilation",
-    kernel_vexpress_gem5_dir,
-    ["make", "distclean"])
-run_cmd("configure kernel for arm",
-    kernel_vexpress_gem5_dir,
-    ["make", "ARCH=arm", "CROSS_COMPILE=arm-linux-gnueabihf-",
-     "gem5_defconfig"])
-run_cmd("compile kernel for arm",
-    kernel_vexpress_gem5_dir,
-    ["make", "ARCH=arm", "CROSS_COMPILE=arm-linux-gnueabihf-", make_jobs_str])
-run_cmd("copy arm vmlinux",
-    kernel_vexpress_gem5_dir,
-    ["cp", "vmlinux", binaries_dir + "/vmlinux.vexpress_gem5_v1"])
-
-# Checkout and build linux kernel and DTB for VExpress_EMM64
-kernel_vexpress_emm64_dir = options.dest_dir + "/linux-kernel-vexpress_emm64"
-run_cmd("clone linux kernel for VExpress_EMM64 platform",
-    options.dest_dir,
-    ["git", "clone", "https://gem5.googlesource.com/arm/linux-arm64-legacy",
-     kernel_vexpress_emm64_dir])
-rev_file = open(revisions_dir + "/linux-arm64-legacy", "w+")
-run_cmd("write revision of linux-kernel-vexpress_emm64 repo",
-    kernel_vexpress_emm64_dir,
-    ["git", "rev-parse", "--short", "HEAD"],
-    rev_file)
-rev_file.close()
-run_cmd("configure kernel",
-    kernel_vexpress_emm64_dir,
-    ["make", "ARCH=arm64", "CROSS_COMPILE=aarch64-linux-gnu-",
-     "CC=aarch64-linux-gnu-gcc-4.8", "gem5_defconfig"])
-run_cmd("compile kernel",
-    kernel_vexpress_emm64_dir,
-    ["make", "ARCH=arm64", "CROSS_COMPILE=aarch64-linux-gnu-",
-     "CC=aarch64-linux-gnu-gcc-4.8", make_jobs_str])
-run_cmd("copy vmlinux",
-    kernel_vexpress_emm64_dir,
-    ["cp", "vmlinux", binaries_dir + "/vmlinux.vexpress_emm64"])
-run_cmd("copy DTB",
-    kernel_vexpress_emm64_dir,
-    ["cp", "arch/arm64/boot/dts/aarch64_gem5_server.dtb", binaries_dir])
-
-# Checkout and build linux kernel and DTBs for VExpress_EMM
-kernel_vexpress_emm_dir = options.dest_dir + "/linux-kernel-vexpress_emm"
-run_cmd("clone linux kernel for VExpress_EMM platform",
-    options.dest_dir,
-    ["git", "clone", "https://gem5.googlesource.com/arm/linux-arm-legacy",
-     kernel_vexpress_emm_dir])
-rev_file = open(revisions_dir + "/linux-arm-legacy", "w+")
-run_cmd("write revision of linux-kernel-vexpress_emm64 repo",
-    kernel_vexpress_emm_dir,
-    ["git", "rev-parse", "--short", "HEAD"],
-    rev_file)
-rev_file.close()
-run_cmd("configure kernel",
-    kernel_vexpress_emm_dir,
-    ["make", "ARCH=arm", "CROSS_COMPILE=arm-linux-gnueabihf-",
-     "CC=arm-linux-gnueabihf-gcc-4.8", "vexpress_gem5_server_defconfig"])
-run_cmd("compile kernel",
-    kernel_vexpress_emm_dir,
-    ["make", "ARCH=arm", "CROSS_COMPILE=arm-linux-gnueabihf-",
-     "CC=arm-linux-gnueabihf-gcc-4.8", make_jobs_str])
-run_cmd("copy vmlinux",
-    kernel_vexpress_emm_dir,
-    ["cp", "vmlinux", binaries_dir + "/vmlinux.vexpress_emm"])
-run_cmd("rename DTB for 1 CPU",
-    kernel_vexpress_emm_dir,
-    ["cp", "arch/arm/boot/dts/vexpress-v2p-ca15-tc1-gem5.dtb",
-     binaries_dir + "/vexpress-v2p-ca15-tc1-gem5_1cpus.dtb"])
-run_cmd("copy DTBs",
-    kernel_vexpress_emm_dir,
-    ["cp"] + glob(kernel_vexpress_emm_dir + "/arch/arm/boot/dts/*gem5_*dtb") +
-    [binaries_dir])
-
-# Build DTBs for VExpress_GEM5_V1
-dt_dir = gem5_dir + "/system/arm/dt"
-run_cmd("compile DTBs for VExpress_GEM5_V1 platform",
-    dt_dir,
-    ["make", make_jobs_str])
-run_cmd("copy DTBs",
-    dt_dir,
-    ["cp"] + glob(dt_dir + "/*dtb") + [binaries_dir])
-
-# Build bootloaders arm64
-bootloader_arm64_dir = gem5_dir + "/system/arm/bootloader/arm64"
-run_cmd("compile arm64 bootloader",
-    bootloader_arm64_dir,
-    ["make"])
-run_cmd("copy arm64 bootloader",
-    bootloader_arm64_dir,
-    ["cp", "boot.arm64", "boot_emm.arm64", "boot_v2.arm64", binaries_dir])
-
-# Build bootloaders arm
-bootloader_arm_dir = gem5_dir + "/system/arm/bootloader/arm"
-run_cmd("compile arm bootloader",
-    bootloader_arm_dir,
-    ["make"])
-run_cmd("copy arm bootloaders",
-    bootloader_arm_dir,
-    ["cp", "boot.arm", "boot_emm.arm", binaries_dir])
-
-# Build m5 binaries
-m5_dir = gem5_dir + "/util/m5"
-run_cmd("compile arm64 m5",
-    m5_dir,
-    ["make", "-f", "Makefile.aarch64"])
-run_cmd("copy arm64 m5",
-    m5_dir,
-    ["cp", "m5", binaries_dir + "/m5.aarch64"])
-run_cmd("clean arm64 m5",
-    m5_dir,
-    ["make", "clean", "-f", "Makefile.aarch64"])
-run_cmd("compile arm m5",
-    m5_dir,
-    ["make", "-f", "Makefile.arm"])
-run_cmd("copy arm m5",
-    m5_dir,
-    ["cp", "m5", binaries_dir + "/m5.aarch32"])
+binaries = options.fs_binaries if options.fs_binaries else all_binaries.keys()
+for fs_binary in binaries:
+    all_binaries[fs_binary]()
 
 print "Done! All the generated files can be found in %s" % binaries_dir