isa_traits.hh revision 2460
12914Ssaidi@eecs.umich.edu/*
22914Ssaidi@eecs.umich.edu * Copyright (c) 2003-2005 The Regents of The University of Michigan
32914Ssaidi@eecs.umich.edu * All rights reserved.
42914Ssaidi@eecs.umich.edu *
52914Ssaidi@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
62914Ssaidi@eecs.umich.edu * modification, are permitted provided that the following conditions are
72914Ssaidi@eecs.umich.edu * met: redistributions of source code must retain the above copyright
82914Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
92914Ssaidi@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
102914Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
112914Ssaidi@eecs.umich.edu * documentation and/or other materials provided with the distribution;
122914Ssaidi@eecs.umich.edu * neither the name of the copyright holders nor the names of its
132914Ssaidi@eecs.umich.edu * contributors may be used to endorse or promote products derived from
142914Ssaidi@eecs.umich.edu * this software without specific prior written permission.
152914Ssaidi@eecs.umich.edu *
162914Ssaidi@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172914Ssaidi@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182914Ssaidi@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192914Ssaidi@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202914Ssaidi@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212914Ssaidi@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222914Ssaidi@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232914Ssaidi@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242914Ssaidi@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252914Ssaidi@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262914Ssaidi@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272914Ssaidi@eecs.umich.edu */
282914Ssaidi@eecs.umich.edu
292914Ssaidi@eecs.umich.edu#ifndef __ARCH_ALPHA_ISA_TRAITS_HH__
302914Ssaidi@eecs.umich.edu#define __ARCH_ALPHA_ISA_TRAITS_HH__
313091Sstever@eecs.umich.edu
323091Sstever@eecs.umich.edunamespace LittleEndianGuest {}
333091Sstever@eecs.umich.edu
342914Ssaidi@eecs.umich.edu#include "arch/alpha/types.hh"
352914Ssaidi@eecs.umich.edu#include "arch/alpha/constants.hh"
363091Sstever@eecs.umich.edu#include "arch/alpha/regfile.hh"
373091Sstever@eecs.umich.edu#include "config/full_system.hh"
382914Ssaidi@eecs.umich.edu#include "sim/host.hh"
392914Ssaidi@eecs.umich.edu
402914Ssaidi@eecs.umich.educlass StaticInstPtr;
412914Ssaidi@eecs.umich.edu
422914Ssaidi@eecs.umich.edu#if !FULL_SYSTEM
432914Ssaidi@eecs.umich.educlass SyscallReturn {
442914Ssaidi@eecs.umich.edu        public:
453091Sstever@eecs.umich.edu           template <class T>
463091Sstever@eecs.umich.edu           SyscallReturn(T v, bool s)
473091Sstever@eecs.umich.edu           {
483091Sstever@eecs.umich.edu               retval = (uint64_t)v;
493091Sstever@eecs.umich.edu               success = s;
503091Sstever@eecs.umich.edu           }
513091Sstever@eecs.umich.edu
523091Sstever@eecs.umich.edu           template <class T>
533091Sstever@eecs.umich.edu           SyscallReturn(T v)
543091Sstever@eecs.umich.edu           {
553091Sstever@eecs.umich.edu               success = (v >= 0);
563091Sstever@eecs.umich.edu               retval = (uint64_t)v;
573091Sstever@eecs.umich.edu           }
582914Ssaidi@eecs.umich.edu
592914Ssaidi@eecs.umich.edu           ~SyscallReturn() {}
602914Ssaidi@eecs.umich.edu
614490Sstever@eecs.umich.edu           SyscallReturn& operator=(const SyscallReturn& s) {
624490Sstever@eecs.umich.edu               retval = s.retval;
634490Sstever@eecs.umich.edu               success = s.success;
644490Sstever@eecs.umich.edu               return *this;
654490Sstever@eecs.umich.edu           }
664490Sstever@eecs.umich.edu
674490Sstever@eecs.umich.edu           bool successful() { return success; }
684490Sstever@eecs.umich.edu           uint64_t value() { return retval; }
694490Sstever@eecs.umich.edu
704490Sstever@eecs.umich.edu
714490Sstever@eecs.umich.edu       private:
724490Sstever@eecs.umich.edu           uint64_t retval;
734490Sstever@eecs.umich.edu           bool success;
743090Sstever@eecs.umich.edu};
753090Sstever@eecs.umich.edu
764490Sstever@eecs.umich.edu#endif
774490Sstever@eecs.umich.edu
784490Sstever@eecs.umich.edunamespace AlphaISA
794490Sstever@eecs.umich.edu{
804490Sstever@eecs.umich.edu
813091Sstever@eecs.umich.eduusing namespace LittleEndianGuest;
822914Ssaidi@eecs.umich.edu
833090Sstever@eecs.umich.edu// redirected register map, really only used for the full system case.
843403Ssaidi@eecs.umich.eduextern const int reg_redir[NumIntRegs];
853403Ssaidi@eecs.umich.edu
863403Ssaidi@eecs.umich.edu#if FULL_SYSTEM
873403Ssaidi@eecs.umich.edu
884490Sstever@eecs.umich.edu#include "arch/alpha/isa_fullsys_traits.hh"
894490Sstever@eecs.umich.edu
902914Ssaidi@eecs.umich.edu#endif
914490Sstever@eecs.umich.edu
922914Ssaidi@eecs.umich.edu    StaticInstPtr decodeInst(ExtMachInst);
932914Ssaidi@eecs.umich.edu
942914Ssaidi@eecs.umich.edu#if !FULL_SYSTEM
952914Ssaidi@eecs.umich.edu    static inline void setSyscallReturn(SyscallReturn return_value, RegFile *regs)
962914Ssaidi@eecs.umich.edu    {
974490Sstever@eecs.umich.edu        // check for error condition.  Alpha syscall convention is to
984490Sstever@eecs.umich.edu        // indicate success/failure in reg a3 (r19) and put the
994490Sstever@eecs.umich.edu        // return value itself in the standard return value reg (v0).
1004490Sstever@eecs.umich.edu        if (return_value.successful()) {
1013403Ssaidi@eecs.umich.edu            // no error
1023403Ssaidi@eecs.umich.edu            regs->intRegFile[SyscallSuccessReg] = 0;
1033403Ssaidi@eecs.umich.edu            regs->intRegFile[ReturnValueReg] = return_value.value();
1043403Ssaidi@eecs.umich.edu        } else {
1053403Ssaidi@eecs.umich.edu            // got an error, return details
1062914Ssaidi@eecs.umich.edu            regs->intRegFile[SyscallSuccessReg] = (IntReg) -1;
1072914Ssaidi@eecs.umich.edu            regs->intRegFile[ReturnValueReg] = -return_value.value();
1082914Ssaidi@eecs.umich.edu        }
1092914Ssaidi@eecs.umich.edu    }
1102914Ssaidi@eecs.umich.edu#endif
1113091Sstever@eecs.umich.edu};
1123349Sbinkertn@umich.edu
1133091Sstever@eecs.umich.edu#endif // __ARCH_ALPHA_ISA_TRAITS_HH__
1143091Sstever@eecs.umich.edu