system.hh revision 5991
13101Sstever@eecs.umich.edu/*
23101Sstever@eecs.umich.edu * Copyright (c) 2004-2006 The Regents of The University of Michigan
33101Sstever@eecs.umich.edu * All rights reserved.
43101Sstever@eecs.umich.edu *
53101Sstever@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
63101Sstever@eecs.umich.edu * modification, are permitted provided that the following conditions are
73101Sstever@eecs.umich.edu * met: redistributions of source code must retain the above copyright
83101Sstever@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
93101Sstever@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
103101Sstever@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
113101Sstever@eecs.umich.edu * documentation and/or other materials provided with the distribution;
123101Sstever@eecs.umich.edu * neither the name of the copyright holders nor the names of its
133101Sstever@eecs.umich.edu * contributors may be used to endorse or promote products derived from
143101Sstever@eecs.umich.edu * this software without specific prior written permission.
153101Sstever@eecs.umich.edu *
163101Sstever@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
173101Sstever@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
183101Sstever@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
193101Sstever@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
203101Sstever@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
213101Sstever@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
223101Sstever@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
233101Sstever@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
243101Sstever@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
253101Sstever@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
263101Sstever@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273101Sstever@eecs.umich.edu *
283101Sstever@eecs.umich.edu * Authors: Ali Saidi
293101Sstever@eecs.umich.edu *          Lisa Hsu
303101Sstever@eecs.umich.edu *          Nathan Binkert
313101Sstever@eecs.umich.edu */
323101Sstever@eecs.umich.edu
333101Sstever@eecs.umich.edu#ifndef __ARCH_ALPHA_LINUX_SYSTEM_HH__
343101Sstever@eecs.umich.edu#define __ARCH_ALPHA_LINUX_SYSTEM_HH__
353101Sstever@eecs.umich.edu
363101Sstever@eecs.umich.educlass ThreadContext;
373101Sstever@eecs.umich.edu
383101Sstever@eecs.umich.educlass BreakPCEvent;
393101Sstever@eecs.umich.educlass IdleStartEvent;
403101Sstever@eecs.umich.edu
413101Sstever@eecs.umich.edu#include "arch/alpha/idle_event.hh"
423101Sstever@eecs.umich.edu#include "arch/alpha/system.hh"
433101Sstever@eecs.umich.edu#include "kern/linux/events.hh"
443101Sstever@eecs.umich.edu#include "params/LinuxAlphaSystem.hh"
453101Sstever@eecs.umich.edu
463101Sstever@eecs.umich.edu/**
473885Sbinkertn@umich.edu * This class contains linux specific system code (Loading, Events).
483885Sbinkertn@umich.edu * It points to objects that are the system binaries to load and patches them
493885Sbinkertn@umich.edu * appropriately to work in simulator.
503885Sbinkertn@umich.edu */
513885Sbinkertn@umich.educlass LinuxAlphaSystem : public AlphaSystem
523885Sbinkertn@umich.edu{
533101Sstever@eecs.umich.edu  private:
544380Sbinkertn@umich.edu    struct SkipDelayLoopEvent : public SkipFuncEvent
554167Sbinkertn@umich.edu    {
563102Sstever@eecs.umich.edu        SkipDelayLoopEvent(PCEventQueue *q, const std::string &desc, Addr addr)
573101Sstever@eecs.umich.edu            : SkipFuncEvent(q, desc, addr) {}
583101Sstever@eecs.umich.edu        virtual void process(ThreadContext *tc);
593101Sstever@eecs.umich.edu    };
603101Sstever@eecs.umich.edu
613101Sstever@eecs.umich.edu    struct PrintThreadInfo : public PCEvent
623101Sstever@eecs.umich.edu    {
633101Sstever@eecs.umich.edu        PrintThreadInfo(PCEventQueue *q, const std::string &desc, Addr addr)
643101Sstever@eecs.umich.edu            : PCEvent(q, desc, addr) {}
653101Sstever@eecs.umich.edu        virtual void process(ThreadContext *tc);
663101Sstever@eecs.umich.edu    };
673101Sstever@eecs.umich.edu
683101Sstever@eecs.umich.edu    /**
693101Sstever@eecs.umich.edu     * Addresses defining where the kernel bootloader places various
703101Sstever@eecs.umich.edu     * elements.  Details found in include/asm-alpha/system.h
713101Sstever@eecs.umich.edu     */
723101Sstever@eecs.umich.edu    Addr KernelStart; // Lookup the symbol swapper_pg_dir
733101Sstever@eecs.umich.edu
743101Sstever@eecs.umich.edu  public:
753101Sstever@eecs.umich.edu    Addr InitStack() const { return KernelStart + 0x02000; }
763101Sstever@eecs.umich.edu    Addr EmptyPGT() const  { return KernelStart + 0x04000; }
773101Sstever@eecs.umich.edu    Addr EmptyPGE() const  { return KernelStart + 0x08000; }
783101Sstever@eecs.umich.edu    Addr ZeroPGE() const   { return KernelStart + 0x0A000; }
793101Sstever@eecs.umich.edu    Addr StartAddr() const { return KernelStart + 0x10000; }
803101Sstever@eecs.umich.edu
813101Sstever@eecs.umich.edu    Addr Param() const { return ZeroPGE() + 0x0; }
823101Sstever@eecs.umich.edu    Addr CommandLine() const { return Param() + 0x0; }
833101Sstever@eecs.umich.edu    Addr InitrdStart() const { return Param() + 0x100; }
843101Sstever@eecs.umich.edu    Addr InitrdSize() const { return Param() + 0x108; }
853101Sstever@eecs.umich.edu    static const int CommandLineSize = 256;
863101Sstever@eecs.umich.edu
873101Sstever@eecs.umich.edu  private:
883101Sstever@eecs.umich.edu#ifndef NDEBUG
893101Sstever@eecs.umich.edu    /** Event to halt the simulator if the kernel calls panic()  */
903101Sstever@eecs.umich.edu    BreakPCEvent *kernelPanicEvent;
913101Sstever@eecs.umich.edu
923101Sstever@eecs.umich.edu    /** Event to halt the simulator if the kernel calls die_if_kernel  */
933101Sstever@eecs.umich.edu    BreakPCEvent *kernelDieEvent;
943101Sstever@eecs.umich.edu#endif
953101Sstever@eecs.umich.edu
963101Sstever@eecs.umich.edu    /**
973101Sstever@eecs.umich.edu     * Event to skip determine_cpu_caches() because we don't support
983101Sstever@eecs.umich.edu     * the IPRs that the code can access to figure out cache sizes
993101Sstever@eecs.umich.edu     */
1003101Sstever@eecs.umich.edu    SkipFuncEvent *skipCacheProbeEvent;
1013101Sstever@eecs.umich.edu
1023101Sstever@eecs.umich.edu    /** PC based event to skip the ide_delay_50ms() call */
1033101Sstever@eecs.umich.edu    SkipFuncEvent *skipIdeDelay50msEvent;
1043101Sstever@eecs.umich.edu
1053101Sstever@eecs.umich.edu    /**
1063101Sstever@eecs.umich.edu     * PC based event to skip the dprink() call and emulate its
1073101Sstever@eecs.umich.edu     * functionality
1083101Sstever@eecs.umich.edu     */
1093101Sstever@eecs.umich.edu    Linux::DebugPrintkEvent *debugPrintkEvent;
1103101Sstever@eecs.umich.edu
1113102Sstever@eecs.umich.edu    /**
1123101Sstever@eecs.umich.edu     * Skip calculate_delay_loop() rather than waiting for this to be
1133102Sstever@eecs.umich.edu     * calculated
1143101Sstever@eecs.umich.edu     */
1153101Sstever@eecs.umich.edu    SkipDelayLoopEvent *skipDelayLoopEvent;
1163101Sstever@eecs.umich.edu
1173102Sstever@eecs.umich.edu    /**
1183102Sstever@eecs.umich.edu     * Event to print information about thread switches if the trace flag
1193101Sstever@eecs.umich.edu     * Thread is set
1203101Sstever@eecs.umich.edu     */
1213101Sstever@eecs.umich.edu    PrintThreadInfo *printThreadEvent;
1223101Sstever@eecs.umich.edu
1233101Sstever@eecs.umich.edu    /** Grab the PCBB of the idle process when it starts */
1243101Sstever@eecs.umich.edu    IdleStartEvent *idleStartEvent;
1253101Sstever@eecs.umich.edu
1263101Sstever@eecs.umich.edu  public:
1273101Sstever@eecs.umich.edu    typedef LinuxAlphaSystemParams Params;
1283101Sstever@eecs.umich.edu    LinuxAlphaSystem(Params *p);
1293101Sstever@eecs.umich.edu    ~LinuxAlphaSystem();
1303101Sstever@eecs.umich.edu
1313101Sstever@eecs.umich.edu    void setDelayLoop(ThreadContext *tc);
1323102Sstever@eecs.umich.edu};
1333101Sstever@eecs.umich.edu
1343101Sstever@eecs.umich.edu#endif // __ARCH_ALPHA_LINUX_SYSTEM_HH__
1353101Sstever@eecs.umich.edu