112291Sgabeblack@google.com/* 212291Sgabeblack@google.com * Copyright (c) 2003-2005 The Regents of The University of Michigan 312291Sgabeblack@google.com * All rights reserved. 412291Sgabeblack@google.com * 512291Sgabeblack@google.com * Redistribution and use in source and binary forms, with or without 612291Sgabeblack@google.com * modification, are permitted provided that the following conditions are 712291Sgabeblack@google.com * met: redistributions of source code must retain the above copyright 812291Sgabeblack@google.com * notice, this list of conditions and the following disclaimer; 912291Sgabeblack@google.com * redistributions in binary form must reproduce the above copyright 1012291Sgabeblack@google.com * notice, this list of conditions and the following disclaimer in the 1112291Sgabeblack@google.com * documentation and/or other materials provided with the distribution; 1212291Sgabeblack@google.com * neither the name of the copyright holders nor the names of its 1312291Sgabeblack@google.com * contributors may be used to endorse or promote products derived from 1412291Sgabeblack@google.com * this software without specific prior written permission. 1512291Sgabeblack@google.com * 1612291Sgabeblack@google.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1712291Sgabeblack@google.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1812291Sgabeblack@google.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1912291Sgabeblack@google.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2012291Sgabeblack@google.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2112291Sgabeblack@google.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2212291Sgabeblack@google.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2312291Sgabeblack@google.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2412291Sgabeblack@google.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2512291Sgabeblack@google.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2612291Sgabeblack@google.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2712291Sgabeblack@google.com * 2812291Sgabeblack@google.com * Authors: Steve Reinhardt 2912291Sgabeblack@google.com */ 3012291Sgabeblack@google.com 3112291Sgabeblack@google.com#ifndef __ARCH_SPARC_INSTS_UNIMP_HH__ 3212291Sgabeblack@google.com#define __ARCH_SPARC_INSTS_UNIMP_HH__ 3312291Sgabeblack@google.com 3412292Sgabeblack@google.com#include <memory> 3512292Sgabeblack@google.com 3612292Sgabeblack@google.com#include "arch/generic/debugfaults.hh" 3712291Sgabeblack@google.com#include "arch/sparc/insts/static_inst.hh" 3812291Sgabeblack@google.com#include "base/cprintf.hh" 3912291Sgabeblack@google.com 4012291Sgabeblack@google.comnamespace SparcISA 4112291Sgabeblack@google.com{ 4212291Sgabeblack@google.com 4312291Sgabeblack@google.com//////////////////////////////////////////////////////////////////// 4412291Sgabeblack@google.com// 4512291Sgabeblack@google.com// Unimplemented instructions 4612291Sgabeblack@google.com// 4712291Sgabeblack@google.com 4812291Sgabeblack@google.com/** 4912291Sgabeblack@google.com * Static instruction class for unimplemented instructions that 5012291Sgabeblack@google.com * cause simulator termination. Note that these are recognized 5112291Sgabeblack@google.com * (legal) instructions that the simulator does not support; the 5212291Sgabeblack@google.com * 'Unknown' class is used for unrecognized/illegal instructions. 5312291Sgabeblack@google.com * This is a leaf class. 5412291Sgabeblack@google.com */ 5512291Sgabeblack@google.comclass FailUnimplemented : public SparcStaticInst 5612291Sgabeblack@google.com{ 5712291Sgabeblack@google.com public: 5812291Sgabeblack@google.com /// Constructor 5912291Sgabeblack@google.com FailUnimplemented(const char *_mnemonic, ExtMachInst _machInst) : 6012291Sgabeblack@google.com SparcStaticInst(_mnemonic, _machInst, No_OpClass) 6112292Sgabeblack@google.com {} 6212291Sgabeblack@google.com 6312291Sgabeblack@google.com Fault 6412291Sgabeblack@google.com execute(ExecContext *xc, Trace::InstRecord *traceData) const override 6512291Sgabeblack@google.com { 6612292Sgabeblack@google.com return std::make_shared<GenericISA::M5PanicFault>( 6712292Sgabeblack@google.com "attempt to execute unimplemented instruction '%s' (inst %#08x)", 6812292Sgabeblack@google.com mnemonic, machInst); 6912291Sgabeblack@google.com } 7012291Sgabeblack@google.com 7112291Sgabeblack@google.com std::string 7212291Sgabeblack@google.com generateDisassembly(Addr pc, const SymbolTable *symtab) const override 7312291Sgabeblack@google.com { 7412291Sgabeblack@google.com return csprintf("%-10s (unimplemented)", mnemonic); 7512291Sgabeblack@google.com } 7612291Sgabeblack@google.com}; 7712291Sgabeblack@google.com 7812291Sgabeblack@google.com/** 7912291Sgabeblack@google.com * Base class for unimplemented instructions that cause a warning 8012291Sgabeblack@google.com * to be printed (but do not terminate simulation). This 8112291Sgabeblack@google.com * implementation is a little screwy in that it will print a 8212291Sgabeblack@google.com * warning for each instance of a particular unimplemented machine 8312291Sgabeblack@google.com * instruction, not just for each unimplemented opcode. Should 8412291Sgabeblack@google.com * probably make the 'warned' flag a static member of the derived 8512291Sgabeblack@google.com * class. 8612291Sgabeblack@google.com */ 8712291Sgabeblack@google.comclass WarnUnimplemented : public SparcStaticInst 8812291Sgabeblack@google.com{ 8912291Sgabeblack@google.com private: 9012291Sgabeblack@google.com /// Have we warned on this instruction yet? 9112291Sgabeblack@google.com mutable bool warned; 9212291Sgabeblack@google.com 9312291Sgabeblack@google.com public: 9412291Sgabeblack@google.com /// Constructor 9512291Sgabeblack@google.com WarnUnimplemented(const char *_mnemonic, ExtMachInst _machInst) : 9612291Sgabeblack@google.com SparcStaticInst(_mnemonic, _machInst, No_OpClass), warned(false) 9712292Sgabeblack@google.com {} 9812291Sgabeblack@google.com 9912291Sgabeblack@google.com Fault 10012291Sgabeblack@google.com execute(ExecContext *xc, Trace::InstRecord *traceData) const override 10112291Sgabeblack@google.com { 10212291Sgabeblack@google.com if (!warned) { 10312292Sgabeblack@google.com return std::make_shared<GenericISA::M5WarnFault>( 10412292Sgabeblack@google.com "instruction '%s' unimplemented\n", mnemonic); 10512291Sgabeblack@google.com warned = true; 10612291Sgabeblack@google.com } 10712291Sgabeblack@google.com return NoFault; 10812291Sgabeblack@google.com } 10912291Sgabeblack@google.com 11012291Sgabeblack@google.com std::string 11112291Sgabeblack@google.com generateDisassembly(Addr pc, const SymbolTable *symtab) const override 11212291Sgabeblack@google.com { 11312291Sgabeblack@google.com return csprintf("%-10s (unimplemented)", mnemonic); 11412291Sgabeblack@google.com } 11512291Sgabeblack@google.com}; 11612291Sgabeblack@google.com 11712291Sgabeblack@google.com} 11812291Sgabeblack@google.com 11912291Sgabeblack@google.com#endif // __ARCH_SPARC_INSTS_UNIMP_HH__ 120