misc64.isa revision 11576
12810SN/A// -*- mode:c++ -*- 212724Snikos.nikoleris@arm.com 38856Sandreas.hansson@arm.com// Copyright (c) 2011-2013, 2016 ARM Limited 48856Sandreas.hansson@arm.com// All rights reserved 58856Sandreas.hansson@arm.com// 68856Sandreas.hansson@arm.com// The license below extends only to copyright in the software and shall 78856Sandreas.hansson@arm.com// not be construed as granting a license to any other intellectual 88856Sandreas.hansson@arm.com// property including but not limited to intellectual property relating 98856Sandreas.hansson@arm.com// to a hardware implementation of the functionality of the software 108856Sandreas.hansson@arm.com// licensed hereunder. You may use the software subject to the license 118856Sandreas.hansson@arm.com// terms below provided that you ensure that this notice is replicated 128856Sandreas.hansson@arm.com// unmodified and in its entirety in all distributions of the software, 138856Sandreas.hansson@arm.com// modified or unmodified, in source code or in binary form. 142810SN/A// 152810SN/A// Redistribution and use in source and binary forms, with or without 162810SN/A// modification, are permitted provided that the following conditions are 172810SN/A// met: redistributions of source code must retain the above copyright 182810SN/A// notice, this list of conditions and the following disclaimer; 192810SN/A// redistributions in binary form must reproduce the above copyright 202810SN/A// notice, this list of conditions and the following disclaimer in the 212810SN/A// documentation and/or other materials provided with the distribution; 222810SN/A// neither the name of the copyright holders nor the names of its 232810SN/A// contributors may be used to endorse or promote products derived from 242810SN/A// this software without specific prior written permission. 252810SN/A// 262810SN/A// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 272810SN/A// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 282810SN/A// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 292810SN/A// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 302810SN/A// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 312810SN/A// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 322810SN/A// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 332810SN/A// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 342810SN/A// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 352810SN/A// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 362810SN/A// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 372810SN/A// 382810SN/A// Authors: Gabe Black 392810SN/A 402810SN/Alet {{ 4112724Snikos.nikoleris@arm.com svcCode = ''' 422810SN/A fault = std::make_shared<SupervisorCall>(machInst, bits(machInst, 20, 5)); 432810SN/A ''' 442810SN/A 452810SN/A svcIop = InstObjParams("svc", "Svc64", "ArmStaticInst", 462810SN/A svcCode, ["IsSyscall", "IsNonSpeculative", 472810SN/A "IsSerializeAfter"]) 482810SN/A header_output = BasicDeclare.subst(svcIop) 4911486Snikos.nikoleris@arm.com decoder_output = BasicConstructor64.subst(svcIop) 5011486Snikos.nikoleris@arm.com exec_output = BasicExecute.subst(svcIop) 5112724Snikos.nikoleris@arm.com 5212724Snikos.nikoleris@arm.com hvcCode = ''' 538232Snate@binkert.org SCR scr = Scr64; 5412724Snikos.nikoleris@arm.com 5513222Sodanrc@yahoo.com.br if (!ArmSystem::haveVirtualization(xc->tcBase()) || 5612724Snikos.nikoleris@arm.com (ArmSystem::haveSecurity(xc->tcBase()) && !scr.hce)) { 5711486Snikos.nikoleris@arm.com fault = disabledFault(); 5812724Snikos.nikoleris@arm.com } else { 5912724Snikos.nikoleris@arm.com fault = std::make_shared<HypervisorCall>(machInst, bits(machInst, 20, 5)); 6012724Snikos.nikoleris@arm.com } 6113352Snikos.nikoleris@arm.com ''' 6212724Snikos.nikoleris@arm.com 6312724Snikos.nikoleris@arm.com hvcIop = InstObjParams("hvc", "Hvc64", "ArmStaticInst", 6412724Snikos.nikoleris@arm.com hvcCode, ["IsSyscall", "IsNonSpeculative", 6512724Snikos.nikoleris@arm.com "IsSerializeAfter"]) 662810SN/A header_output += BasicDeclare.subst(hvcIop) 672810SN/A decoder_output += BasicConstructor64.subst(hvcIop) 682810SN/A exec_output += BasicExecute.subst(hvcIop) 698856Sandreas.hansson@arm.com 708856Sandreas.hansson@arm.com # @todo: extend to take into account Virtualization. 718856Sandreas.hansson@arm.com smcCode = ''' 7213564Snikos.nikoleris@arm.com SCR scr = Scr64; 7313564Snikos.nikoleris@arm.com CPSR cpsr = Cpsr; 7412084Sspwilson2@wisc.edu 7512084Sspwilson2@wisc.edu if (!ArmSystem::haveSecurity(xc->tcBase()) || inUserMode(cpsr) || scr.smd) { 768856Sandreas.hansson@arm.com fault = disabledFault(); 778856Sandreas.hansson@arm.com } else { 784475SN/A fault = std::make_shared<SecureMonitorCall>(machInst); 7911053Sandreas.hansson@arm.com } 805034SN/A ''' 8112724Snikos.nikoleris@arm.com 8212724Snikos.nikoleris@arm.com smcIop = InstObjParams("smc", "Smc64", "ArmStaticInst", 8311377Sandreas.hansson@arm.com smcCode, ["IsNonSpeculative", "IsSerializeAfter"]) 8411377Sandreas.hansson@arm.com header_output += BasicDeclare.subst(smcIop) 8512724Snikos.nikoleris@arm.com decoder_output += BasicConstructor64.subst(smcIop) 8612724Snikos.nikoleris@arm.com exec_output += BasicExecute.subst(smcIop) 8713352Snikos.nikoleris@arm.com 8812724Snikos.nikoleris@arm.com def subst(templateBase, iop): 8912724Snikos.nikoleris@arm.com global header_output, decoder_output, exec_output 9012724Snikos.nikoleris@arm.com header_output += eval(templateBase + "Declare").subst(iop) 9112724Snikos.nikoleris@arm.com decoder_output += eval(templateBase + "Constructor").subst(iop) 9212724Snikos.nikoleris@arm.com exec_output += BasicExecute.subst(iop) 9311053Sandreas.hansson@arm.com 9411722Ssophiane.senni@gmail.com bfmMaskCode = ''' 9511722Ssophiane.senni@gmail.com uint64_t bitMask; 9611722Ssophiane.senni@gmail.com int diff = imm2 - imm1; 9711722Ssophiane.senni@gmail.com if (imm1 <= imm2) { 989263Smrinmoy.ghosh@arm.com bitMask = mask(diff + 1); 9913418Sodanrc@yahoo.com.br } else { 1005034SN/A bitMask = mask(imm2 + 1); 10111331Sandreas.hansson@arm.com bitMask = (bitMask >> imm1) | (bitMask << (intWidth - imm1)); 10212724Snikos.nikoleris@arm.com diff += intWidth; 10310884Sandreas.hansson@arm.com } 1044626SN/A uint64_t topBits M5_VAR_USED = ~mask(diff+1); 10510360Sandreas.hansson@arm.com uint64_t result = imm1 == 0 ? Op164 : 10611484Snikos.nikoleris@arm.com (Op164 >> imm1) | (Op164 << (intWidth - imm1)); 1075034SN/A result &= bitMask; 1088883SAli.Saidi@ARM.com ''' 1098833Sdam.sunwoo@arm.com 1104458SN/A bfmCode = bfmMaskCode + 'Dest64 = result | (Dest64 & ~bitMask);' 11111377Sandreas.hansson@arm.com bfmIop = InstObjParams("bfm", "Bfm64", "RegRegImmImmOp64", bfmCode); 11211377Sandreas.hansson@arm.com subst("RegRegImmImmOp64", bfmIop) 11311377Sandreas.hansson@arm.com 11411377Sandreas.hansson@arm.com ubfmCode = bfmMaskCode + 'Dest64 = result;' 11511377Sandreas.hansson@arm.com ubfmIop = InstObjParams("ubfm", "Ubfm64", "RegRegImmImmOp64", ubfmCode); 11611377Sandreas.hansson@arm.com subst("RegRegImmImmOp64", ubfmIop) 11711331Sandreas.hansson@arm.com 11811331Sandreas.hansson@arm.com sbfmCode = bfmMaskCode + \ 11912724Snikos.nikoleris@arm.com 'Dest64 = result | (bits(Op164, imm2) ? topBits : 0);' 12012843Srmk35@cl.cam.ac.uk sbfmIop = InstObjParams("sbfm", "Sbfm64", "RegRegImmImmOp64", sbfmCode); 12112724Snikos.nikoleris@arm.com subst("RegRegImmImmOp64", sbfmIop) 12213419Sodanrc@yahoo.com.br 12312724Snikos.nikoleris@arm.com extrCode = ''' 12412724Snikos.nikoleris@arm.com if (imm == 0) { 12512724Snikos.nikoleris@arm.com Dest64 = Op264; 12612724Snikos.nikoleris@arm.com } else { 12712724Snikos.nikoleris@arm.com Dest64 = (Op164 << (intWidth - imm)) | (Op264 >> imm); 12812724Snikos.nikoleris@arm.com } 12912724Snikos.nikoleris@arm.com ''' 1302810SN/A extrIop = InstObjParams("extr", "Extr64", "RegRegRegImmOp64", extrCode); 1312810SN/A subst("RegRegRegImmOp64", extrIop); 1323013SN/A 1338856Sandreas.hansson@arm.com unknownCode = ''' 1342810SN/A return std::make_shared<UndefinedInstruction>(machInst, true); 1353013SN/A ''' 13610714Sandreas.hansson@arm.com unknown64Iop = InstObjParams("unknown", "Unknown64", "UnknownOp64", 1372810SN/A unknownCode) 1389614Srene.dejong@arm.com header_output += BasicDeclare.subst(unknown64Iop) 1399614Srene.dejong@arm.com decoder_output += BasicConstructor64.subst(unknown64Iop) 1409614Srene.dejong@arm.com exec_output += BasicExecute.subst(unknown64Iop) 14110345SCurtis.Dunham@arm.com 14210714Sandreas.hansson@arm.com isbIop = InstObjParams("isb", "Isb64", "ArmStaticInst", 14310345SCurtis.Dunham@arm.com "fault = std::make_shared<FlushPipe>();", 1449614Srene.dejong@arm.com ['IsSerializeAfter']) 1452810SN/A header_output += BasicDeclare.subst(isbIop) 1462810SN/A decoder_output += BasicConstructor64.subst(isbIop) 1472810SN/A exec_output += BasicExecute.subst(isbIop) 1488856Sandreas.hansson@arm.com 1492810SN/A dsbIop = InstObjParams("dsb", "Dsb64", "ArmStaticInst", 1503013SN/A "fault = std::make_shared<FlushPipe>();", 15110714Sandreas.hansson@arm.com ['IsMemBarrier', 'IsSerializeAfter']) 1523013SN/A header_output += BasicDeclare.subst(dsbIop) 1538856Sandreas.hansson@arm.com decoder_output += BasicConstructor64.subst(dsbIop) 15410714Sandreas.hansson@arm.com exec_output += BasicExecute.subst(dsbIop) 1558922Swilliam.wang@arm.com 1562897SN/A dmbIop = InstObjParams("dmb", "Dmb64", "ArmStaticInst", "", 1572810SN/A ['IsMemBarrier']) 1582810SN/A header_output += BasicDeclare.subst(dmbIop) 15910344Sandreas.hansson@arm.com decoder_output += BasicConstructor64.subst(dmbIop) 16010344Sandreas.hansson@arm.com exec_output += BasicExecute.subst(dmbIop) 16110344Sandreas.hansson@arm.com 16210714Sandreas.hansson@arm.com clrexIop = InstObjParams("clrex", "Clrex64", "ArmStaticInst", 16310344Sandreas.hansson@arm.com "LLSCLock = 0;") 16410344Sandreas.hansson@arm.com header_output += BasicDeclare.subst(clrexIop) 16510344Sandreas.hansson@arm.com decoder_output += BasicConstructor64.subst(clrexIop) 16610713Sandreas.hansson@arm.com exec_output += BasicExecute.subst(clrexIop) 16710344Sandreas.hansson@arm.com}}; 1682844SN/A