Cagdas Dirik [Sat, 3 Jan 2015 23:51:48 +0000 (17:51 -0600)]
dev: prevent RTC events firing before startup
This change includes edits to MC146818 timer to prevent RTC events
firing before startup to comply with SimObject initialization call sequence.
Committed by: Nilay Vaish <nilay@cs.wisc.edu>
Nilay Vaish [Sat, 3 Jan 2015 23:51:48 +0000 (17:51 -0600)]
configs: ruby: removes bug introduced by
05b5a6cf3521
Joel Hestness [Sat, 27 Dec 2014 19:48:40 +0000 (13:48 -0600)]
syscall_emul: Return correct writev value
According to Linux man pages, if writev is successful, it returns the total
number of bytes written. Otherwise, it returns an error code. Instead of
returning 0, return the result from the actual call to writev in the system
call.
Andreas Hansson [Tue, 23 Dec 2014 14:31:20 +0000 (09:31 -0500)]
stats: Bump stats for decoder, TLB, prefetcher and DRAM changes
Changes due to speculative execution of an unaligned PC, introduction
of TLB stats, changes and re-work of the prefetcher, and the
introduction of rank-wise refresh in the DRAM controller.
Mitch Hayenga [Tue, 23 Dec 2014 14:31:19 +0000 (09:31 -0500)]
mem: Change prefetcher to use random_mt
Prefechers has used rand() to generate random numers previously.
Curtis Dunham [Tue, 23 Dec 2014 14:31:19 +0000 (09:31 -0500)]
mem: Hide WriteInvalidate requests from prefetchers
Without this tweak, a prefetcher will happily prefetch data that will
promptly be invalidated and overwritten by a WriteInvalidate.
Mitch Hayenga [Tue, 23 Dec 2014 14:31:18 +0000 (09:31 -0500)]
mem: Fix event scheduling issue for prefetches
The cache's MemSidePacketQueue schedules a sendEvent based upon
nextMSHRReadyTime() which is the time when the next MSHR is ready or whenever
a future prefetch is ready. However, a prefetch being ready does not guarentee
that it can obtain an MSHR. So, when all MSHRs are full,
the simulation ends up unnecessiciarly scheduling a sendEvent every picosecond
until an MSHR is finally freed and the prefetch can happen.
This patch fixes this by not signaling the prefetch ready time if the prefetch
could not be generated. The event is rescheduled as soon as a MSHR becomes
available.
Mitch Hayenga [Tue, 23 Dec 2014 14:31:18 +0000 (09:31 -0500)]
mem: Fix bug relating to writebacks and prefetches
Previously the code commented about an unhandled case where it might be
possible for a writeback to arrive after a prefetch was generated but
before it was sent to the memory system. I hit that case. Luckily
the prefetchSquash() logic already in the code handles dropping prefetch
request in certian circumstances.
Mitch Hayenga [Tue, 23 Dec 2014 14:31:18 +0000 (09:31 -0500)]
mem: Rework the structuring of the prefetchers
Re-organizes the prefetcher class structure. Previously the
BasePrefetcher forced multiple assumptions on the prefetchers that
inherited from it. This patch makes the BasePrefetcher class truly
representative of base functionality. For example, the base class no
longer enforces FIFO order. Instead, prefetchers with FIFO requests
(like the existing stride and tagged prefetchers) now inherit from a
new QueuedPrefetcher base class.
Finally, the stride-based prefetcher now assumes a custimizable lookup table
(sets/ways) rather than the previous fully associative structure.
Mitch Hayenga [Tue, 23 Dec 2014 14:31:18 +0000 (09:31 -0500)]
mem: Add parameter to reserve MSHR entries for demand access
Adds a new parameter that reserves some number of MSHR entries for demand
accesses. This helps prevent prefetchers from taking all MSHRs, forcing demand
requests from the CPU to stall.
Curtis Dunham [Tue, 23 Dec 2014 14:31:18 +0000 (09:31 -0500)]
arm: Add stats to table walker
This patch adds table walker stats for:
- Walk events
- Instruction vs Data
- Page size histogram
- Wait time and service time histograms
- Pending requests histogram (per cycle) - measures dist. of L
(p(1..) = how often busy, p(0) = how often idle)
- Squashes, before starting and after completion
Andreas Hansson [Tue, 23 Dec 2014 14:31:18 +0000 (09:31 -0500)]
config: Expose the DRAM ranks as a command-line option
This patch gives the user direct influence over the number of DRAM
ranks to make it easier to tune the memory density without affecting
the bandwidth (previously the only means of scaling the device count
was through the number of channels).
The patch also adds some basic sanity checks to ensure that the number
of ranks is a power of two (since we rely on bit slices in the address
decoding).
Andreas Hansson [Tue, 23 Dec 2014 14:31:18 +0000 (09:31 -0500)]
mem: Ensure DRAM controller is idle when in atomic mode
This patch addresses an issue seen with the KVM CPU where the refresh
events scheduled by the DRAM controller forces the simulator to switch
out of the KVM mode, thus killing performance.
The current patch works around the fact that we currently have no
proper API to inform a SimObject of the mode switches. Instead we rely
on drainResume being called after any switch, and cache the previous
mode locally to be able to decide on appropriate actions.
The switcheroo regression require a minor stats bump as a result.
Omar Naji [Tue, 23 Dec 2014 14:31:18 +0000 (09:31 -0500)]
mem: Add rank-wise refresh to the DRAM controller
This patch adds rank-wise refresh to the controller, as opposed to the
channel-wide refresh currently in place. In essence each rank can be
refreshed independently, and for this to be possible the controller
is extended with a state machine per rank.
Without this patch the data bus is always idle during a refresh, as
all the ranks are refreshing at the same time. With the rank-wise
refresh it is possible to use one rank while another one is
refreshing, and thus the data bus can be kept busy.
The patch introduces a Rank class to encapsulate the state per rank,
and also shifts all the relevant banks, activation tracking etc to the
rank. The arbitration is also updated to consider the state of the rank.
Omar Naji [Tue, 23 Dec 2014 14:31:18 +0000 (09:31 -0500)]
mem: Fix a bug in the DRAM controller arbitration
Fix a minor issue that affects multi-rank systems.
Andreas Hansson [Tue, 23 Dec 2014 14:31:18 +0000 (09:31 -0500)]
tests: Add a regression for the stack distance calculator
Re-use the existing traffic generator regression, and enable the stack
distance calculation in the comm monitor, along with the verification
stack.
The traffic generator config is also tuned to not increase the
run-time too much (and actually have some address re-use).
Kanishk Sugand [Tue, 23 Dec 2014 14:31:18 +0000 (09:31 -0500)]
mem: Add stack distance statistics to the CommMonitor
This patch adds the stack distance calculator to the CommMonitor. The
stats are disabled by default.
Kanishk Sugand [Tue, 23 Dec 2014 14:31:18 +0000 (09:31 -0500)]
mem: Add a stack distance calculator
This patch adds a stand-alone stack distance calculator. The stack
distance calculator is a passive SimObject that observes the addresses
passed to it. It calculates stack distances (LRU Distances) of
incoming addresses based on the partial sum hierarchy tree algorithm
described by Alamasi et al. http://doi.acm.org/10.1145/773039.773043.
For each transaction a hashtable look-up is performed. At every
non-unique transaction the tree is traversed from the leaf at the
returned index to the root, the old node is deleted from the tree, and
the sums (to the right) are collected and decremented. The collected
sum represets the stack distance of the found node. At every unique
transaction the stack distance is returned as
numeric_limits<uint64>::max().
In addition to the basic stack distance calculation, a feature to mark
an old node in the tree is added. This is useful if it is required to
see the reuse pattern. For example, Writebacks to the lower level
(e.g. membus from L2), can be marked instead of being removed from the
stack (isMarked flag of Node set to True). And then later if this same
address is accessed (by L1), the value of the isMarked flag would be
True. This gives some insight on how the Writeback policy of the
lower level affect the read/write accesses in an application.
Debugging is enabled by setting the verify flag to true. Debugging is
implemented using a dummy stack that behaves in a naive way, using STL
vectors. Note that this has a large impact on run time.
Marco Elver [Tue, 23 Dec 2014 14:31:18 +0000 (09:31 -0500)]
config: Add --memchecker option
This patch adds the --memchecker option, to denote that a MemChecker
should be instantiated for the system. The exact usage of the MemChecker
depends on the system configuration.
For now CacheConfig.py makes use of the option, adding MemCheckerMonitor
instances between CPUs and D-Caches.
Note, however, that currently this only provides limited checking on a
running system; other parts of the system, such as I/O devices are not
monitored, and may cause warnings to be issued by the monitor.
Marco Elver [Tue, 23 Dec 2014 14:31:17 +0000 (09:31 -0500)]
mem: Add MemChecker and MemCheckerMonitor
This patch adds the MemChecker and MemCheckerMonitor classes. While
MemChecker can be integrated anywhere in the system and is independent,
the most convenient usage is through the MemCheckerMonitor -- this
however, puts limitations on where the MemChecker is able to observe
read/write transactions.
Andreas Sandberg [Tue, 23 Dec 2014 14:31:17 +0000 (09:31 -0500)]
arm: Raise an alignment fault if a PC has illegal alignment
We currently don't handle unaligned PCs correctly. There is one check
for unaligned PCs in the TLB when running in aarch64 mode, but this
check does not cover cases where the CPU does not do a TLB lookup when
decoding an instruction (e.g., a branch stays within the same cache
line). Additionally, the Decoder class sometimes throws an assertion
for unaligned PCs which breaks speculation.
This changeset introduces a decoder fault bit field in the ExtMachInst
structure. This field can be used to signal a decoder failure. If set,
the decoder generates an internal gem5fault instruction instead of a
normal instruction. This instruction in turns either panics (fault
type PANIC), returns an PCAlignmentFault (fault type UNALIGNED,
aarch64) or PrefetchAbort (fault type UNALIGNED, aarch32).
The patch causes minor changes to the realview64 regressions, and a
stats bump will follow.
Andreas Sandberg [Tue, 23 Dec 2014 14:31:17 +0000 (09:31 -0500)]
arm: Clean up and document decoder API
This changeset adds more documentation to the ArmISA::Decoder class
and restructures it slightly to make API groups more obvious.
Andreas Sandberg [Tue, 23 Dec 2014 14:31:17 +0000 (09:31 -0500)]
arm: Add support for filtering in the PMU
This patch adds support for filtering events in the PMU. In order to
do so, it updates the ISADevice base class to forward an ISA pointer
to ISA devices. This enables such devices to access the MiscReg file
to determine the current execution level.
Dam Sunwoo [Tue, 23 Dec 2014 14:31:17 +0000 (09:31 -0500)]
config: Add options to take/resume from SimPoint checkpoints
More documentation at http://gem5.org/Simpoints
Steps to profile, generate, and use SimPoints with gem5:
1. To profile workload and generate SimPoint BBV file, use the
following option:
--simpoint-profile --simpoint-interval <interval length>
Requires single Atomic CPU and fastmem.
<interval length> is in number of instructions.
2. Generate SimPoint analysis using SimPoint 3.2 from UCSD.
(SimPoint 3.2 not included with this flow.)
3. To take gem5 checkpoints based on SimPoint analysis, use the
following option:
--take-simpoint-checkpoint=<simpoint file path>,<weight file
path>,<interval length>,<warmup length>
<simpoint file> and <weight file> is generated by SimPoint analysis
tool from UCSD. SimPoint 3.2 format expected. <interval length> and
<warmup length> are in number of instructions.
4. To resume from gem5 SimPoint checkpoints, use the following option:
--restore-simpoint-checkpoint -r <N> --checkpoint-dir <simpoint
checkpoint path>
<N> is (SimPoint index + 1). E.g., "-r 1" will resume from SimPoint
#0.
Gabe Black [Tue, 23 Dec 2014 00:49:24 +0000 (16:49 -0800)]
scons: Make the USE_KVM variable available in C++.
We need it to determine whether we should expect KVM related parameters
exist in the cirrus graphics device.
Nilay Vaish [Sun, 14 Dec 2014 22:21:04 +0000 (16:21 -0600)]
Added tag stable_2014_12_14 for changeset
bdb307e8be54
Gabe Black [Wed, 10 Dec 2014 05:53:44 +0000 (21:53 -0800)]
Let other objects set up memory like regions in a KVM VM.
Andreas Sandberg [Mon, 8 Dec 2014 09:49:53 +0000 (04:49 -0500)]
arm: Fix decoding of PMXEVTYPER_EL0 and PMCCFILTR_EL0
The aarch64 system register decoder is currently not decoding
PMXEVTYPER_EL0 and PMCCFILTR_EL0 correctly. This changeset updates the
decoder so that they are decoded using the values in table C5-6 in ARM
DDI 0478A.c.
Andreas Sandberg [Mon, 8 Dec 2014 09:49:52 +0000 (04:49 -0500)]
dev: Add response sanity checks in PioPort
Add an assert in the PioPort that checks if a response packet from a
device has the right flags set before passing it to them rest of the
memory system.
Andreas Sandberg [Mon, 8 Dec 2014 09:49:51 +0000 (04:49 -0500)]
dev: Correctly transform packets into responses
The VirtIO devices didn't correctly set the response flags in memory
packets. This changeset adds the required Packet::makeResponse()
calls.
Gabe Black [Sat, 6 Dec 2014 06:37:03 +0000 (22:37 -0800)]
misc: Generalize GDB single stepping.
The new single stepping implementation for x86 doesn't rely on any ISA
specific properties or functionality. This change pulls out the per ISA
implementation of those functions and promotes the X86 implementation to the
base class.
One drawback of that implementation is that the CPU might stop on an
instruction twice if it's affected by both breakpoints and single stepping.
While that might be a little surprising, it's harmless and would only happen
under somewhat unlikely circumstances.
Gabe Black [Sat, 6 Dec 2014 06:36:16 +0000 (22:36 -0800)]
x86: Implement a remote GDB stub.
This stub should allow remote debugging of 32 bit and 64 bit targets. Single
stepping seems to work, as do breakpoints. If both breakpoints and single
stepping affect an instruction, gdb will stop at the instruction twice before
continuing. That's a little surprising, but is generally harmless.
Gabe Black [Sat, 6 Dec 2014 06:35:47 +0000 (22:35 -0800)]
misc: Add some utility functions for schedule inst commit events.
These can be used to simplify the implementation of single step in derived
classes.
Gabe Black [Sat, 6 Dec 2014 06:34:42 +0000 (22:34 -0800)]
misc: Rename the GDB "Event" event class to InputEvent.
The "Event" name is the same as the base event class. That's a bit confusing,
and makes it a little awkward to add other event types.
Gabe Black [Fri, 5 Dec 2014 09:51:49 +0000 (01:51 -0800)]
sim: Ensure GDB interrupts the simulation at an instruction boundary.
Use the comInstEventQueue to ensure GDB interrupts the simulation at an
instruction boundary and not in the middle of a macroop, memory access, etc.
Gabe Black [Fri, 5 Dec 2014 09:47:35 +0000 (01:47 -0800)]
cpu: Only check for PC events on instruction boundaries.
Only the instruction address is actually checked, so there's no need to check
repeatedly while we're working through the microops of a macroop and that's
not changing.
Gabe Black [Fri, 5 Dec 2014 09:44:24 +0000 (01:44 -0800)]
misc: Make the GDB register cache accessible in various sized chunks.
Not all ISAs have 64 bit sized registers, so it's not always very convenient
to access the GDB register cache in 64 bit sized chunks. This change makes it
accessible in 8, 16, 32, or 64 bit chunks. The MIPS and ARM implementations
were working around that limitation by bundling and unbundling 32 bit values
into 64 bit values. That code has been removed.
Gabe Black [Fri, 5 Dec 2014 00:42:07 +0000 (16:42 -0800)]
config: Add two options for setting the kernel command line.
Both options accept template which will, through python string formatting,
have "mem", "disk", and "script" values substituted in from the mdesc.
Additional values can be used on a case by case basis by passing them as
keyword arguments to the fillInCmdLine function. That makes it possible to
have specialized parameters for a particular ISA, for instance.
The first option lets you specify the template directly, and the other lets
you specify a file which has the template in it.
Gabe Black [Thu, 4 Dec 2014 23:53:54 +0000 (15:53 -0800)]
x86: Rework opcode parsing to support 3 byte opcodes properly.
Instead of counting the number of opcode bytes in an instruction and recording
each byte before the actual opcode, we can represent the path we took to get to
the actual opcode byte by using a type code. That has a couple of advantages.
First, we can disambiguate the properties of opcodes of the same length which
have different properties. Second, it reduces the amount of data stored in an
ExtMachInst, making them slightly easier/faster to create and process. This
also adds some flexibility as far as how different types of opcodes are
handled, which might come in handy if we decide to support VEX or XOP
instructions.
This change also adds tables to support properly decoding 3 byte opcodes.
Before we would fall off the end of some arrays, on top of the ambiguity
described above.
This change doesn't measureably affect performance on the twolf benchmark.
--HG--
rename : src/arch/x86/isa/decoder/three_byte_opcodes.isa => src/arch/x86/isa/decoder/three_byte_0f38_opcodes.isa
rename : src/arch/x86/isa/decoder/three_byte_opcodes.isa => src/arch/x86/isa/decoder/three_byte_0f3a_opcodes.isa
Gabe Black [Thu, 4 Dec 2014 23:52:48 +0000 (15:52 -0800)]
arch: Allow named constants as decode case values.
The values in a "bitfield" or in an ExtMachInst structure member may not be a
literal value, it might select from an arbitrary collection of options. Instead
of using the raw value of those constants in the decoder, it's easier to tell
what's going on if they can be referred to as a symbolic constant/enum.
To support that, the ISA description language is extended slightly so that in
addition to integer literals, the case value for decode blobs can also be a
string literal. It's up to the ISA author to ensure that the string evaluates
to a legal constant value when interpretted as C++.
Nilay Vaish [Thu, 4 Dec 2014 14:59:44 +0000 (08:59 -0600)]
config: ruby: mi protocol: correct master slave setting for dma
In the MI protocol, the master slave connection between the dma controller
and network was being set incorrectly. This patch corrects it.
Gabe Black [Wed, 3 Dec 2014 06:01:51 +0000 (22:01 -0800)]
x86: Clean up style in process.cc.
Gabe Black [Wed, 3 Dec 2014 11:27:19 +0000 (03:27 -0800)]
sim: Make it possible to override the breakpoint length check.
The check which makes sure the length of the breakpoint being written is the
same as a MachInst is only correct on fixed instruction width ISAs. Instead of
incorrectly applying that check to all ISAs, this change makes that the
default check and lets ISA specific GDB classes override it.
Gabe Black [Wed, 3 Dec 2014 11:11:00 +0000 (03:11 -0800)]
config: Get rid of some extra spaces around default arguments.
Gabe Black [Wed, 3 Dec 2014 11:07:35 +0000 (03:07 -0800)]
ide: Accept the IDLE (0xe3) ATA command.
This command is supposed to set up a timer which will put the drive into a
standby mode if it isn't sent a command within a given time out. Since most of
the timeouts are generally significantly longer than a simulation would run
anyway, and we don't have an implementation for standby mode to begin with,
we can accept the command, do nothing, and report success.
Gabe Black [Wed, 3 Dec 2014 11:06:03 +0000 (03:06 -0800)]
dev: Support translating left and right ALT keys.
This is used primarily for VNC.
Andreas Hansson [Tue, 2 Dec 2014 11:08:25 +0000 (06:08 -0500)]
stats: Bump stats for fixes, mostly TLB and WriteInvalidate
Andreas Hansson [Tue, 2 Dec 2014 11:08:22 +0000 (06:08 -0500)]
scons: Ensure dictionary iteration is sorted by key
This patch adds sorting based on the SimObject name or parameter name
for all situations where we iterate over dictionaries. This should
ensure a deterministic and consistent order across the host systems
and hopefully avoid regression results differing across python
versions.
Curtis Dunham [Tue, 2 Dec 2014 11:08:19 +0000 (06:08 -0500)]
mem: Support WriteInvalidate (again)
This patch takes a clean-slate approach to providing WriteInvalidate
(write streaming, full cache line writes without first reading)
support.
Unlike the prior attempt, which took an aggressive approach of directly
writing into the cache before handling the coherence actions, this
approach follows the existing cache flows as closely as possible.
Curtis Dunham [Tue, 2 Dec 2014 11:08:17 +0000 (06:08 -0500)]
mem: Remove WriteInvalidate support
Prepare for a different implementation following in the next patch
Andrew Bardsley [Tue, 2 Dec 2014 11:08:15 +0000 (06:08 -0500)]
cpu: Fix retries on barrier/store in Minor's store buffer
This patch fixes a case where a store in Minor's store buffer never
leaves the store buffer as it is pre-maturely counted as having been
issued, leading to the store buffer idling.
LSQ::StoreBuffer::numUnissuedAccesses should count the number of accesses
either in memory, or still in the store buffer after being completed.
For stores which are also barriers, the store will stay in the store
buffer for a cycle after it is completed and will be cleaned up by the
barrier clearing code (to ensure that barriers are completed in-order).
To acheive this, numUnissuedAccesses is not decremented when a store-barrier
is issued to memory, but when its barrier effect is cleared.
Without this patch, the correct behaviour happens when a memory transaction
is immediately accepted, but not if it needs a retry.
Andrew Bardsley [Tue, 2 Dec 2014 11:08:13 +0000 (06:08 -0500)]
cpu: Fix memoryIssueLimit checking in Minor
This patch fixes the checking of the number of memory instructions issued
per cycles in the Minor CPU.
Andrew Bardsley [Tue, 2 Dec 2014 11:08:11 +0000 (06:08 -0500)]
arm: Fix TLB ignoring faults when table walking
This patch fixes a case where the Minor CPU can deadlock due to the lack
of a response to TLB request because of a bug in fault handling in the ARM
table walker.
TableWalker::processWalkWrapper is the scheduler-called wrapper which
handles deferred walks which calls to TableWalker::wait cannot immediately
process. The handling of faults generated by processWalk{AArch64,LPAE,}
calls in those two functions is is different. processWalkWrapper ignores
fault returns from processWalk... which can lead to ::finish not being
called on a translation.
This fix provides fault handling in processWalkWrapper similar to that
found in the leaf functions which BaseTLB::Translation::finish.
Andrew Bardsley [Tue, 2 Dec 2014 11:08:09 +0000 (06:08 -0500)]
config: Fix to SystemC example's event handling
This patch fixes checkpoint restore in the SystemC hosting example by handling
early PollEvent events correctly before any EventQueue events are posted.
The SystemC event queue handler (SCEventQueue) reports an error if the event
loop is entered with no Events posted. It is possible for this to happen
after instantiate due to PollEvent events. This patch separates out
`external' events into a different handler in sc_module.cc to prevent the
error from occurring.
This fix also improves the event handling of asynchronous events by:
1) Making asynchronous events 'catch up' gem5 time to SystemC
time to avoid the appearance that events have been lost
while servicing an asynchronous event that schedules an
event loop exit event
2) Add an in_simulate data member to Module to allow the event
loop to check whether events should be processed or deferred
until the next time Module::simulate is entered
3) Cancel pending events around the entry/exit of the event loop
in Module::simulate
4) Moving the state initialisation of the example entirely into
run to correct a problem with early events in checkpoint
restore.
It is still possible to schedule asynchronous events (and talk PollQueue
actions) while simulate is not running. This behaviour may stil cause
some problems.
Andrew Bardsley [Tue, 2 Dec 2014 11:08:06 +0000 (06:08 -0500)]
config: SystemC Gem5Control top level additions
This patch cleans up a few style issues and adds a few capabilities to the
SystemC top level 'Gem5Control/Gem5System' mechanism. These include:
1) A space to store/retrieve a version string for a model
2) A mechanism for registering functions to be called at the end of
elaboration to perform simulation setup tasks in SystemC
3) Adding setGDBRemotePort to the Gem5Control
4) Changing the sc_set_time_resolution behaviour to instead check that
the SystemC time resolution is already acceptable
Andreas Hansson [Tue, 2 Dec 2014 11:08:05 +0000 (06:08 -0500)]
stats: Bump stats for o3 LSQ changes
Marco Elver [Tue, 2 Dec 2014 11:08:03 +0000 (06:08 -0500)]
cpu, o3: Ignored invalidate causing same-address load reordering
In case the memory subsystem sends a combined response with invalidate
(e.g. ReadRespWithInvalidate), we cannot ignore the invalidate part
of the response.
If we were to ignore the invalidate part, under certain circumstances
this effectively leads to reordering of loads to the same address
which is not permitted under any memory consistency model implemented
in gem5.
Consider the case where a later load's address is computed before an
earlier load in program order, and is therefore sent to the memory
subsystem first. At some point the earlier load's address is computed
and in doing so correctly marks the later load as a
possibleLoadViolation. In the meantime some other node writes and
sends invalidations to all other nodes. The invalidation races with
the later load's ReadResp, and arrives before ReadResp and is
deferred. Upon receipt of the ReadResp, the response is changed to
ReadRespWithInvalidate, and sent to the CPU. If we ignore the
invalidate part of the packet, we let the later load read the old
value of the address. Eventually the earlier load's ReadResp arrives,
but with new data. As there was no invalidate snoop (sunk into the
ReadRespWithInvalidate), and if we did not process the invalidate of
the ReadRespWithInvalidate, we obtain a load reordering.
A similar scenario can be constructed where the earlier load's address
is computed after ReadRespWithInvalidate arrives for the younger
load. In this case hitExternalSnoop needs to be set to true on the
ReadRespWithInvalidate, so that upon knowing the address of the
earlier load, checkViolations will cause the later load to be
squashed.
Finally we must account for the case where both loads are sent to the
memory subsystem (reordered), a snoop invalidate arrives and correctly
sets the later loads fault to ReExec. However, before the CPU
processes the fault, the later load's ReadResp arrives and the
writeback discards the outstanding fault. We must add a check to
ensure that we do not skip any unprocessed faults.
Andreas Hansson [Tue, 2 Dec 2014 11:08:00 +0000 (06:08 -0500)]
cpu: Always mask the snoop address when performing lock check
Ensure the snoop address check is always using a cache-block aligned
address. This patch updates Alpha and Mips to match the other ISAs.
Stephan Diestelhorst [Tue, 2 Dec 2014 11:07:58 +0000 (06:07 -0500)]
cpu: Move packet deallocation to recvTimingResp in the O3 CPU
Move the packet deallocations in the O3 CPU so that the completeDataAccess
deals only with the LSQ specific parts and the generic recvTimingResp frees the
packet in all other cases.
Andreas Hansson [Tue, 2 Dec 2014 11:07:56 +0000 (06:07 -0500)]
mem: Relax packet src/dest check and shift onus to crossbar
This patch allows objects to get the src/dest of a packet even if it
is not set to a valid port id. This simplifies (ab)using the bridge as
a buffer and latency adapter in situations where the neighbouring
MemObjects are not crossbars.
The checks that were done in the packet are now shifted to the
crossbar where the fields are used to index into the port
arrays. Thus, the carrier of the information is not burdened with
checking, and the crossbar can check not only that the destination is
set, but also that the port index is within limits.
Andreas Hansson [Tue, 2 Dec 2014 11:07:54 +0000 (06:07 -0500)]
mem: Clean up packet data allocation
This patch attempts to make the rules for data allocation in the
packet explicit, understandable, and easy to verify. The constructor
that copies a packet is extended with an additional flag "alloc_data"
to enable the call site to explicitly say whether the newly created
packet is short-lived (a zero-time snoop), or has an unknown life-time
and therefore should allocate its own data (or copy a static pointer
in the case of static data).
The tricky case is the static data. In essence this is a
copy-avoidance scheme where the original source of the request (DMA,
CPU etc) does not ask the memory system to return data as part of the
packet, but instead provides a pointer, and then the memory system
carries this pointer around, and copies the appropriate data to the
location itself. Thus any derived packet actually never copies any
data. As the original source does not copy any data from the response
packet when arriving back at the source, we must maintain the copy of
the original pointer to not break the system. We might want to revisit
this one day and pay the price for a few extra memcpy invocations.
All in all this patch should make it easier to grok what is going on
in the memory system and how data is actually copied (or not).
Andreas Hansson [Tue, 2 Dec 2014 11:07:52 +0000 (06:07 -0500)]
mem: Cleanup Packet::checkFunctional and hasData usage
This patch cleans up the use of hasData and checkFunctional in the
packet. The hasData function is unfortunately suggesting that it
checks if the packet has a valid data pointer, when it does in fact
only check if the specific packet type is specified to have a data
payload. The confusion led to a bug in checkFunctional. The latter
function is also tidied up to avoid name overloading.
Andreas Hansson [Tue, 2 Dec 2014 11:07:50 +0000 (06:07 -0500)]
mem: Make the requests carried by packets const
This adds a basic level of sanity checking to the packet by ensuring
that a request is not modified once the packet is created. The only
issue that had to be worked around is the relaying of
software-prefetches in the cache. The specific situation is now solved
by first copying the request, and then creating a new packet
accordingly.
Andreas Hansson [Tue, 2 Dec 2014 11:07:48 +0000 (06:07 -0500)]
mem: Make Request getters const
This patch tidies up the Request class, making all getters const. The
odd one out is incAccessDepth which is called by the memory system as
packets carry the request around. This is also const to enable the
packet to hold on to a const Request.
Andreas Hansson [Tue, 2 Dec 2014 11:07:46 +0000 (06:07 -0500)]
mem: Add checks and explanation for assertMemInhibit usage
Andreas Hansson [Tue, 2 Dec 2014 11:07:43 +0000 (06:07 -0500)]
mem: Assume all dynamic packet data is array allocated
This patch simplifies how we deal with dynamically allocated data in
the packet, always assuming that it is array allocated, and hence
should be array deallocated (delete[] as opposed to delete). The only
uses of dataDynamic was in the Ruby testers.
The ARRAY_DATA flag in the packet is removed accordingly. No
defragmentation of the flags is done at this point, leaving a gap in
the bit masks.
As the last part the patch, it renames dataDynamicArray to dataDynamic.
Andreas Hansson [Tue, 2 Dec 2014 11:07:41 +0000 (06:07 -0500)]
mem: Remove redundant Packet::allocate calls
This patch cleans up the packet memory allocation confusion. The data
is always allocated at the requesting side, when a packet is created
(or copied), and there is never a need for any device to allocate any
space if it is merely responding to a paket. This behaviour is in line
with how SystemC and TLM works as well, thus increasing
interoperability, and matching established conventions.
The redundant calls to Packet::allocate are removed, and the checks in
the function are tightened up to make sure data is only ever allocated
once. There are still some oddities in the packet copy constructor
where we copy the data pointer if it is static (without ownership),
and allocate new space if the data is dynamic (with ownership). The
latter is being worked on further in a follow-on patch.
Andreas Hansson [Tue, 2 Dec 2014 11:07:38 +0000 (06:07 -0500)]
mem: Use const pointers for port proxy write functions
This patch changes the various write functions in the port proxies
to use const pointers for all sources (similar to how memcpy works).
The one unfortunate aspect is the need for a const_cast in the packet,
to avoid having to juggle a const and a non-const data pointer. This
design decision can always be re-evaluated at a later stage.
Andreas Hansson [Tue, 2 Dec 2014 11:07:36 +0000 (06:07 -0500)]
mem: Add const getters for write packet data
This patch takes a first step in tightening up how we use the data
pointer in write packets. A const getter is added for the pointer
itself (getConstPtr), and a number of member functions are also made
const accordingly. In a range of places throughout the memory system
the new member is used.
The patch also removes the unused isReadWrite function.
Andreas Hansson [Tue, 2 Dec 2014 11:07:34 +0000 (06:07 -0500)]
mem: Remove null-check bypassing in Packet::getPtr
This patch removes the parameter that enables bypassing the null check
in the Packet::getPtr method. A number of call sites assume the value
to be non-null.
The one odd case is the RubyTester, which issues zero-sized
prefetches(!), and despite being reads they had no valid data
pointer. This is now fixed, but the size oddity remains (unless anyone
object or has any good suggestions).
Finally, in the Ruby Sequencer, appropriate checks are made for flush
packets as they have no valid data pointer.
Omar Naji [Tue, 2 Dec 2014 11:07:32 +0000 (06:07 -0500)]
mem: Add a GDDR5 DRAM config
This patch adds a first cut GDDR5 config to accommodate the users
combining gem5 and GPUSim. The config is based on a SK Hynix
datasheet, and the Nvidia GTX580 specification. Someone from the
GPUSim user-camp should tweak the default page-policy and static
frontend and backend latencies.
Andreas Hansson [Mon, 24 Nov 2014 14:03:39 +0000 (09:03 -0500)]
stats: Bump stats after static analysis fixes
Fixing up the uninitialised values changes two of the x86 Linux boot
regressions slightly.
Andreas Hansson [Mon, 24 Nov 2014 14:03:38 +0000 (09:03 -0500)]
misc: Another round of static analysis fixups
Mostly addressing uninitialised members.
Alexandru Dutu [Mon, 24 Nov 2014 02:01:09 +0000 (18:01 -0800)]
mem: Page Table map api modification
This patch adds uncacheable/cacheable and read-only/read-write attributes to
the map method of PageTableBase. It also modifies the constructor of TlbEntry
structs for all architectures to consider the new attributes.
Alexandru Dutu [Mon, 24 Nov 2014 02:01:09 +0000 (18:01 -0800)]
mem: Multi Level Page Table bug fix
The multi level page table was giving false positives for already mapped
translations. This patch fixes the bogus behavior.
Alexandru Dutu [Mon, 24 Nov 2014 02:01:09 +0000 (18:01 -0800)]
mem: Page Table long lines
Trimmed down all the lines greater than 78 characters.
Alexandru Dutu [Mon, 24 Nov 2014 02:01:08 +0000 (18:01 -0800)]
config, kvm: Enabling KvmCPU in SE mode
This patch modifies se.py such that it can now use kvm cpu model.
Alexandru Dutu [Mon, 24 Nov 2014 02:01:08 +0000 (18:01 -0800)]
x86: Segment initialization to support KvmCPU in SE
This patch sets up low and high privilege code and data segments and places them
in the following order: cs low, ds low, ds, cs, in the GDT. Additionally, a
syscall and page fault handler for KvmCPU in SE mode are defined. The order of
the segment selectors in GDT is required in this manner for interrupt handling
to work properly. Segment initialization is done for all the thread
contexts.
Alexandru Dutu [Mon, 24 Nov 2014 02:01:08 +0000 (18:01 -0800)]
kvm, x86: Adding support for SE mode execution
This patch adds methods in KvmCPU model to handle KVM exits caused by syscall
instructions and page faults. These types of exits will be encountered if
KvmCPU is run in SE mode.
Alexandru Dutu [Mon, 24 Nov 2014 02:01:08 +0000 (18:01 -0800)]
cpuid, x86: Enabling more features in CPUid
Adding more features in the CPUid with the purpose of supporting running the
KvmCPU in SE mode.
Steve Reinhardt [Mon, 24 Nov 2014 02:00:47 +0000 (18:00 -0800)]
Backed out prior changeset
f9fb64a72259
Back out use of importlib to avoid implicitly creating
dependency on Python 2.7.
Gabe Black [Sun, 23 Nov 2014 13:55:26 +0000 (05:55 -0800)]
config: ruby: Get rid of an "eval" and an "exec" operating on generated code.
We can get the same result using importlib.
Gabe Black [Sat, 22 Nov 2014 01:22:19 +0000 (17:22 -0800)]
x86: Update stats for the new Linux delay port.
Gabe Black [Sat, 22 Nov 2014 01:22:02 +0000 (17:22 -0800)]
x86: pc: Put a stub IO device at port 0xed which the kernel can use for delays.
There was already a stub device at 0x80, the port traditionally used for an IO
delay. 0x80 is also the port used for POST codes sent by firmware, and that
may have prompted adding this port as a second option.
Nilay Vaish [Wed, 19 Nov 2014 01:17:29 +0000 (19:17 -0600)]
configs: small fix to ruby portion of fs.py and se.py
In fs.py the io port controller was being attached to the iobus multiple
times. This should be done only once. In se.py, the the option use_map
was being set which no longer exists.
Gabe Black [Tue, 18 Nov 2014 10:38:23 +0000 (02:38 -0800)]
dev: Use fixed size member variables to describe fixed size PL111 registers.
Gabe Black [Mon, 17 Nov 2014 09:45:42 +0000 (01:45 -0800)]
vnc: Add a conversion function for bgr888.
Gabe Black [Mon, 17 Nov 2014 09:00:53 +0000 (01:00 -0800)]
x86: Fix setting segment bases in real mode.
The data size used for actually writing the base value for the segment was the
default size, but really it should set the entire value without any possible
truncation.
Gabe Black [Mon, 17 Nov 2014 08:20:01 +0000 (00:20 -0800)]
x86: Fix some bugs in the real mode far jmp instruction.
The far pointer should be shifted right to get the selector value, not left.
Also, when calculating the width of the offset, the wrong register was used in
one spot.
Gabe Black [Mon, 17 Nov 2014 08:19:07 +0000 (00:19 -0800)]
x86: APIC: Only set deliveryStatus if our IPI is going somewhere.
Otherwise the IPI which isn't sent will never arrive, and the deliveryStatus
bit will never be cleared.
Gabe Black [Mon, 17 Nov 2014 08:17:06 +0000 (00:17 -0800)]
x86: APIC: Fix the getRegArrayBit function.
The getRegArrayBit function extracts a bit from a series of registers which
are treated as a single large bit array. A previous change had modified the
logic which figured out which bit to extract from ">> 5" to "% 5" which seems
wrong, especially when other, similar functions were changed to use "% 32".
Gabe Black [Mon, 17 Nov 2014 08:16:36 +0000 (00:16 -0800)]
x86: Update the stats for the x86 FS o3 boot test.
Gabe Black [Mon, 17 Nov 2014 07:12:42 +0000 (23:12 -0800)]
x86: Fix the CPUID Long Mode Address Size function.
The value in EAX has an 8 bit field for the linear address size and one for
the physical address size when calling that function. A recent change
implemented it but returned 0xff for both of those fields. That implies that
linear and physical addresses are 255 bits wide which is wrong. When using the
KVM CPU model this causes an error, presumably because some of those bits are
actually reserved, or the CPU or kernel realizes 255 bits is a bad value.
This change makes those values 48.
Andrew Bardsley [Fri, 14 Nov 2014 08:54:02 +0000 (03:54 -0500)]
config: Fix checkpoint restore in C++ config example
This patch fixes the checkpoint restore option in the example of C++
configuration (util/cxx_config).
The fix introduces a call to config_manager->startup() (which calls startup
on all SimObjects managed by that manager) to replicate the loop of
SimObject::startup calls in src/python/m5/simulate.py::simulate guarded by
need_startup. As util/cxx_config/main.cc is a C++ analogue of
src/python/mt/simulate.py, it should make a similar set of calls.
Andreas Hansson [Fri, 14 Nov 2014 08:53:51 +0000 (03:53 -0500)]
arm: Fixes based on UBSan and static analysis
Another churn to clean up undefined behaviour, mostly ARM, but some
parts also touching the generic part of the code base.
Most of the fixes are simply ensuring that proper intialisation. One
of the more subtle changes is the return type of the sign-extension,
which is changed to uint64_t. This is to avoid shifting negative
values (undefined behaviour) in the ISA code.
Andreas Hansson [Fri, 14 Nov 2014 08:53:48 +0000 (03:53 -0500)]
mem: Clarify unit of DRAM controller buffer size
Andreas Hansson [Wed, 12 Nov 2014 14:05:25 +0000 (09:05 -0500)]
stats: Bump regressions to match latest changes
Updates after timezone hick-up and sorting of dictionary items in the
SimObject.
Mitch Hayenga [Wed, 12 Nov 2014 14:05:23 +0000 (09:05 -0500)]
mem: Delete unused variable in Garnet NetworkLink
With recent changes OSX clang compilation fails due to an unused variable.
Ali Saidi [Wed, 12 Nov 2014 14:05:22 +0000 (09:05 -0500)]
arm: Fix timing wakeup with LLSC
Andreas Hansson [Wed, 12 Nov 2014 14:05:21 +0000 (09:05 -0500)]
sim: Sort SimObject descendants and ports
This patch fixes a number of occurences where the sorting order of the
objects was implementation defined.