-# Copyright (c) 2006-2007 The Regents of The University of Michigan
+# Copyright (c) 2006-2008 The Regents of The University of Michigan
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
return self
+def x86IOAddress(port):
+ IO_address_space_base = 0x1000000000000000
+ return IO_address_space_base + port;
+
def makeLinuxX86System(mem_mode, mdesc = None):
self = LinuxX86System()
if not mdesc:
self.readfile = mdesc.script()
# Physical memory
- self.membus = Bus(bus_id=0)
+ self.membus = Bus(bus_id=1)
self.physmem = PhysicalMemory(range = AddrRange(mdesc.mem()))
self.physmem.port = self.membus.port
+ # North Bridge
+ self.iobus = Bus(bus_id=0)
+ self.bridge = Bridge(delay='50ns', nack_delay='4ns')
+ self.bridge.side_a = self.iobus.port
+ self.bridge.side_b = self.membus.port
+
+ # Serial port and console
+ self.console = SimConsole()
+ self.com_1 = Uart8250()
+ self.com_1.pio_addr = x86IOAddress(0x3f8)
+ self.com_1.pio = self.iobus.port
+ self.com_1.sim_console = self.console
+
# Platform
self.opteron = Opteron()
//overlapping.
req->setPaddr(regNum * sizeof(MiscReg));
return NoFault;
+ } else if (prefix == IntAddrPrefixIO) {
+ // TODO If CPL > IOPL or in virtual mode, check the I/O permission
+ // bitmap in the TSS.
+
+ Addr IOPort = vaddr & ~IntAddrPrefixMask;
+ // Make sure the address fits in the expected 16 bit IO address
+ // space.
+ assert(!(IOPort & ~0xFFFF));
+ req->setPaddr(PhysAddrPrefixIO | IOPort);
+ return NoFault;
} else {
panic("Access to unrecognized internal address space %#x.\n",
prefix);
const Addr IntAddrPrefixCPUID = ULL(0x100000000);
const Addr IntAddrPrefixMSR = ULL(0x200000000);
const Addr IntAddrPrefixIO = ULL(0x300000000);
+
+ const Addr PhysAddrPrefixIO = ULL(0x1000000000000000);
}
#endif //__ARCH_X86_X86TRAITS_HH__