unimp.isa revision 8738:66bf413b0d5b
13537Sgblack@eecs.umich.edu// -*- mode:c++ -*- 23537Sgblack@eecs.umich.edu 33537Sgblack@eecs.umich.edu// Copyright (c) 2007 MIPS Technologies, Inc. 43537Sgblack@eecs.umich.edu// All rights reserved. 53537Sgblack@eecs.umich.edu// 63537Sgblack@eecs.umich.edu// Redistribution and use in source and binary forms, with or without 73537Sgblack@eecs.umich.edu// modification, are permitted provided that the following conditions are 83537Sgblack@eecs.umich.edu// met: redistributions of source code must retain the above copyright 93537Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer; 103537Sgblack@eecs.umich.edu// redistributions in binary form must reproduce the above copyright 113537Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer in the 123537Sgblack@eecs.umich.edu// documentation and/or other materials provided with the distribution; 133537Sgblack@eecs.umich.edu// neither the name of the copyright holders nor the names of its 143537Sgblack@eecs.umich.edu// contributors may be used to endorse or promote products derived from 153537Sgblack@eecs.umich.edu// this software without specific prior written permission. 163537Sgblack@eecs.umich.edu// 173537Sgblack@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 183537Sgblack@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 193537Sgblack@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 203537Sgblack@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 213537Sgblack@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 223537Sgblack@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 233537Sgblack@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 243537Sgblack@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 253537Sgblack@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 263537Sgblack@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 274103Ssaidi@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 284103Ssaidi@eecs.umich.edu// 294103Ssaidi@eecs.umich.edu// Authors: Korey Sewell 303537Sgblack@eecs.umich.edu 313537Sgblack@eecs.umich.edu//////////////////////////////////////////////////////////////////// 323537Sgblack@eecs.umich.edu// 333537Sgblack@eecs.umich.edu// Unimplemented instructions 343537Sgblack@eecs.umich.edu// 353537Sgblack@eecs.umich.edu 364103Ssaidi@eecs.umich.eduoutput header {{ 376335Sgblack@eecs.umich.edu /** 383827Shsul@eecs.umich.edu * Static instruction class for unimplemented instructions that 398232Snate@binkert.org * cause simulator termination. Note that these are recognized 405647Sgblack@eecs.umich.edu * (legal) instructions that the simulator does not support; the 415647Sgblack@eecs.umich.edu * 'Unknown' class is used for unrecognized/illegal instructions. 423827Shsul@eecs.umich.edu * This is a leaf class. 433537Sgblack@eecs.umich.edu */ 443537Sgblack@eecs.umich.edu class FailUnimplemented : public MipsStaticInst 453894Shsul@eecs.umich.edu { 465647Sgblack@eecs.umich.edu public: 474009Ssaidi@eecs.umich.edu /// Constructor 485810Sgblack@eecs.umich.edu FailUnimplemented(const char *_mnemonic, MachInst _machInst) 495810Sgblack@eecs.umich.edu : MipsStaticInst(_mnemonic, _machInst, No_OpClass) 504009Ssaidi@eecs.umich.edu { 514103Ssaidi@eecs.umich.edu // don't call execute() (which panics) if we're on a 524103Ssaidi@eecs.umich.edu // speculative path 534009Ssaidi@eecs.umich.edu flags[IsNonSpeculative] = true; 544009Ssaidi@eecs.umich.edu } 555810Sgblack@eecs.umich.edu 565810Sgblack@eecs.umich.edu %(BasicExecDeclare)s 575810Sgblack@eecs.umich.edu 585810Sgblack@eecs.umich.edu std::string 595810Sgblack@eecs.umich.edu generateDisassembly(Addr pc, const SymbolTable *symtab) const; 605810Sgblack@eecs.umich.edu }; 615810Sgblack@eecs.umich.edu class CP0Unimplemented : public MipsStaticInst 625647Sgblack@eecs.umich.edu { 635647Sgblack@eecs.umich.edu public: 645647Sgblack@eecs.umich.edu /// Constructor 655647Sgblack@eecs.umich.edu CP0Unimplemented(const char *_mnemonic, MachInst _machInst) 665647Sgblack@eecs.umich.edu : MipsStaticInst(_mnemonic, _machInst, No_OpClass) 675647Sgblack@eecs.umich.edu { 685647Sgblack@eecs.umich.edu // don't call execute() (which panics) if we're on a 695647Sgblack@eecs.umich.edu // speculative path 705810Sgblack@eecs.umich.edu flags[IsNonSpeculative] = true; 714009Ssaidi@eecs.umich.edu } 725704Snate@binkert.org 734009Ssaidi@eecs.umich.edu %(BasicExecDeclare)s 744009Ssaidi@eecs.umich.edu 755704Snate@binkert.org std::string 765704Snate@binkert.org generateDisassembly(Addr pc, const SymbolTable *symtab) const; 774009Ssaidi@eecs.umich.edu }; 784103Ssaidi@eecs.umich.edu class CP1Unimplemented : public MipsStaticInst 794103Ssaidi@eecs.umich.edu { 804103Ssaidi@eecs.umich.edu public: 814103Ssaidi@eecs.umich.edu /// Constructor 824103Ssaidi@eecs.umich.edu CP1Unimplemented(const char *_mnemonic, MachInst _machInst) 834103Ssaidi@eecs.umich.edu : MipsStaticInst(_mnemonic, _machInst, No_OpClass) 844103Ssaidi@eecs.umich.edu { 854103Ssaidi@eecs.umich.edu // don't call execute() (which panics) if we're on a 864103Ssaidi@eecs.umich.edu // speculative path 874009Ssaidi@eecs.umich.edu flags[IsNonSpeculative] = true; 884009Ssaidi@eecs.umich.edu } 895704Snate@binkert.org 905704Snate@binkert.org %(BasicExecDeclare)s 913537Sgblack@eecs.umich.edu 924103Ssaidi@eecs.umich.edu std::string 934103Ssaidi@eecs.umich.edu generateDisassembly(Addr pc, const SymbolTable *symtab) const; 944103Ssaidi@eecs.umich.edu }; 953827Shsul@eecs.umich.edu class CP2Unimplemented : public MipsStaticInst 964103Ssaidi@eecs.umich.edu { 974103Ssaidi@eecs.umich.edu public: 984009Ssaidi@eecs.umich.edu /// Constructor 993894Shsul@eecs.umich.edu CP2Unimplemented(const char *_mnemonic, MachInst _machInst) 1005704Snate@binkert.org : MipsStaticInst(_mnemonic, _machInst, No_OpClass) 1015704Snate@binkert.org { 1024009Ssaidi@eecs.umich.edu // don't call execute() (which panics) if we're on a 1034103Ssaidi@eecs.umich.edu // speculative path 1044103Ssaidi@eecs.umich.edu flags[IsNonSpeculative] = true; 1054103Ssaidi@eecs.umich.edu } 1063537Sgblack@eecs.umich.edu 1074103Ssaidi@eecs.umich.edu %(BasicExecDeclare)s 1084103Ssaidi@eecs.umich.edu 1094103Ssaidi@eecs.umich.edu std::string 1104009Ssaidi@eecs.umich.edu generateDisassembly(Addr pc, const SymbolTable *symtab) const; 1113827Shsul@eecs.umich.edu }; 1125704Snate@binkert.org 1135704Snate@binkert.org /** 1144009Ssaidi@eecs.umich.edu * Base class for unimplemented instructions that cause a warning 1154103Ssaidi@eecs.umich.edu * to be printed (but do not terminate simulation). This 1164103Ssaidi@eecs.umich.edu * implementation is a little screwy in that it will print a 1174103Ssaidi@eecs.umich.edu * warning for each instance of a particular unimplemented machine 1184103Ssaidi@eecs.umich.edu * instruction, not just for each unimplemented opcode. Should 1194009Ssaidi@eecs.umich.edu * probably make the 'warned' flag a static member of the derived 1203537Sgblack@eecs.umich.edu * class. 1215704Snate@binkert.org */ 1225704Snate@binkert.org class WarnUnimplemented : public MipsStaticInst 1234009Ssaidi@eecs.umich.edu { 1244103Ssaidi@eecs.umich.edu private: 1254009Ssaidi@eecs.umich.edu /// Have we warned on this instruction yet? 1263537Sgblack@eecs.umich.edu mutable bool warned; 1275704Snate@binkert.org 1285704Snate@binkert.org public: 1294009Ssaidi@eecs.umich.edu /// Constructor 1308829Sgblack@eecs.umich.edu WarnUnimplemented(const char *_mnemonic, MachInst _machInst) 1318829Sgblack@eecs.umich.edu : MipsStaticInst(_mnemonic, _machInst, No_OpClass), warned(false) 1323827Shsul@eecs.umich.edu { 1334009Ssaidi@eecs.umich.edu // don't call execute() (which panics) if we're on a 1344009Ssaidi@eecs.umich.edu // speculative path 1354009Ssaidi@eecs.umich.edu flags[IsNonSpeculative] = true; 1364009Ssaidi@eecs.umich.edu } 1374009Ssaidi@eecs.umich.edu 1388829Sgblack@eecs.umich.edu %(BasicExecDeclare)s 1398829Sgblack@eecs.umich.edu 1404103Ssaidi@eecs.umich.edu std::string 1414103Ssaidi@eecs.umich.edu generateDisassembly(Addr pc, const SymbolTable *symtab) const; 14210474Sandreas.hansson@arm.com }; 1433894Shsul@eecs.umich.edu}}; 1444103Ssaidi@eecs.umich.edu 1454103Ssaidi@eecs.umich.eduoutput decoder {{ 14610474Sandreas.hansson@arm.com std::string 1474009Ssaidi@eecs.umich.edu FailUnimplemented::generateDisassembly(Addr pc, 1484103Ssaidi@eecs.umich.edu const SymbolTable *symtab) const 1494103Ssaidi@eecs.umich.edu { 1504103Ssaidi@eecs.umich.edu return csprintf("%-10s (unimplemented)", mnemonic); 1514103Ssaidi@eecs.umich.edu } 15210474Sandreas.hansson@arm.com 1534103Ssaidi@eecs.umich.edu std::string 1544103Ssaidi@eecs.umich.edu CP0Unimplemented::generateDisassembly(Addr pc, 1554103Ssaidi@eecs.umich.edu const SymbolTable *symtab) const 15610474Sandreas.hansson@arm.com { 1574103Ssaidi@eecs.umich.edu return csprintf("%-10s (unimplemented)", mnemonic); 1584103Ssaidi@eecs.umich.edu } 1594103Ssaidi@eecs.umich.edu 16010474Sandreas.hansson@arm.com std::string 1614103Ssaidi@eecs.umich.edu CP1Unimplemented::generateDisassembly(Addr pc, 1628829Sgblack@eecs.umich.edu const SymbolTable *symtab) const 1634103Ssaidi@eecs.umich.edu { 16410474Sandreas.hansson@arm.com return csprintf("%-10s (unimplemented)", mnemonic); 1654103Ssaidi@eecs.umich.edu } 1664103Ssaidi@eecs.umich.edu std::string 16710474Sandreas.hansson@arm.com CP2Unimplemented::generateDisassembly(Addr pc, 1684103Ssaidi@eecs.umich.edu const SymbolTable *symtab) const 1694103Ssaidi@eecs.umich.edu { 1705704Snate@binkert.org return csprintf("%-10s (unimplemented)", mnemonic); 17110474Sandreas.hansson@arm.com } 1724009Ssaidi@eecs.umich.edu 1734009Ssaidi@eecs.umich.edu std::string 1744103Ssaidi@eecs.umich.edu WarnUnimplemented::generateDisassembly(Addr pc, 17510474Sandreas.hansson@arm.com const SymbolTable *symtab) const 1763894Shsul@eecs.umich.edu { 1778829Sgblack@eecs.umich.edu return csprintf("%-10s (unimplemented)", mnemonic); 1784103Ssaidi@eecs.umich.edu } 1794009Ssaidi@eecs.umich.edu}}; 1804009Ssaidi@eecs.umich.edu 1813537Sgblack@eecs.umich.eduoutput exec {{ 1825704Snate@binkert.org Fault 1835704Snate@binkert.org FailUnimplemented::execute(%(CPU_exec_context)s *xc, 1847741Sgblack@eecs.umich.edu Trace::InstRecord *traceData) const 1853654Shsul@eecs.umich.edu { 1865704Snate@binkert.org panic("attempt to execute unimplemented instruction '%s' " 1875704Snate@binkert.org "(inst 0x%08x, opcode 0x%x, binary:%s)", mnemonic, machInst, OPCODE, 1884103Ssaidi@eecs.umich.edu inst2string(machInst)); 1894103Ssaidi@eecs.umich.edu return NoFault; 1904103Ssaidi@eecs.umich.edu } 1914103Ssaidi@eecs.umich.edu 1924103Ssaidi@eecs.umich.edu Fault 1935704Snate@binkert.org CP0Unimplemented::execute(%(CPU_exec_context)s *xc, 1945704Snate@binkert.org Trace::InstRecord *traceData) const 1954009Ssaidi@eecs.umich.edu { 1964103Ssaidi@eecs.umich.edu if (FullSystem) { 1974103Ssaidi@eecs.umich.edu if (!isCoprocessorEnabled(xc, 0)) 1984009Ssaidi@eecs.umich.edu return new CoprocessorUnusableFault(0); 1993537Sgblack@eecs.umich.edu else 2005704Snate@binkert.org return new ReservedInstructionFault; 2015704Snate@binkert.org } else { 2024009Ssaidi@eecs.umich.edu panic("attempt to execute unimplemented instruction '%s' " 2034103Ssaidi@eecs.umich.edu "(inst %#08x, opcode %#x, binary:%s)", 2044103Ssaidi@eecs.umich.edu mnemonic, machInst, OPCODE, inst2string(machInst)); 2054009Ssaidi@eecs.umich.edu return NoFault; 2064009Ssaidi@eecs.umich.edu } 2074009Ssaidi@eecs.umich.edu } 2083537Sgblack@eecs.umich.edu 2093537Sgblack@eecs.umich.edu Fault 210 CP1Unimplemented::execute(%(CPU_exec_context)s *xc, 211 Trace::InstRecord *traceData) const 212 { 213 if (FullSystem) { 214 if (!isCoprocessorEnabled(xc, 1)) 215 return new CoprocessorUnusableFault(1); 216 else 217 return new ReservedInstructionFault; 218 } else { 219 panic("attempt to execute unimplemented instruction '%s' " 220 "(inst %#08x, opcode %#x, binary:%s)", 221 mnemonic, machInst, OPCODE, inst2string(machInst)); 222 return NoFault; 223 } 224 } 225 226 Fault 227 CP2Unimplemented::execute(%(CPU_exec_context)s *xc, 228 Trace::InstRecord *traceData) const 229 { 230 if (FullSystem) { 231 if (!isCoprocessorEnabled(xc, 2)) 232 return new CoprocessorUnusableFault(2); 233 else 234 return new ReservedInstructionFault; 235 } else { 236 panic("attempt to execute unimplemented instruction '%s' " 237 "(inst %#08x, opcode %#x, binary:%s)", 238 mnemonic, machInst, OPCODE, inst2string(machInst)); 239 return NoFault; 240 } 241 } 242 243 Fault 244 WarnUnimplemented::execute(%(CPU_exec_context)s *xc, 245 Trace::InstRecord *traceData) const 246 { 247 if (!warned) { 248 warn("\tinstruction '%s' unimplemented\n", mnemonic); 249 warned = true; 250 } 251 252 return NoFault; 253 } 254}}; 255 256 257def format FailUnimpl() {{ 258 iop = InstObjParams(name, 'FailUnimplemented') 259 decode_block = BasicDecodeWithMnemonic.subst(iop) 260 261}}; 262def format CP0Unimpl() {{ 263 iop = InstObjParams(name, 'CP0Unimplemented') 264 decode_block = BasicDecodeWithMnemonic.subst(iop) 265}}; 266def format CP1Unimpl() {{ 267 iop = InstObjParams(name, 'CP1Unimplemented') 268 decode_block = BasicDecodeWithMnemonic.subst(iop) 269}}; 270def format CP2Unimpl() {{ 271 iop = InstObjParams(name, 'CP2Unimplemented') 272 decode_block = BasicDecodeWithMnemonic.subst(iop) 273}}; 274def format WarnUnimpl() {{ 275 iop = InstObjParams(name, 'WarnUnimplemented') 276 decode_block = BasicDecodeWithMnemonic.subst(iop) 277}}; 278 279