cpu: Fix o3 drain bug
authorMitch Hayenga <mitch.hayenga@arm.com>
Wed, 3 Sep 2014 11:42:45 +0000 (07:42 -0400)
committerMitch Hayenga <mitch.hayenga@arm.com>
Wed, 3 Sep 2014 11:42:45 +0000 (07:42 -0400)
commit659bdc1a6b50ace4803d754ad982cd6a79b5695f
treec9107ba714b79605e0ea90a003757cdf4b152a23
parentbb1e6cf7c4d64a56b80d3d69ba25e8ff7d455bbd
cpu: Fix o3 drain bug

For X86, the o3 CPU would get stuck with the commit stage not being
drained if an interrupt arrived while drain was pending. isDrained()
makes sure that pcState.microPC() == 0, thus ensuring that we are at
an instruction boundary. However, when we take an interrupt we
execute:

    pcState.upc(romMicroPC(entry));
    pcState.nupc(romMicroPC(entry) + 1);
    tc->pcState(pcState);

As a result, the MicroPC is no longer zero. This patch ensures the drain is
delayed until no interrupts are present.  Once draining, non-synchronous
interrupts are deffered until after the switch.
src/cpu/o3/commit.hh
src/cpu/o3/commit_impl.hh