FSConfig.py revision 10357:1aff1376921e
111308Santhony.gutierrez@amd.com# Copyright (c) 2010-2012 ARM Limited 211308Santhony.gutierrez@amd.com# All rights reserved. 311308Santhony.gutierrez@amd.com# 411308Santhony.gutierrez@amd.com# The license below extends only to copyright in the software and shall 511308Santhony.gutierrez@amd.com# not be construed as granting a license to any other intellectual 611308Santhony.gutierrez@amd.com# property including but not limited to intellectual property relating 711308Santhony.gutierrez@amd.com# to a hardware implementation of the functionality of the software 811308Santhony.gutierrez@amd.com# licensed hereunder. You may use the software subject to the license 911308Santhony.gutierrez@amd.com# terms below provided that you ensure that this notice is replicated 1011308Santhony.gutierrez@amd.com# unmodified and in its entirety in all distributions of the software, 1111308Santhony.gutierrez@amd.com# modified or unmodified, in source code or in binary form. 1211308Santhony.gutierrez@amd.com# 1311308Santhony.gutierrez@amd.com# Copyright (c) 2010-2011 Advanced Micro Devices, Inc. 1411308Santhony.gutierrez@amd.com# Copyright (c) 2006-2008 The Regents of The University of Michigan 1511308Santhony.gutierrez@amd.com# All rights reserved. 1611308Santhony.gutierrez@amd.com# 1711308Santhony.gutierrez@amd.com# Redistribution and use in source and binary forms, with or without 1811308Santhony.gutierrez@amd.com# modification, are permitted provided that the following conditions are 1911308Santhony.gutierrez@amd.com# met: redistributions of source code must retain the above copyright 2011308Santhony.gutierrez@amd.com# notice, this list of conditions and the following disclaimer; 2111308Santhony.gutierrez@amd.com# redistributions in binary form must reproduce the above copyright 2211308Santhony.gutierrez@amd.com# notice, this list of conditions and the following disclaimer in the 2311308Santhony.gutierrez@amd.com# documentation and/or other materials provided with the distribution; 2411308Santhony.gutierrez@amd.com# neither the name of the copyright holders nor the names of its 2511308Santhony.gutierrez@amd.com# contributors may be used to endorse or promote products derived from 2611308Santhony.gutierrez@amd.com# this software without specific prior written permission. 2711308Santhony.gutierrez@amd.com# 2811308Santhony.gutierrez@amd.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2911308Santhony.gutierrez@amd.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 3011308Santhony.gutierrez@amd.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 3111308Santhony.gutierrez@amd.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3211308Santhony.gutierrez@amd.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3311308Santhony.gutierrez@amd.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3411308Santhony.gutierrez@amd.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3511308Santhony.gutierrez@amd.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3611308Santhony.gutierrez@amd.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3711308Santhony.gutierrez@amd.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3811308Santhony.gutierrez@amd.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3911308Santhony.gutierrez@amd.com# 4011308Santhony.gutierrez@amd.com# Authors: Kevin Lim 4111308Santhony.gutierrez@amd.com 4211308Santhony.gutierrez@amd.comfrom m5.objects import * 4311308Santhony.gutierrez@amd.comfrom Benchmarks import * 4411308Santhony.gutierrez@amd.comfrom m5.util import * 4511308Santhony.gutierrez@amd.com 4611308Santhony.gutierrez@amd.comclass CowIdeDisk(IdeDisk): 4711308Santhony.gutierrez@amd.com image = CowDiskImage(child=RawDiskImage(read_only=True), 4811308Santhony.gutierrez@amd.com read_only=False) 4911308Santhony.gutierrez@amd.com 5011308Santhony.gutierrez@amd.com def childImage(self, ci): 5111308Santhony.gutierrez@amd.com self.image.child.image_file = ci 5211308Santhony.gutierrez@amd.com 5311308Santhony.gutierrez@amd.comclass MemBus(CoherentBus): 5411308Santhony.gutierrez@amd.com badaddr_responder = BadAddr() 5511308Santhony.gutierrez@amd.com default = Self.badaddr_responder.pio 5611308Santhony.gutierrez@amd.com 5711308Santhony.gutierrez@amd.com 5811308Santhony.gutierrez@amd.comdef makeLinuxAlphaSystem(mem_mode, mdesc = None, ruby = False): 5911308Santhony.gutierrez@amd.com 6011308Santhony.gutierrez@amd.com class BaseTsunami(Tsunami): 6111308Santhony.gutierrez@amd.com ethernet = NSGigE(pci_bus=0, pci_dev=1, pci_func=0) 6211308Santhony.gutierrez@amd.com ide = IdeController(disks=[Parent.disk0, Parent.disk2], 6311308Santhony.gutierrez@amd.com pci_func=0, pci_dev=0, pci_bus=0) 6411308Santhony.gutierrez@amd.com 6511308Santhony.gutierrez@amd.com self = LinuxAlphaSystem() 6611308Santhony.gutierrez@amd.com if not mdesc: 6711308Santhony.gutierrez@amd.com # generic system 6811308Santhony.gutierrez@amd.com mdesc = SysConfig() 6911308Santhony.gutierrez@amd.com self.readfile = mdesc.script() 7011308Santhony.gutierrez@amd.com 7111308Santhony.gutierrez@amd.com self.tsunami = BaseTsunami() 7211308Santhony.gutierrez@amd.com 7311308Santhony.gutierrez@amd.com # Create the io bus to connect all device ports 7411308Santhony.gutierrez@amd.com self.iobus = NoncoherentBus() 7511308Santhony.gutierrez@amd.com self.tsunami.attachIO(self.iobus) 7611308Santhony.gutierrez@amd.com 7711308Santhony.gutierrez@amd.com self.tsunami.ide.pio = self.iobus.master 7811308Santhony.gutierrez@amd.com self.tsunami.ide.config = self.iobus.master 7911308Santhony.gutierrez@amd.com 8011308Santhony.gutierrez@amd.com self.tsunami.ethernet.pio = self.iobus.master 8111308Santhony.gutierrez@amd.com self.tsunami.ethernet.config = self.iobus.master 8211308Santhony.gutierrez@amd.com 8311308Santhony.gutierrez@amd.com if ruby: 8411308Santhony.gutierrez@amd.com # Store the dma devices for later connection to dma ruby ports. 8511308Santhony.gutierrez@amd.com # Append an underscore to dma_ports to avoid the SimObjectVector check. 8611308Santhony.gutierrez@amd.com self._dma_ports = [self.tsunami.ide.dma, self.tsunami.ethernet.dma] 8711308Santhony.gutierrez@amd.com else: 8811308Santhony.gutierrez@amd.com self.membus = MemBus() 8911308Santhony.gutierrez@amd.com 9011308Santhony.gutierrez@amd.com # By default the bridge responds to all addresses above the I/O 9111308Santhony.gutierrez@amd.com # base address (including the PCI config space) 9211308Santhony.gutierrez@amd.com IO_address_space_base = 0x80000000000 9311308Santhony.gutierrez@amd.com self.bridge = Bridge(delay='50ns', 9411308Santhony.gutierrez@amd.com ranges = [AddrRange(IO_address_space_base, Addr.max)]) 9511308Santhony.gutierrez@amd.com self.bridge.master = self.iobus.slave 9611308Santhony.gutierrez@amd.com self.bridge.slave = self.membus.master 9711308Santhony.gutierrez@amd.com 9811308Santhony.gutierrez@amd.com self.tsunami.ide.dma = self.iobus.slave 9911308Santhony.gutierrez@amd.com self.tsunami.ethernet.dma = self.iobus.slave 10011308Santhony.gutierrez@amd.com 10111308Santhony.gutierrez@amd.com self.system_port = self.membus.slave 10211308Santhony.gutierrez@amd.com 10311308Santhony.gutierrez@amd.com self.mem_ranges = [AddrRange(mdesc.mem())] 10411308Santhony.gutierrez@amd.com self.disk0 = CowIdeDisk(driveID='master') 10511308Santhony.gutierrez@amd.com self.disk2 = CowIdeDisk(driveID='master') 10611308Santhony.gutierrez@amd.com self.disk0.childImage(mdesc.disk()) 10711308Santhony.gutierrez@amd.com self.disk2.childImage(disk('linux-bigswap2.img')) 10811308Santhony.gutierrez@amd.com self.simple_disk = SimpleDisk(disk=RawDiskImage(image_file = mdesc.disk(), 10911308Santhony.gutierrez@amd.com read_only = True)) 11011308Santhony.gutierrez@amd.com self.intrctrl = IntrControl() 11111308Santhony.gutierrez@amd.com self.mem_mode = mem_mode 11211308Santhony.gutierrez@amd.com self.terminal = Terminal() 11311308Santhony.gutierrez@amd.com self.kernel = binary('vmlinux') 11411308Santhony.gutierrez@amd.com self.pal = binary('ts_osfpal') 11511308Santhony.gutierrez@amd.com self.console = binary('console') 11611308Santhony.gutierrez@amd.com self.boot_osflags = 'root=/dev/hda1 console=ttyS0' 11711308Santhony.gutierrez@amd.com 11811308Santhony.gutierrez@amd.com return self 11911308Santhony.gutierrez@amd.com 12011308Santhony.gutierrez@amd.comdef makeSparcSystem(mem_mode, mdesc = None): 12111308Santhony.gutierrez@amd.com # Constants from iob.cc and uart8250.cc 12211308Santhony.gutierrez@amd.com iob_man_addr = 0x9800000000 12311308Santhony.gutierrez@amd.com uart_pio_size = 8 12411308Santhony.gutierrez@amd.com 12511308Santhony.gutierrez@amd.com class CowMmDisk(MmDisk): 12611308Santhony.gutierrez@amd.com image = CowDiskImage(child=RawDiskImage(read_only=True), 12711308Santhony.gutierrez@amd.com read_only=False) 12811308Santhony.gutierrez@amd.com 12911308Santhony.gutierrez@amd.com def childImage(self, ci): 13011308Santhony.gutierrez@amd.com self.image.child.image_file = ci 13111308Santhony.gutierrez@amd.com 13211308Santhony.gutierrez@amd.com self = SparcSystem() 13311308Santhony.gutierrez@amd.com if not mdesc: 13411308Santhony.gutierrez@amd.com # generic system 13511308Santhony.gutierrez@amd.com mdesc = SysConfig() 13611308Santhony.gutierrez@amd.com self.readfile = mdesc.script() 13711308Santhony.gutierrez@amd.com self.iobus = NoncoherentBus() 13811308Santhony.gutierrez@amd.com self.membus = MemBus() 13911308Santhony.gutierrez@amd.com self.bridge = Bridge(delay='50ns') 14011308Santhony.gutierrez@amd.com self.t1000 = T1000() 14111308Santhony.gutierrez@amd.com self.t1000.attachOnChipIO(self.membus) 14211308Santhony.gutierrez@amd.com self.t1000.attachIO(self.iobus) 14311308Santhony.gutierrez@amd.com self.mem_ranges = [AddrRange(Addr('1MB'), size = '64MB'), 14411308Santhony.gutierrez@amd.com AddrRange(Addr('2GB'), size ='256MB')] 14511308Santhony.gutierrez@amd.com self.bridge.master = self.iobus.slave 14611308Santhony.gutierrez@amd.com self.bridge.slave = self.membus.master 14711308Santhony.gutierrez@amd.com self.rom.port = self.membus.master 14811308Santhony.gutierrez@amd.com self.nvram.port = self.membus.master 14911308Santhony.gutierrez@amd.com self.hypervisor_desc.port = self.membus.master 15011308Santhony.gutierrez@amd.com self.partition_desc.port = self.membus.master 15111308Santhony.gutierrez@amd.com self.intrctrl = IntrControl() 15211308Santhony.gutierrez@amd.com self.disk0 = CowMmDisk() 15311308Santhony.gutierrez@amd.com self.disk0.childImage(disk('disk.s10hw2')) 15411308Santhony.gutierrez@amd.com self.disk0.pio = self.iobus.master 15511308Santhony.gutierrez@amd.com 15611308Santhony.gutierrez@amd.com # The puart0 and hvuart are placed on the IO bus, so create ranges 15711308Santhony.gutierrez@amd.com # for them. The remaining IO range is rather fragmented, so poke 15811308Santhony.gutierrez@amd.com # holes for the iob and partition descriptors etc. 15911308Santhony.gutierrez@amd.com self.bridge.ranges = \ 16011308Santhony.gutierrez@amd.com [ 16111308Santhony.gutierrez@amd.com AddrRange(self.t1000.puart0.pio_addr, 16211308Santhony.gutierrez@amd.com self.t1000.puart0.pio_addr + uart_pio_size - 1), 16311308Santhony.gutierrez@amd.com AddrRange(self.disk0.pio_addr, 16411308Santhony.gutierrez@amd.com self.t1000.fake_jbi.pio_addr + 16511308Santhony.gutierrez@amd.com self.t1000.fake_jbi.pio_size - 1), 16611308Santhony.gutierrez@amd.com AddrRange(self.t1000.fake_clk.pio_addr, 16711308Santhony.gutierrez@amd.com iob_man_addr - 1), 16811308Santhony.gutierrez@amd.com AddrRange(self.t1000.fake_l2_1.pio_addr, 16911308Santhony.gutierrez@amd.com self.t1000.fake_ssi.pio_addr + 17011308Santhony.gutierrez@amd.com self.t1000.fake_ssi.pio_size - 1), 17111308Santhony.gutierrez@amd.com AddrRange(self.t1000.hvuart.pio_addr, 17211308Santhony.gutierrez@amd.com self.t1000.hvuart.pio_addr + uart_pio_size - 1) 17311308Santhony.gutierrez@amd.com ] 17411308Santhony.gutierrez@amd.com self.reset_bin = binary('reset_new.bin') 17511308Santhony.gutierrez@amd.com self.hypervisor_bin = binary('q_new.bin') 17611308Santhony.gutierrez@amd.com self.openboot_bin = binary('openboot_new.bin') 17711308Santhony.gutierrez@amd.com self.nvram_bin = binary('nvram1') 17811308Santhony.gutierrez@amd.com self.hypervisor_desc_bin = binary('1up-hv.bin') 17911308Santhony.gutierrez@amd.com self.partition_desc_bin = binary('1up-md.bin') 18011308Santhony.gutierrez@amd.com 18111308Santhony.gutierrez@amd.com self.system_port = self.membus.slave 18211308Santhony.gutierrez@amd.com 18311308Santhony.gutierrez@amd.com return self 18411308Santhony.gutierrez@amd.com 18511308Santhony.gutierrez@amd.comdef makeArmSystem(mem_mode, machine_type, mdesc = None, 18611308Santhony.gutierrez@amd.com dtb_filename = None, bare_metal=False): 18711308Santhony.gutierrez@amd.com assert machine_type 18811308Santhony.gutierrez@amd.com 18911308Santhony.gutierrez@amd.com if bare_metal: 19011308Santhony.gutierrez@amd.com self = ArmSystem() 19111308Santhony.gutierrez@amd.com else: 19211308Santhony.gutierrez@amd.com self = LinuxArmSystem() 19311308Santhony.gutierrez@amd.com 19411308Santhony.gutierrez@amd.com if not mdesc: 19511308Santhony.gutierrez@amd.com # generic system 19611308Santhony.gutierrez@amd.com mdesc = SysConfig() 19711308Santhony.gutierrez@amd.com 19811308Santhony.gutierrez@amd.com self.readfile = mdesc.script() 19911308Santhony.gutierrez@amd.com self.iobus = NoncoherentBus() 20011308Santhony.gutierrez@amd.com self.membus = MemBus() 20111308Santhony.gutierrez@amd.com self.membus.badaddr_responder.warn_access = "warn" 20211308Santhony.gutierrez@amd.com self.bridge = Bridge(delay='50ns') 20311308Santhony.gutierrez@amd.com self.bridge.master = self.iobus.slave 20411308Santhony.gutierrez@amd.com self.bridge.slave = self.membus.master 20511308Santhony.gutierrez@amd.com 20611308Santhony.gutierrez@amd.com self.mem_mode = mem_mode 20711308Santhony.gutierrez@amd.com 20811308Santhony.gutierrez@amd.com if machine_type == "RealView_PBX": 20911308Santhony.gutierrez@amd.com self.realview = RealViewPBX() 21011308Santhony.gutierrez@amd.com elif machine_type == "RealView_EB": 21111308Santhony.gutierrez@amd.com self.realview = RealViewEB() 21211308Santhony.gutierrez@amd.com elif machine_type == "VExpress_ELT": 21311308Santhony.gutierrez@amd.com self.realview = VExpress_ELT() 21411308Santhony.gutierrez@amd.com elif machine_type == "VExpress_EMM": 21511308Santhony.gutierrez@amd.com self.realview = VExpress_EMM() 21611308Santhony.gutierrez@amd.com elif machine_type == "VExpress_EMM64": 21711308Santhony.gutierrez@amd.com self.realview = VExpress_EMM64() 21811308Santhony.gutierrez@amd.com else: 21911308Santhony.gutierrez@amd.com print "Unknown Machine Type" 22011308Santhony.gutierrez@amd.com sys.exit(1) 22111308Santhony.gutierrez@amd.com 22211308Santhony.gutierrez@amd.com self.cf0 = CowIdeDisk(driveID='master') 22311308Santhony.gutierrez@amd.com self.cf0.childImage(mdesc.disk()) 22411308Santhony.gutierrez@amd.com 22511308Santhony.gutierrez@amd.com # Attach any PCI devices this platform supports 22611308Santhony.gutierrez@amd.com self.realview.attachPciDevices() 22711308Santhony.gutierrez@amd.com # default to an IDE controller rather than a CF one 22811308Santhony.gutierrez@amd.com try: 22911308Santhony.gutierrez@amd.com self.realview.ide.disks = [self.cf0] 23011308Santhony.gutierrez@amd.com except: 23111308Santhony.gutierrez@amd.com self.realview.cf_ctrl.disks = [self.cf0] 23211308Santhony.gutierrez@amd.com 23311308Santhony.gutierrez@amd.com if bare_metal: 23411308Santhony.gutierrez@amd.com # EOT character on UART will end the simulation 23511308Santhony.gutierrez@amd.com self.realview.uart.end_on_eot = True 23611308Santhony.gutierrez@amd.com self.mem_ranges = [AddrRange(self.realview.mem_start_addr, 23711308Santhony.gutierrez@amd.com size = mdesc.mem())] 23811308Santhony.gutierrez@amd.com else: 23911308Santhony.gutierrez@amd.com if machine_type == "VExpress_EMM64": 24011308Santhony.gutierrez@amd.com self.kernel = binary('vmlinux-3.16-aarch64-vexpress-emm64-pcie') 24111308Santhony.gutierrez@amd.com elif machine_type == "VExpress_EMM": 24211308Santhony.gutierrez@amd.com self.kernel = binary('vmlinux-3.3-arm-vexpress-emm-pcie') 24311308Santhony.gutierrez@amd.com else: 24411308Santhony.gutierrez@amd.com self.kernel = binary('vmlinux.arm.smp.fb.2.6.38.8') 24511308Santhony.gutierrez@amd.com 24611308Santhony.gutierrez@amd.com if dtb_filename: 24711308Santhony.gutierrez@amd.com self.dtb_filename = binary(dtb_filename) 24811308Santhony.gutierrez@amd.com self.machine_type = machine_type 24911308Santhony.gutierrez@amd.com if convert.toMemorySize(mdesc.mem()) > int(self.realview.max_mem_size): 25011308Santhony.gutierrez@amd.com print "The currently selected ARM platforms doesn't support" 25111308Santhony.gutierrez@amd.com print " the amount of DRAM you've selected. Please try" 25211308Santhony.gutierrez@amd.com print " another platform" 25311308Santhony.gutierrez@amd.com sys.exit(1) 25411308Santhony.gutierrez@amd.com 25511308Santhony.gutierrez@amd.com # Ensure that writes to the UART actually go out early in the boot 25611308Santhony.gutierrez@amd.com boot_flags = 'earlyprintk=pl011,0x1c090000 console=ttyAMA0 ' + \ 25711308Santhony.gutierrez@amd.com 'lpj=19988480 norandmaps rw loglevel=8 ' + \ 25811308Santhony.gutierrez@amd.com 'mem=%s root=/dev/sda1' % mdesc.mem() 25911308Santhony.gutierrez@amd.com 26011308Santhony.gutierrez@amd.com self.mem_ranges = [AddrRange(self.realview.mem_start_addr, 26111308Santhony.gutierrez@amd.com size = mdesc.mem())] 26211308Santhony.gutierrez@amd.com self.realview.setupBootLoader(self.membus, self, binary) 26311308Santhony.gutierrez@amd.com self.gic_cpu_addr = self.realview.gic.cpu_addr 26411308Santhony.gutierrez@amd.com self.flags_addr = self.realview.realview_io.pio_addr + 0x30 26511308Santhony.gutierrez@amd.com 26611308Santhony.gutierrez@amd.com if mdesc.disk().lower().count('android'): 26711308Santhony.gutierrez@amd.com boot_flags += " init=/init " 26811308Santhony.gutierrez@amd.com self.boot_osflags = boot_flags 26911308Santhony.gutierrez@amd.com self.realview.attachOnChipIO(self.membus, self.bridge) 27011308Santhony.gutierrez@amd.com self.realview.attachIO(self.iobus) 27111308Santhony.gutierrez@amd.com self.intrctrl = IntrControl() 27211308Santhony.gutierrez@amd.com self.terminal = Terminal() 27311308Santhony.gutierrez@amd.com self.vncserver = VncServer() 27411308Santhony.gutierrez@amd.com 27511308Santhony.gutierrez@amd.com self.system_port = self.membus.slave 27611308Santhony.gutierrez@amd.com 27711308Santhony.gutierrez@amd.com return self 27811308Santhony.gutierrez@amd.com 27911308Santhony.gutierrez@amd.com 28011308Santhony.gutierrez@amd.comdef makeLinuxMipsSystem(mem_mode, mdesc = None): 28111308Santhony.gutierrez@amd.com class BaseMalta(Malta): 28211308Santhony.gutierrez@amd.com ethernet = NSGigE(pci_bus=0, pci_dev=1, pci_func=0) 28311308Santhony.gutierrez@amd.com ide = IdeController(disks=[Parent.disk0, Parent.disk2], 28411308Santhony.gutierrez@amd.com pci_func=0, pci_dev=0, pci_bus=0) 28511308Santhony.gutierrez@amd.com 28611308Santhony.gutierrez@amd.com self = LinuxMipsSystem() 28711308Santhony.gutierrez@amd.com if not mdesc: 28811308Santhony.gutierrez@amd.com # generic system 28911308Santhony.gutierrez@amd.com mdesc = SysConfig() 29011308Santhony.gutierrez@amd.com self.readfile = mdesc.script() 29111308Santhony.gutierrez@amd.com self.iobus = NoncoherentBus() 29211308Santhony.gutierrez@amd.com self.membus = MemBus() 29311308Santhony.gutierrez@amd.com self.bridge = Bridge(delay='50ns') 29411308Santhony.gutierrez@amd.com self.mem_ranges = [AddrRange('1GB')] 29511308Santhony.gutierrez@amd.com self.bridge.master = self.iobus.slave 29611308Santhony.gutierrez@amd.com self.bridge.slave = self.membus.master 29711308Santhony.gutierrez@amd.com self.disk0 = CowIdeDisk(driveID='master') 29811308Santhony.gutierrez@amd.com self.disk2 = CowIdeDisk(driveID='master') 29911308Santhony.gutierrez@amd.com self.disk0.childImage(mdesc.disk()) 30011308Santhony.gutierrez@amd.com self.disk2.childImage(disk('linux-bigswap2.img')) 30111308Santhony.gutierrez@amd.com self.malta = BaseMalta() 30211308Santhony.gutierrez@amd.com self.malta.attachIO(self.iobus) 30311308Santhony.gutierrez@amd.com self.malta.ide.pio = self.iobus.master 30411308Santhony.gutierrez@amd.com self.malta.ide.config = self.iobus.master 30511308Santhony.gutierrez@amd.com self.malta.ide.dma = self.iobus.slave 30611308Santhony.gutierrez@amd.com self.malta.ethernet.pio = self.iobus.master 30711308Santhony.gutierrez@amd.com self.malta.ethernet.config = self.iobus.master 30811308Santhony.gutierrez@amd.com self.malta.ethernet.dma = self.iobus.slave 30911308Santhony.gutierrez@amd.com self.simple_disk = SimpleDisk(disk=RawDiskImage(image_file = mdesc.disk(), 31011308Santhony.gutierrez@amd.com read_only = True)) 31111308Santhony.gutierrez@amd.com self.intrctrl = IntrControl() 31211308Santhony.gutierrez@amd.com self.mem_mode = mem_mode 31311308Santhony.gutierrez@amd.com self.terminal = Terminal() 31411308Santhony.gutierrez@amd.com self.kernel = binary('mips/vmlinux') 31511308Santhony.gutierrez@amd.com self.console = binary('mips/console') 31611308Santhony.gutierrez@amd.com self.boot_osflags = 'root=/dev/hda1 console=ttyS0' 31711308Santhony.gutierrez@amd.com 31811308Santhony.gutierrez@amd.com self.system_port = self.membus.slave 31911308Santhony.gutierrez@amd.com 32011308Santhony.gutierrez@amd.com return self 32111308Santhony.gutierrez@amd.com 32211308Santhony.gutierrez@amd.comdef x86IOAddress(port): 32311308Santhony.gutierrez@amd.com IO_address_space_base = 0x8000000000000000 32411308Santhony.gutierrez@amd.com return IO_address_space_base + port 32511308Santhony.gutierrez@amd.com 32611308Santhony.gutierrez@amd.comdef connectX86ClassicSystem(x86_sys, numCPUs): 32711308Santhony.gutierrez@amd.com # Constants similar to x86_traits.hh 32811308Santhony.gutierrez@amd.com IO_address_space_base = 0x8000000000000000 32911308Santhony.gutierrez@amd.com pci_config_address_space_base = 0xc000000000000000 33011308Santhony.gutierrez@amd.com interrupts_address_space_base = 0xa000000000000000 33111308Santhony.gutierrez@amd.com APIC_range_size = 1 << 12; 33211308Santhony.gutierrez@amd.com 33311308Santhony.gutierrez@amd.com x86_sys.membus = MemBus() 33411308Santhony.gutierrez@amd.com 33511308Santhony.gutierrez@amd.com # North Bridge 33611308Santhony.gutierrez@amd.com x86_sys.iobus = NoncoherentBus() 33711308Santhony.gutierrez@amd.com x86_sys.bridge = Bridge(delay='50ns') 33811308Santhony.gutierrez@amd.com x86_sys.bridge.master = x86_sys.iobus.slave 33911308Santhony.gutierrez@amd.com x86_sys.bridge.slave = x86_sys.membus.master 34011308Santhony.gutierrez@amd.com # Allow the bridge to pass through the IO APIC (two pages), 34111308Santhony.gutierrez@amd.com # everything in the IO address range up to the local APIC, and 34211308Santhony.gutierrez@amd.com # then the entire PCI address space and beyond 34311308Santhony.gutierrez@amd.com x86_sys.bridge.ranges = \ 34411308Santhony.gutierrez@amd.com [ 34511308Santhony.gutierrez@amd.com AddrRange(x86_sys.pc.south_bridge.io_apic.pio_addr, 34611308Santhony.gutierrez@amd.com x86_sys.pc.south_bridge.io_apic.pio_addr + 34711308Santhony.gutierrez@amd.com APIC_range_size - 1), 34811308Santhony.gutierrez@amd.com AddrRange(IO_address_space_base, 34911308Santhony.gutierrez@amd.com interrupts_address_space_base - 1), 35011308Santhony.gutierrez@amd.com AddrRange(pci_config_address_space_base, 35111308Santhony.gutierrez@amd.com Addr.max) 35211308Santhony.gutierrez@amd.com ] 35311308Santhony.gutierrez@amd.com 35411308Santhony.gutierrez@amd.com # Create a bridge from the IO bus to the memory bus to allow access to 35511308Santhony.gutierrez@amd.com # the local APIC (two pages) 35611308Santhony.gutierrez@amd.com x86_sys.apicbridge = Bridge(delay='50ns') 35711308Santhony.gutierrez@amd.com x86_sys.apicbridge.slave = x86_sys.iobus.master 35811308Santhony.gutierrez@amd.com x86_sys.apicbridge.master = x86_sys.membus.slave 35911308Santhony.gutierrez@amd.com x86_sys.apicbridge.ranges = [AddrRange(interrupts_address_space_base, 36011308Santhony.gutierrez@amd.com interrupts_address_space_base + 36111308Santhony.gutierrez@amd.com numCPUs * APIC_range_size 36211308Santhony.gutierrez@amd.com - 1)] 36311308Santhony.gutierrez@amd.com 36411308Santhony.gutierrez@amd.com # connect the io bus 36511308Santhony.gutierrez@amd.com x86_sys.pc.attachIO(x86_sys.iobus) 36611308Santhony.gutierrez@amd.com 36711308Santhony.gutierrez@amd.com x86_sys.system_port = x86_sys.membus.slave 36811308Santhony.gutierrez@amd.com 36911308Santhony.gutierrez@amd.comdef connectX86RubySystem(x86_sys): 37011308Santhony.gutierrez@amd.com # North Bridge 37111308Santhony.gutierrez@amd.com x86_sys.iobus = NoncoherentBus() 37211308Santhony.gutierrez@amd.com 37311308Santhony.gutierrez@amd.com # add the ide to the list of dma devices that later need to attach to 37411308Santhony.gutierrez@amd.com # dma controllers 37511308Santhony.gutierrez@amd.com x86_sys._dma_ports = [x86_sys.pc.south_bridge.ide.dma] 37611308Santhony.gutierrez@amd.com x86_sys.pc.attachIO(x86_sys.iobus, x86_sys._dma_ports) 37711308Santhony.gutierrez@amd.com 37811308Santhony.gutierrez@amd.com 37911308Santhony.gutierrez@amd.comdef makeX86System(mem_mode, numCPUs = 1, mdesc = None, self = None, 38011308Santhony.gutierrez@amd.com Ruby = False): 38111308Santhony.gutierrez@amd.com if self == None: 38211308Santhony.gutierrez@amd.com self = X86System() 38311308Santhony.gutierrez@amd.com 38411308Santhony.gutierrez@amd.com if not mdesc: 38511308Santhony.gutierrez@amd.com # generic system 38611308Santhony.gutierrez@amd.com mdesc = SysConfig() 38711308Santhony.gutierrez@amd.com self.readfile = mdesc.script() 38811308Santhony.gutierrez@amd.com 38911308Santhony.gutierrez@amd.com self.mem_mode = mem_mode 39011308Santhony.gutierrez@amd.com 39111308Santhony.gutierrez@amd.com # Physical memory 39211308Santhony.gutierrez@amd.com # On the PC platform, the memory region 0xC0000000-0xFFFFFFFF is reserved 39311308Santhony.gutierrez@amd.com # for various devices. Hence, if the physical memory size is greater than 39411308Santhony.gutierrez@amd.com # 3GB, we need to split it into two parts. 39511308Santhony.gutierrez@amd.com excess_mem_size = \ 39611308Santhony.gutierrez@amd.com convert.toMemorySize(mdesc.mem()) - convert.toMemorySize('3GB') 39711308Santhony.gutierrez@amd.com if excess_mem_size <= 0: 39811308Santhony.gutierrez@amd.com self.mem_ranges = [AddrRange(mdesc.mem())] 39911308Santhony.gutierrez@amd.com else: 40011308Santhony.gutierrez@amd.com warn("Physical memory size specified is %s which is greater than " \ 40111308Santhony.gutierrez@amd.com "3GB. Twice the number of memory controllers would be " \ 40211308Santhony.gutierrez@amd.com "created." % (mdesc.mem())) 40311308Santhony.gutierrez@amd.com 40411308Santhony.gutierrez@amd.com self.mem_ranges = [AddrRange('3GB'), 40511308Santhony.gutierrez@amd.com AddrRange(Addr('4GB'), size = excess_mem_size)] 40611308Santhony.gutierrez@amd.com 40711308Santhony.gutierrez@amd.com # Platform 40811308Santhony.gutierrez@amd.com self.pc = Pc() 40911308Santhony.gutierrez@amd.com 41011308Santhony.gutierrez@amd.com # Create and connect the busses required by each memory system 41111308Santhony.gutierrez@amd.com if Ruby: 41211308Santhony.gutierrez@amd.com connectX86RubySystem(self) 41311308Santhony.gutierrez@amd.com else: 41411308Santhony.gutierrez@amd.com connectX86ClassicSystem(self, numCPUs) 41511308Santhony.gutierrez@amd.com 41611308Santhony.gutierrez@amd.com self.intrctrl = IntrControl() 41711308Santhony.gutierrez@amd.com 41811308Santhony.gutierrez@amd.com # Disks 41911308Santhony.gutierrez@amd.com disk0 = CowIdeDisk(driveID='master') 42011308Santhony.gutierrez@amd.com disk2 = CowIdeDisk(driveID='master') 42111308Santhony.gutierrez@amd.com disk0.childImage(mdesc.disk()) 42211308Santhony.gutierrez@amd.com disk2.childImage(disk('linux-bigswap2.img')) 42311308Santhony.gutierrez@amd.com self.pc.south_bridge.ide.disks = [disk0, disk2] 42411308Santhony.gutierrez@amd.com 42511308Santhony.gutierrez@amd.com # Add in a Bios information structure. 42611308Santhony.gutierrez@amd.com structures = [X86SMBiosBiosInformation()] 42711308Santhony.gutierrez@amd.com self.smbios_table.structures = structures 42811308Santhony.gutierrez@amd.com 42911308Santhony.gutierrez@amd.com # Set up the Intel MP table 43011308Santhony.gutierrez@amd.com base_entries = [] 43111308Santhony.gutierrez@amd.com ext_entries = [] 43211308Santhony.gutierrez@amd.com for i in xrange(numCPUs): 43311308Santhony.gutierrez@amd.com bp = X86IntelMPProcessor( 43411308Santhony.gutierrez@amd.com local_apic_id = i, 43511308Santhony.gutierrez@amd.com local_apic_version = 0x14, 43611308Santhony.gutierrez@amd.com enable = True, 43711308Santhony.gutierrez@amd.com bootstrap = (i == 0)) 43811308Santhony.gutierrez@amd.com base_entries.append(bp) 43911308Santhony.gutierrez@amd.com io_apic = X86IntelMPIOAPIC( 44011308Santhony.gutierrez@amd.com id = numCPUs, 44111308Santhony.gutierrez@amd.com version = 0x11, 44211308Santhony.gutierrez@amd.com enable = True, 44311308Santhony.gutierrez@amd.com address = 0xfec00000) 44411308Santhony.gutierrez@amd.com self.pc.south_bridge.io_apic.apic_id = io_apic.id 44511308Santhony.gutierrez@amd.com base_entries.append(io_apic) 44611308Santhony.gutierrez@amd.com isa_bus = X86IntelMPBus(bus_id = 0, bus_type='ISA') 44711308Santhony.gutierrez@amd.com base_entries.append(isa_bus) 448 pci_bus = X86IntelMPBus(bus_id = 1, bus_type='PCI') 449 base_entries.append(pci_bus) 450 connect_busses = X86IntelMPBusHierarchy(bus_id=0, 451 subtractive_decode=True, parent_bus=1) 452 ext_entries.append(connect_busses) 453 pci_dev4_inta = X86IntelMPIOIntAssignment( 454 interrupt_type = 'INT', 455 polarity = 'ConformPolarity', 456 trigger = 'ConformTrigger', 457 source_bus_id = 1, 458 source_bus_irq = 0 + (4 << 2), 459 dest_io_apic_id = io_apic.id, 460 dest_io_apic_intin = 16) 461 base_entries.append(pci_dev4_inta) 462 def assignISAInt(irq, apicPin): 463 assign_8259_to_apic = X86IntelMPIOIntAssignment( 464 interrupt_type = 'ExtInt', 465 polarity = 'ConformPolarity', 466 trigger = 'ConformTrigger', 467 source_bus_id = 0, 468 source_bus_irq = irq, 469 dest_io_apic_id = io_apic.id, 470 dest_io_apic_intin = 0) 471 base_entries.append(assign_8259_to_apic) 472 assign_to_apic = X86IntelMPIOIntAssignment( 473 interrupt_type = 'INT', 474 polarity = 'ConformPolarity', 475 trigger = 'ConformTrigger', 476 source_bus_id = 0, 477 source_bus_irq = irq, 478 dest_io_apic_id = io_apic.id, 479 dest_io_apic_intin = apicPin) 480 base_entries.append(assign_to_apic) 481 assignISAInt(0, 2) 482 assignISAInt(1, 1) 483 for i in range(3, 15): 484 assignISAInt(i, i) 485 self.intel_mp_table.base_entries = base_entries 486 self.intel_mp_table.ext_entries = ext_entries 487 488def makeLinuxX86System(mem_mode, numCPUs = 1, mdesc = None, 489 Ruby = False): 490 self = LinuxX86System() 491 492 # Build up the x86 system and then specialize it for Linux 493 makeX86System(mem_mode, numCPUs, mdesc, self, Ruby) 494 495 # We assume below that there's at least 1MB of memory. We'll require 2 496 # just to avoid corner cases. 497 phys_mem_size = sum(map(lambda r: r.size(), self.mem_ranges)) 498 assert(phys_mem_size >= 0x200000) 499 assert(len(self.mem_ranges) <= 2) 500 501 entries = \ 502 [ 503 # Mark the first megabyte of memory as reserved 504 X86E820Entry(addr = 0, size = '639kB', range_type = 1), 505 X86E820Entry(addr = 0x9fc00, size = '385kB', range_type = 2), 506 # Mark the rest of physical memory as available 507 X86E820Entry(addr = 0x100000, 508 size = '%dB' % (self.mem_ranges[0].size() - 0x100000), 509 range_type = 1), 510 # Reserve the last 16kB of the 32-bit address space for the 511 # m5op interface 512 X86E820Entry(addr=0xFFFF0000, size='64kB', range_type=2), 513 ] 514 515 # In case the physical memory is greater than 3GB, we split it into two 516 # parts and add a separate e820 entry for the second part. This entry 517 # starts at 0x100000000, which is the first address after the space 518 # reserved for devices. 519 if len(self.mem_ranges) == 2: 520 entries.append(X86E820Entry(addr = 0x100000000, 521 size = '%dB' % (self.mem_ranges[1].size()), range_type = 1)) 522 523 self.e820_table.entries = entries 524 525 # Command line 526 self.boot_osflags = 'earlyprintk=ttyS0 console=ttyS0 lpj=7999923 ' + \ 527 'root=/dev/hda1' 528 self.kernel = binary('x86_64-vmlinux-2.6.22.9') 529 return self 530 531 532def makeDualRoot(full_system, testSystem, driveSystem, dumpfile): 533 self = Root(full_system = full_system) 534 self.testsys = testSystem 535 self.drivesys = driveSystem 536 self.etherlink = EtherLink() 537 538 if hasattr(testSystem, 'realview'): 539 self.etherlink.int0 = Parent.testsys.realview.ethernet.interface 540 self.etherlink.int1 = Parent.drivesys.realview.ethernet.interface 541 elif hasattr(testSystem, 'tsunami'): 542 self.etherlink.int0 = Parent.testsys.tsunami.ethernet.interface 543 self.etherlink.int1 = Parent.drivesys.tsunami.ethernet.interface 544 else: 545 fatal("Don't know how to connect these system together") 546 547 if dumpfile: 548 self.etherdump = EtherDump(file=dumpfile) 549 self.etherlink.dump = Parent.etherdump 550 551 return self 552