def build(options): m5.ticks.fixGlobalFrequency() kernel_cmd = [ "earlyprintk", "earlycon=pl011,0x1c090000", "console=ttyAMA0", "lpj=19988480", "norandmaps", "loglevel=8", "mem=%s" % options.mem_size, "root=%s" % options.root, "rw", "init=%s" % options.kernel_init, "vmalloc=768MB", ] root = Root(full_system=True) disks = [default_disk] if len(options.disk) == 0 else options.disk system = createSystem(options.caches, options.kernel, options.bootscript, options.machine_type, disks=disks, mem_size=options.mem_size, bootloader=options.bootloader) root.system = system if options.kernel_cmd: system.workload.command_line = options.kernel_cmd else: system.workload.command_line = " ".join(kernel_cmd) if options.big_cpus + options.little_cpus == 0: m5.util.panic("Empty CPU clusters") big_model, little_model = cpu_types[options.cpu_type] all_cpus = [] # big cluster if options.big_cpus > 0: system.bigCluster = big_model(system, options.big_cpus, options.big_cpu_clock) system.mem_mode = system.bigCluster.memoryMode() all_cpus += system.bigCluster.cpus # little cluster if options.little_cpus > 0: system.littleCluster = little_model(system, options.little_cpus, options.little_cpu_clock) system.mem_mode = system.littleCluster.memoryMode() all_cpus += system.littleCluster.cpus # Figure out the memory mode if options.big_cpus > 0 and options.little_cpus > 0 and \ system.bigCluster.memoryMode() != system.littleCluster.memoryMode(): m5.util.panic("Memory mode missmatch among CPU clusters") # create caches system.addCaches(options.caches, options.last_cache_level) if not options.caches: if options.big_cpus > 0 and system.bigCluster.requireCaches(): m5.util.panic("Big CPU model requires caches") if options.little_cpus > 0 and system.littleCluster.requireCaches(): m5.util.panic("Little CPU model requires caches") # Create a KVM VM and do KVM-specific configuration if issubclass(big_model, KvmCluster): _build_kvm(system, all_cpus) # Linux device tree if options.dtb is not None: system.workload.dtb_filename = SysPaths.binary(options.dtb) else: system.workload.dtb_filename = \ os.path.join(m5.options.outdir, 'system.dtb') system.generateDtb(system.workload.dtb_filename) if devices.have_fastmodel and issubclass(big_model, FastmodelCluster): from m5 import arm_fast_model as fm, systemc as sc # setup FastModels for simulation fm.setup_simulation("cortexa76") # setup SystemC root.systemc_kernel = m5.objects.SystemC_Kernel() m5.tlm.tlm_global_quantum_instance().set( sc.sc_time(10000.0 / 100000000.0, sc.sc_time.SC_SEC)) if options.vio_9p: FSConfig.attach_9p(system.realview, system.iobus) return root
def build(options): m5.ticks.fixGlobalFrequency() kernel_cmd = [ "earlyprintk=pl011,0x1c090000", "console=ttyAMA0", "lpj=19988480", "norandmaps", "loglevel=8", "mem=%s" % options.mem_size, "root=%s" % options.root, "rw", "init=%s" % options.kernel_init, "vmalloc=768MB", ] root = Root(full_system=True) disks = [default_disk] if len(options.disk) == 0 else options.disk system = createSystem(options.caches, options.kernel, options.bootscript, options.machine_type, disks=disks, mem_size=options.mem_size, bootloader=options.bootloader) root.system = system if options.kernel_cmd: system.boot_osflags = options.kernel_cmd else: system.boot_osflags = " ".join(kernel_cmd) if options.big_cpus + options.little_cpus + options.mid_cpus == 0: m5.util.panic("Empty CPU clusters") big_model, mid_model, little_model = cpu_types[options.cpu_type] sw_big_cpu, sw_mid_cpu, sw_little_cpu = sw_cpu_types[options.sw_cpu_type] all_cpus = [] sw_all_cpus = [] if options.big_cpus > 0: system.bigCluster = big_model(system, options.big_cpus, options.big_cpu_clock) system.mem_mode = system.bigCluster.memoryMode() all_cpus += system.bigCluster.cpus cpu_class_tmp = ObjectList.cpu_list.get(sw_big_cpu) big_sw_cpus = [ cpu_class_tmp(switched_out=True, cpu_id=(i)) for i in range(options.big_cpus) ] for i in range(options.big_cpus): if options.fast_forward: system.bigCluster.cpus[i].max_insts_any_thread = int( options.fast_forward) big_sw_cpus[i].system = system big_sw_cpus[i].workload = system.bigCluster.cpus[i].workload big_sw_cpus[i].clk_domain = system.bigCluster.cpus[i].clk_domain big_sw_cpus[i].progress_interval = system.bigCluster.cpus[ i].progress_interval big_sw_cpus[i].isa = system.bigCluster.cpus[i].isa system.bigCluster.switch_cpus = big_sw_cpus if options.mid_cpus > 0: system.midCluster = mid_model(system, options.mid_cpus, options.mid_cpu_clock) system.mem_mode = system.midCluster.memoryMode() all_cpus += system.midCluster.cpus cpu_class_tmp = ObjectList.cpu_list.get(sw_mid_cpu) mid_sw_cpus = [ cpu_class_tmp(switched_out=True, cpu_id=(i + options.big_cpus)) for i in range(options.mid_cpus) ] for i in range(options.mid_cpus): if options.fast_forward: system.midCluster.cpus[i].max_insts_any_thread = int( options.fast_forward) mid_sw_cpus[i].system = system mid_sw_cpus[i].workload = system.midCluster.cpus[i].workload mid_sw_cpus[i].clk_domain = system.midCluster.cpus[i].clk_domain mid_sw_cpus[i].progress_interval = system.midCluster.cpus[ i].progress_interval mid_sw_cpus[i].isa = system.midCluster.cpus[i].isa system.midCluster.switch_cpus = mid_sw_cpus if options.little_cpus > 0: system.littleCluster = little_model(system, options.little_cpus, options.little_cpu_clock) system.mem_mode = system.littleCluster.memoryMode() all_cpus += system.littleCluster.cpus cpu_class_tmp = ObjectList.cpu_list.get(sw_little_cpu) little_sw_cpus = [ cpu_class_tmp(switched_out=True, cpu_id=(i + options.big_cpus + options.mid_cpus)) for i in range(options.little_cpus) ] for i in range(options.little_cpus): if options.fast_forward: system.littleCluster.cpus[i].max_insts_any_thread = int( options.fast_forward) little_sw_cpus[i].system = system little_sw_cpus[i].workload = system.littleCluster.cpus[i].workload little_sw_cpus[i].clk_domain = system.littleCluster.cpus[ i].clk_domain little_sw_cpus[i].progress_interval = system.littleCluster.cpus[ i].progress_interval little_sw_cpus[i].isa = system.littleCluster.cpus[i].isa system.littleCluster.switch_cpus = little_sw_cpus system.addCaches(options.caches) if not options.caches: if options.big_cpus > 0 and system.bigCluster.requireCaches(): m5.util.panic("Big CPU model requires caches") if options.mid_cpus > 0 and system.bigCluster.requireCaches(): m5.util.panic("Mid CPU model requires caches") if options.little_cpus > 0 and system.littleCluster.requireCaches(): m5.util.panic("Little CPU model requires caches") if issubclass(big_model, KvmCluster): _build_kvm(system, all_cpus) # Linux device tree if options.dtb is not None: system.dtb_filename = SysPaths.binary(options.dtb) else: system.generateDtb(m5.options.outdir, 'system.dtb') if options.vio_9p: FSConfig.attach_9p(system.realview, system.iobus) return root