utility.hh revision 4172
12381SN/A/*
28853Sandreas.hansson@arm.com * Copyright (c) 2003-2005 The Regents of The University of Michigan
38711Sandreas.hansson@arm.com * All rights reserved.
48711Sandreas.hansson@arm.com *
58711Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without
68711Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are
78711Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright
88711Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer;
98711Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright
108711Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the
118711Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution;
128711Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its
138711Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from
142381SN/A * this software without specific prior written permission.
152381SN/A *
162381SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172381SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182381SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192381SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202381SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212381SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222381SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232381SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242381SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252381SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262381SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272381SN/A *
282381SN/A * Authors: Nathan Binkert
292381SN/A *          Steve Reinhardt
302381SN/A */
312381SN/A
322381SN/A#ifndef __ARCH_ALPHA_UTILITY_HH__
332381SN/A#define __ARCH_ALPHA_UTILITY_HH__
342381SN/A
352381SN/A#include "config/full_system.hh"
362381SN/A#include "arch/alpha/types.hh"
372381SN/A#include "arch/alpha/isa_traits.hh"
382381SN/A#include "arch/alpha/regfile.hh"
392665Ssaidi@eecs.umich.edu#include "base/misc.hh"
402665Ssaidi@eecs.umich.edu#include "cpu/thread_context.hh"
418853Sandreas.hansson@arm.com
428922Swilliam.wang@arm.comnamespace AlphaISA
432381SN/A{
442381SN/A
452381SN/A    static inline bool
462381SN/A    inUserMode(ThreadContext *tc)
478922Swilliam.wang@arm.com    {
482381SN/A        return (tc->readMiscRegNoEffect(AlphaISA::IPR_DTB_CM) & 0x18) != 0;
492381SN/A    }
502381SN/A
512381SN/A    static inline ExtMachInst
522381SN/A    makeExtMI(MachInst inst, Addr pc) {
532381SN/A#if FULL_SYSTEM
542381SN/A        ExtMachInst ext_inst = inst;
559235Sandreas.hansson@arm.com        if (pc && 0x1)
562381SN/A            return ext_inst|=(static_cast<ExtMachInst>(pc & 0x1) << 32);
572381SN/A        else
588922Swilliam.wang@arm.com            return ext_inst;
598922Swilliam.wang@arm.com#else
602407SN/A        return ExtMachInst(inst);
612407SN/A#endif
622407SN/A    }
632407SN/A
642407SN/A    inline bool isCallerSaveIntegerRegister(unsigned int reg) {
659235Sandreas.hansson@arm.com        panic("register classification not implemented");
669235Sandreas.hansson@arm.com        return (reg >= 1 && reg <= 8 || reg >= 22 && reg <= 25 || reg == 27);
679235Sandreas.hansson@arm.com    }
682407SN/A
693401Sktlim@umich.edu    inline bool isCalleeSaveIntegerRegister(unsigned int reg) {
703401Sktlim@umich.edu        panic("register classification not implemented");
712381SN/A        return (reg >= 9 && reg <= 15);
728922Swilliam.wang@arm.com    }
738922Swilliam.wang@arm.com
749087Sandreas.hansson@arm.com    inline bool isCallerSaveFloatRegister(unsigned int reg) {
752381SN/A        panic("register classification not implemented");
768708Sandreas.hansson@arm.com        return false;
772381SN/A    }
788922Swilliam.wang@arm.com
798922Swilliam.wang@arm.com    inline bool isCalleeSaveFloatRegister(unsigned int reg) {
808922Swilliam.wang@arm.com        panic("register classification not implemented");
818922Swilliam.wang@arm.com        return false;
828922Swilliam.wang@arm.com    }
838922Swilliam.wang@arm.com
845476Snate@binkert.org    inline Addr alignAddress(const Addr &addr,
852640Sstever@eecs.umich.edu                                         unsigned int nbytes) {
868965Sandreas.hansson@arm.com        return (addr & ~(nbytes - 1));
878965Sandreas.hansson@arm.com    }
889031Sandreas.hansson@arm.com
898965Sandreas.hansson@arm.com    // Instruction address compression hooks
909031Sandreas.hansson@arm.com    inline Addr realPCToFetchPC(const Addr &addr) {
918965Sandreas.hansson@arm.com        return addr;
928922Swilliam.wang@arm.com    }
938922Swilliam.wang@arm.com
948922Swilliam.wang@arm.com    inline Addr fetchPCToRealPC(const Addr &addr) {
958922Swilliam.wang@arm.com        return addr;
968922Swilliam.wang@arm.com    }
978922Swilliam.wang@arm.com
988922Swilliam.wang@arm.com    // the size of "fetched" instructions (not necessarily the size
998922Swilliam.wang@arm.com    // of real instructions for PISA)
1008965Sandreas.hansson@arm.com    inline size_t fetchInstSize() {
1018922Swilliam.wang@arm.com        return sizeof(MachInst);
1029031Sandreas.hansson@arm.com    }
1038922Swilliam.wang@arm.com
1048922Swilliam.wang@arm.com    inline MachInst makeRegisterCopy(int dest, int src) {
1058922Swilliam.wang@arm.com        panic("makeRegisterCopy not implemented");
1068922Swilliam.wang@arm.com        return 0;
1078922Swilliam.wang@arm.com    }
1083401Sktlim@umich.edu
1092381SN/A    // Machine operations
1102640Sstever@eecs.umich.edu
1112640Sstever@eecs.umich.edu    void saveMachineReg(AnyReg &savereg, const RegFile &reg_file,
1128922Swilliam.wang@arm.com                               int regnum);
1134190Ssaidi@eecs.umich.edu
1148965Sandreas.hansson@arm.com    void restoreMachineReg(RegFile &regs, const AnyReg &reg,
1159031Sandreas.hansson@arm.com                                  int regnum);
1168965Sandreas.hansson@arm.com
1178922Swilliam.wang@arm.com    /**
1188922Swilliam.wang@arm.com     * Function to insure ISA semantics about 0 registers.
1198922Swilliam.wang@arm.com     * @param tc The thread context.
1209294Sandreas.hansson@arm.com     */
1219294Sandreas.hansson@arm.com    template <class TC>
1229294Sandreas.hansson@arm.com    void zeroRegisters(TC *tc);
1239294Sandreas.hansson@arm.com
1249294Sandreas.hansson@arm.com    // Alpha IPR register accessors
1259294Sandreas.hansson@arm.com    inline bool PcPAL(Addr addr) { return addr & 0x3; }
1269294Sandreas.hansson@arm.com#if FULL_SYSTEM
1279294Sandreas.hansson@arm.com
1289294Sandreas.hansson@arm.com    ////////////////////////////////////////////////////////////////////////
1299294Sandreas.hansson@arm.com    //
1309294Sandreas.hansson@arm.com    //  Translation stuff
1319294Sandreas.hansson@arm.com    //
1329294Sandreas.hansson@arm.com
1339294Sandreas.hansson@arm.com    inline Addr PteAddr(Addr a) { return (a & PteMask) << PteShift; }
1349294Sandreas.hansson@arm.com
1359294Sandreas.hansson@arm.com    // User Virtual
1369294Sandreas.hansson@arm.com    inline bool IsUSeg(Addr a) { return USegBase <= a && a <= USegEnd; }
1379294Sandreas.hansson@arm.com
1389294Sandreas.hansson@arm.com    // Kernel Direct Mapped
1399294Sandreas.hansson@arm.com    inline bool IsK0Seg(Addr a) { return K0SegBase <= a && a <= K0SegEnd; }
1409294Sandreas.hansson@arm.com    inline Addr K0Seg2Phys(Addr addr) { return addr & ~K0SegBase; }
1419294Sandreas.hansson@arm.com
1429294Sandreas.hansson@arm.com    // Kernel Virtual
1439294Sandreas.hansson@arm.com    inline bool IsK1Seg(Addr a) { return K1SegBase <= a && a <= K1SegEnd; }
1449294Sandreas.hansson@arm.com
1459294Sandreas.hansson@arm.com    inline Addr
1469294Sandreas.hansson@arm.com    TruncPage(Addr addr)
1479294Sandreas.hansson@arm.com    { return addr & ~(PageBytes - 1); }
1489294Sandreas.hansson@arm.com
1499294Sandreas.hansson@arm.com    inline Addr
1509294Sandreas.hansson@arm.com    RoundPage(Addr addr)
1519294Sandreas.hansson@arm.com    { return (addr + PageBytes - 1) & ~(PageBytes - 1); }
1529294Sandreas.hansson@arm.com
1539294Sandreas.hansson@arm.com    void initCPU(ThreadContext *tc, int cpuId);
1549294Sandreas.hansson@arm.com    void initIPRs(ThreadContext *tc, int cpuId);
1559294Sandreas.hansson@arm.com
1569294Sandreas.hansson@arm.com    /**
1579294Sandreas.hansson@arm.com     * Function to check for and process any interrupts.
1589294Sandreas.hansson@arm.com     * @param tc The thread context.
1599294Sandreas.hansson@arm.com     */
1609294Sandreas.hansson@arm.com    template <class TC>
1619294Sandreas.hansson@arm.com    void processInterrupts(TC *tc);
1629294Sandreas.hansson@arm.com#endif
1639294Sandreas.hansson@arm.com
1649294Sandreas.hansson@arm.com} // namespace AlphaISA
1659294Sandreas.hansson@arm.com
1669294Sandreas.hansson@arm.com#endif
1679294Sandreas.hansson@arm.com