Exemplo n.º 1
0
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
Exemplo n.º 2
0
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