I just reverted the change sets that  broke Alpha O3, I wasn't  
selective about the reverting.

Ali

On Nov 14, 2008, at 3:38 AM, Gabe Black wrote:

> Why did you delete the add_entry function from IntelMP.py? Especially
> why did you do that in this change? That broke full system x86.
>
> Gabe
>
> Ali Saidi wrote:
>> changeset bf84e2fa05f7 in /z/repo/m5
>> details: http://repo.m5sim.org/m5?cmd=changeset;node=bf84e2fa05f7
>> description:
>>      O3CPU: Undo Gabe's changes to remove hwrei and simpalcheck from O3  
>> CPU.  Removing hwrei causes
>>      the instruction after the hwrei to be fetched before the ITB/ 
>> DTB_CM register is updated in a call pal
>>      call sys and thus the translation fails because the user is  
>> attempting to access a super page address.
>>
>>      Minimally, it seems as though some sort of fetch stall or refetch  
>> after a hwrei is required. I think
>>      this works currently because the hwrei uses the exec context  
>> interface, and the o3 stalls when that occurs.
>>
>>      Additionally, these changes don't update the LOCK register and  
>> probably break ll/sc. Both o3 changes were
>>      removed since a great deal of manual patching would be required to  
>> only remove the hwrei change.
>>
>> diffstat:
>>
>> 16 files changed, 78 insertions(+), 17 deletions(-)
>> src/arch/alpha/ev5.cc          |   23 +++++++++++++++++++++++
>> src/arch/alpha/isa/decoder.isa |   11 -----------
>> src/arch/alpha/isa/main.isa    |    1 -
>> src/arch/x86/bios/IntelMP.py   |    4 ----
>> src/cpu/checker/cpu.hh         |    1 +
>> src/cpu/exec_context.hh        |    6 +++++-
>> src/cpu/o3/cpu.cc              |    2 ++
>> src/cpu/o3/cpu.hh              |    2 ++
>> src/cpu/o3/dyn_inst.hh         |    2 ++
>> src/cpu/o3/dyn_inst_impl.hh    |   18 ++++++++++++++++++
>> src/cpu/ozone/cpu.hh           |    1 +
>> src/cpu/ozone/cpu_impl.hh      |    7 +++++++
>> src/cpu/ozone/dyn_inst.hh      |    1 +
>> src/cpu/ozone/dyn_inst_impl.hh |   13 +++++++++++++
>> src/cpu/simple/base.hh         |    1 +
>> src/cpu/simple_thread.hh       |    2 ++
>>
>> diffs (truncated from 465 to 300 lines):
>>
>> diff -r 8ba6b8d32aca -r bf84e2fa05f7 src/arch/alpha/ev5.cc
>> --- a/src/arch/alpha/ev5.cc  Sun Oct 19 22:50:53 2008 -0400
>> +++ b/src/arch/alpha/ev5.cc  Mon Oct 20 16:22:59 2008 -0400
>> @@ -547,3 +547,53 @@
>> }
>>
>> } // namespace AlphaISA
>> +
>> +#if FULL_SYSTEM
>> +
>> +using namespace AlphaISA;
>> +
>> +Fault
>> +SimpleThread::hwrei()
>> +{
>> +    if (!(readPC() & 0x3))
>> +        return new UnimplementedOpcodeFault;
>> +
>> +    setNextPC(readMiscRegNoEffect(IPR_EXC_ADDR));
>> +
>> +    if (!misspeculating()) {
>> +        if (kernelStats)
>> +            kernelStats->hwrei();
>> +    }
>> +
>> +    // FIXME: XXX check for interrupts? XXX
>> +    return NoFault;
>> +}
>> +
>> +/**
>> + * Check for special simulator handling of specific PAL calls.
>> + * If return value is false, actual PAL call will be suppressed.
>> + */
>> +bool
>> +SimpleThread::simPalCheck(int palFunc)
>> +{
>> +    if (kernelStats)
>> +        kernelStats->callpal(palFunc, tc);
>> +
>> +    switch (palFunc) {
>> +      case PAL::halt:
>> +        halt();
>> +        if (--System::numSystemsRunning == 0)
>> +            exitSimLoop("all cpus halted");
>> +        break;
>> +
>> +      case PAL::bpt:
>> +      case PAL::bugchk:
>> +        if (system->breakpoint())
>> +            return false;
>> +        break;
>> +    }
>> +
>> +    return true;
>> +}
>> +
>> +#endif // FULL_SYSTEM
>> diff -r 8ba6b8d32aca -r bf84e2fa05f7 src/arch/alpha/isa/decoder.isa
>> --- a/src/arch/alpha/isa/decoder.isa Sun Oct 19 22:50:53 2008 -0400
>> +++ b/src/arch/alpha/isa/decoder.isa Mon Oct 20 16:22:59 2008 -0400
>> @@ -698,28 +698,7 @@
>>         else {
>>             // check to see if simulator wants to do something  
>> special
>>             // on this PAL call (including maybe suppress it)
>> -
>> -            bool dopal = true;
>> -
>> -            ThreadContext * tc = xc->tcBase();
>> -            AlphaISA::Kernel::Statistics * kernelStats = tc- 
>> >getKernelStats();
>> -            System * system = tc->getSystemPtr();
>> -            if (kernelStats)
>> -                kernelStats->callpal(palFunc, tc);
>> -
>> -            switch (palFunc) {
>> -              case PAL::halt:
>> -                tc->halt();
>> -                if (--System::numSystemsRunning == 0)
>> -                    exitSimLoop("all cpus halted");
>> -                break;
>> -
>> -              case PAL::bpt:
>> -              case PAL::bugchk:
>> -                if (system->breakpoint())
>> -                    dopal = false;
>> -                break;
>> -            }
>> +            bool dopal = xc->simPalCheck(palFunc);
>>
>>             if (dopal) {
>>                 xc->setMiscReg(IPR_EXC_ADDR, NPC);
>> @@ -807,16 +786,7 @@
>>     format BasicOperate {
>>         0x1e: decode PALMODE {
>>             0: OpcdecFault::hw_rei();
>> -            1: hw_rei({{
>> -                NPC = ExcAddr;
>> -                ThreadContext * tc = xc->tcBase();
>> -                if (!tc->misspeculating()) {
>> -                    AlphaISA::Kernel::Statistics * kernelStats =
>> -                        tc->getKernelStats();
>> -                    if (kernelStats)
>> -                        kernelStats->hwrei();
>> -                }
>> -            }}, IsSerializing, IsSerializeBefore);
>> +            1:hw_rei({{ xc->hwrei(); }}, IsSerializing,  
>> IsSerializeBefore);
>>         }
>>
>>         // M5 special opcodes use the reserved 0x01 opcode space
>> diff -r 8ba6b8d32aca -r bf84e2fa05f7 src/arch/alpha/isa/main.isa
>> --- a/src/arch/alpha/isa/main.isa    Sun Oct 19 22:50:53 2008 -0400
>> +++ b/src/arch/alpha/isa/main.isa    Mon Oct 20 16:22:59 2008 -0400
>> @@ -69,8 +69,6 @@
>> #include <math.h>
>>
>> #if FULL_SYSTEM
>> -#include "arch/alpha/kernel_stats.hh"
>> -#include "arch/alpha/osfpal.hh"
>> #include "sim/pseudo_inst.hh"
>> #endif
>> #include "arch/alpha/ipr.hh"
>> @@ -189,7 +187,6 @@
>>     'Runiq': ('ControlReg', 'uq', 'MISCREG_UNIQ', None, 1),
>>     'FPCR':  ('ControlReg', 'uq', 'MISCREG_FPCR', None, 1),
>>     'IntrFlag': ('ControlReg', 'uq', 'MISCREG_INTR', None, 1),
>> -    'ExcAddr': ('ControlReg', 'uq', 'IPR_EXC_ADDR', None, 1),
>>     # The next two are hacks for non-full-system call-pal emulation
>>     'R0':  ('IntReg', 'uq', '0', None, 1),
>>     'R16': ('IntReg', 'uq', '16', None, 1),
>> diff -r 8ba6b8d32aca -r bf84e2fa05f7 src/arch/x86/bios/IntelMP.py
>> --- a/src/arch/x86/bios/IntelMP.py   Sun Oct 19 22:50:53 2008 -0400
>> +++ b/src/arch/x86/bios/IntelMP.py   Mon Oct 20 16:22:59 2008 -0400
>> @@ -85,15 +85,6 @@
>>
>>     ext_entries = VectorParam.X86IntelMPExtConfigEntry([],
>>             'extended configuration table entries')
>> -
>> -    def add_entry(self, entry):
>> -        if isinstance(entry, X86IntelMPBaseConfigEntry):
>> -            self.base_entries.append(entry)
>> -        elif isinstance(entry, X86IntelMPExtConfigEntry):
>> -            self.base_entries.append(entry)
>> -        else:
>> -            panic("Don't know what type of Intel MP entry %s is." \
>> -                    % entry.__class__.__name__)
>>
>> class X86IntelMPBaseConfigEntry(SimObject):
>>     type = 'X86IntelMPBaseConfigEntry'
>> diff -r 8ba6b8d32aca -r bf84e2fa05f7 src/cpu/checker/cpu.hh
>> --- a/src/cpu/checker/cpu.hh Sun Oct 19 22:50:53 2008 -0400
>> +++ b/src/cpu/checker/cpu.hh Mon Oct 20 16:22:59 2008 -0400
>> @@ -336,7 +336,9 @@
>>     void translateDataReadReq(Request *req);
>>
>> #if FULL_SYSTEM
>> +    Fault hwrei() { return thread->hwrei(); }
>>     void ev5_trap(Fault fault) { fault->invoke(tc); }
>> +    bool simPalCheck(int palFunc) { return thread- 
>> >simPalCheck(palFunc); }
>> #else
>>     // Assume that the normal CPU's call to syscall was successful.
>>     // The checker's state would have already been updated by the  
>> syscall.
>> diff -r 8ba6b8d32aca -r bf84e2fa05f7 src/cpu/exec_context.hh
>> --- a/src/cpu/exec_context.hh        Sun Oct 19 22:50:53 2008 -0400
>> +++ b/src/cpu/exec_context.hh        Mon Oct 20 16:22:59 2008 -0400
>> @@ -143,7 +143,17 @@
>>      * given flags. */
>>     void writeHint(Addr addr, int size, unsigned flags);
>>
>> -#if !FULL_SYSTEM
>> +#if FULL_SYSTEM
>> +    /** Somewhat Alpha-specific function that handles returning from
>> +     * an error or interrupt. */
>> +    Fault hwrei();
>> +
>> +    /**
>> +     * Check for special simulator handling of specific PAL  
>> calls.  If
>> +     * return value is false, actual PAL call will be suppressed.
>> +     */
>> +    bool simPalCheck(int palFunc);
>> +#else
>>     /** Executes a syscall specified by the callnum. */
>>     void syscall(int64_t callnum);
>> #endif
>> diff -r 8ba6b8d32aca -r bf84e2fa05f7 src/cpu/o3/cpu.cc
>> --- a/src/cpu/o3/cpu.cc      Sun Oct 19 22:50:53 2008 -0400
>> +++ b/src/cpu/o3/cpu.cc      Mon Oct 20 16:22:59 2008 -0400
>> @@ -51,6 +51,10 @@
>>
>> #if USE_CHECKER
>> #include "cpu/checker/cpu.hh"
>> +#endif
>> +
>> +#if THE_ISA == ALPHA_ISA
>> +#include "arch/alpha/osfpal.hh"
>> #endif
>>
>> class BaseCPUParams;
>> @@ -899,6 +903,47 @@
>>         DPRINTF(IPI,"Suspended Processor awoke\n");
>>         this->threadContexts[0]->activate();
>>     }
>> +}
>> +
>> +template <class Impl>
>> +Fault
>> +FullO3CPU<Impl>::hwrei(unsigned tid)
>> +{
>> +#if THE_ISA == ALPHA_ISA
>> +    // Need to clear the lock flag upon returning from an interrupt.
>> +    this->setMiscRegNoEffect(AlphaISA::MISCREG_LOCKFLAG, false,  
>> tid);
>> +
>> +    this->thread[tid]->kernelStats->hwrei();
>> +
>> +    // FIXME: XXX check for interrupts? XXX
>> +#endif
>> +    return NoFault;
>> +}
>> +
>> +template <class Impl>
>> +bool
>> +FullO3CPU<Impl>::simPalCheck(int palFunc, unsigned tid)
>> +{
>> +#if THE_ISA == ALPHA_ISA
>> +    if (this->thread[tid]->kernelStats)
>> +        this->thread[tid]->kernelStats->callpal(palFunc,
>> +                                                this- 
>> >threadContexts[tid]);
>> +
>> +    switch (palFunc) {
>> +      case PAL::halt:
>> +        halt();
>> +        if (--System::numSystemsRunning == 0)
>> +            exitSimLoop("all cpus halted");
>> +        break;
>> +
>> +      case PAL::bpt:
>> +      case PAL::bugchk:
>> +        if (this->system->breakpoint())
>> +            return false;
>> +        break;
>> +    }
>> +#endif
>> +    return true;
>> }
>>
>> template <class Impl>
>> diff -r 8ba6b8d32aca -r bf84e2fa05f7 src/cpu/o3/cpu.hh
>> --- a/src/cpu/o3/cpu.hh      Sun Oct 19 22:50:53 2008 -0400
>> +++ b/src/cpu/o3/cpu.hh      Mon Oct 20 16:22:59 2008 -0400
>> @@ -414,6 +414,11 @@
>>     /** Posts an interrupt. */
>>     void post_interrupt(int int_num, int index);
>>
>> +    /** HW return from error interrupt. */
>> +    Fault hwrei(unsigned tid);
>> +
>> +    bool simPalCheck(int palFunc, unsigned tid);
>> +
>>     /** Returns the Fault for any valid interrupt. */
>>     Fault getInterrupts();
>>
>> diff -r 8ba6b8d32aca -r bf84e2fa05f7 src/cpu/o3/dyn_inst.hh
>> --- a/src/cpu/o3/dyn_inst.hh Sun Oct 19 22:50:53 2008 -0400
>> +++ b/src/cpu/o3/dyn_inst.hh Mon Oct 20 16:22:59 2008 -0400
>> @@ -168,8 +168,11 @@
>>     }
>>
>> #if FULL_SYSTEM
>> +    /** Calls hardware return from error interrupt. */
>> +    Fault hwrei();
>>     /** Traps to handle specified fault. */
>>     void trap(Fault fault);
>> +    bool simPalCheck(int palFunc);
>> #else
>>     /** Calls a syscall. */
>>     void syscall(int64_t callnum);
>> diff -r 8ba6b8d32aca -r bf84e2fa05f7 src/cpu/o3/dyn_inst_impl.hh
>> --- a/src/cpu/o3/dyn_inst_impl.hh    Sun Oct 19 22:50:53 2008 -0400
>> +++ b/src/cpu/o3/dyn_inst_impl.hh    Mon Oct 20 16:22:59 2008 -0400
>> @@ -125,10 +125,42 @@
>>
>> #if FULL_SYSTEM
>> template <class Impl>
>> +Fault
>> +BaseO3DynInst<Impl>::hwrei()
>> +{
>> +#if THE_ISA == ALPHA_ISA
>> +    // Can only do a hwrei when in pal mode.
>> +    if (!(this->readPC() & 0x3))
>> +        return new AlphaISA::UnimplementedOpcodeFault;
>> +
>> +    // Set the next PC based on the value of the EXC_ADDR IPR.
>> +    this->setNextPC(this->cpu- 
>> >readMiscRegNoEffect(AlphaISA::IPR_EXC_ADDR,
>> +                                           this->threadNumber));
>> +
>> +    // Tell CPU to clear any state it needs to if a hwrei is taken.
>> +    this->cpu->hwrei(this->threadNumber);
>> +#else
>> +
>> +#endif
>> +    // FIXME: XXX check for interrupts? XXX
>> +    return NoFault;
>> _______________________________________________
>> m5-dev mailing list
>> [email protected]
>> http://m5sim.org/mailman/listinfo/m5-dev
>>
>
> _______________________________________________
> m5-dev mailing list
> [email protected]
> http://m5sim.org/mailman/listinfo/m5-dev
>

_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to