From dcab5b577e35f9bf9969ccfd91309455758aaed8 Mon Sep 17 00:00:00 2001 From: Glenn Bergmans Date: Mon, 14 Mar 2016 20:29:12 +0000 Subject: [PATCH] config: Embed Device Tree generation in fs.py config Equips the fs.py config routine with an extra commandline option --generate-dtb that will generate a dtb file automatically before running the simulation. Only works with ARM systems and gives a warning if the simulated system is not of --machine-type VExpress_GEM5_V1. Change-Id: I7766e5459fd9bec2245de83cef103091ebaf7229 Reviewed-by: Curtis Dunham Reviewed-by: Andreas Sandberg Reviewed-on: https://gem5-review.googlesource.com/5968 Maintainer: Andreas Sandberg --- configs/common/FSConfig.py | 7 ++++--- configs/common/Options.py | 2 ++ configs/example/fs.py | 37 +++++++++++++++++++++++++++++++++++-- 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/configs/common/FSConfig.py b/configs/common/FSConfig.py index c08353a23..fc8765b6c 100644 --- a/configs/common/FSConfig.py +++ b/configs/common/FSConfig.py @@ -204,7 +204,8 @@ def makeSparcSystem(mem_mode, mdesc=None, cmdline=None): def makeArmSystem(mem_mode, machine_type, num_cpus=1, mdesc=None, dtb_filename=None, bare_metal=False, cmdline=None, - external_memory="", ruby=False, security=False): + external_memory="", ruby=False, security=False, + ignore_dtb=False): assert machine_type default_dtbs = { @@ -249,7 +250,7 @@ def makeArmSystem(mem_mode, machine_type, num_cpus=1, mdesc=None, machine_type = platform_class.__name__ self.realview = platform_class() - if not dtb_filename and not bare_metal: + if not dtb_filename and not (bare_metal or ignore_dtb): try: dtb_filename = default_dtbs[machine_type] except KeyError: @@ -305,7 +306,7 @@ def makeArmSystem(mem_mode, machine_type, num_cpus=1, mdesc=None, if machine_type in default_kernels: self.kernel = binary(default_kernels[machine_type]) - if dtb_filename: + if dtb_filename and not ignore_dtb: self.dtb_filename = binary(dtb_filename) self.machine_type = machine_type if machine_type in ArmMachineType.map \ diff --git a/configs/common/Options.py b/configs/common/Options.py index ea7c75bb7..29ef74c9a 100644 --- a/configs/common/Options.py +++ b/configs/common/Options.py @@ -343,6 +343,8 @@ def addFSOptions(parser): parser.add_option("--enable-context-switch-stats-dump", \ action="store_true", help="Enable stats dump at context "\ "switches and dump tasks file (required for Streamline)") + parser.add_option("--generate-dtb", action="store_true", default=False, + help="Automatically generate a dtb file") # Benchmark options parser.add_option("--dual", action="store_true", diff --git a/configs/example/fs.py b/configs/example/fs.py index 351d1c016..031457c8e 100644 --- a/configs/example/fs.py +++ b/configs/example/fs.py @@ -48,6 +48,7 @@ import m5 from m5.defines import buildEnv from m5.objects import * from m5.util import addToPath, fatal, warn +from m5.util.fdthelper import * addToPath('../') @@ -99,7 +100,9 @@ def build_test_system(np): options.num_cpus, bm[0], options.dtb_filename, bare_metal=options.bare_metal, cmdline=cmdline, - external_memory=options.external_memory_system, + ignore_dtb=options.generate_dtb, + external_memory= + options.external_memory_system, ruby=options.ruby, security=options.enable_security_extensions) if options.enable_context_switch_stats_dump: @@ -248,7 +251,8 @@ def build_drive_system(np): cmdline=cmdline) elif buildEnv['TARGET_ISA'] == 'arm': drive_sys = makeArmSystem(drive_mem_mode, options.machine_type, np, - bm[1], options.dtb_filename, cmdline=cmdline) + bm[1], options.dtb_filename, cmdline=cmdline, + ignore_dtb=options.generate_dtb) # Create a top-level voltage domain drive_sys.voltage_domain = VoltageDomain(voltage = options.sys_voltage) @@ -362,5 +366,34 @@ if options.timesync: if options.frame_capture: VncServer.frame_capture = True +if buildEnv['TARGET_ISA'] == "arm" and options.generate_dtb: + # Sanity checks + if options.dtb_filename: + fatal("--generate-dtb and --dtb-filename cannot be specified at the"\ + "same time.") + + if options.machine_type not in ["VExpress_GEM5", "VExpress_GEM5_V1"]: + warn("Can only correctly generate a dtb for VExpress_GEM5_V1 " \ + "platforms, unless custom hardware models have been equipped "\ + "with generation functionality.") + + # Generate a Device Tree + def create_dtb_for_system(system, filename): + state = FdtState(addr_cells=2, size_cells=2, cpu_cells=1) + rootNode = system.generateDeviceTree(state) + + fdt = Fdt() + fdt.add_rootnode(rootNode) + dtb_filename = os.path.join(m5.options.outdir, filename) + return fdt.writeDtbFile(dtb_filename) + + for sysname in ('system', 'testsys', 'drivesys'): + if hasattr(root, sysname): + sys = getattr(root, sysname) + sys.dtb_filename = create_dtb_for_system(sys, '%s.dtb' % sysname) + +elif buildEnv['TARGET_ISA'] != "arm" and options.generate_dtb: + fatal("Can only generate dtb files for ARM systems.") + Simulation.setWorkCountOptions(test_sys, options) Simulation.run(options, root, test_sys, FutureClass) -- 2.30.2