blob: ee3f2d31fd09b37b2da46c23160fede657ff7bf8 [file] [log] [blame]
// -*- mode:c++ -*-
// Copyright (c) 2020 ARM Limited
// Copyright (c) 2020 Metempsy Technology Consulting
// All rights reserved
//
// The license below extends only to copyright in the software and shall
// not be construed as granting a license to any other intellectual
// property including but not limited to intellectual property relating
// to a hardware implementation of the functionality of the software
// licensed hereunder. You may use the software subject to the license
// terms below provided that you ensure that this notice is replicated
// unmodified and in its entirety in all distributions of the software,
// modified or unmodified, in source code or in binary form.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met: redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer;
// redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution;
// neither the name of the copyright holders nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
let {{
header_output = ""
decoder_output = ""
exec_output = ""
def pacEnabledCode(hint):
if hint:
code = """
if (!HavePACExt(xc->tcBase())) {
return NoFault;
}
"""
else:
code = """
if (!HavePACExt(xc->tcBase())) {
return std::make_shared<UndefinedInstruction>(
machInst, true);
}
"""
return code
def buildPauthObject(mnem, templateBase, opcode, hint, optArgs=[]):
global header_output, decoder_output, exec_output
pac_code = '''
%(enabled)s
uint64_t res;
fault = %(op)s(xc->tcBase(), %(op1)s, %(op2)s, &res);
XDest = res;
'''
if templateBase=='DataX2Reg':
code = pac_code % {"enabled": pacEnabledCode(hint),
"op1": 'Op164',
"op2": 'Op264',
"op": opcode }
else:
code = pac_code % {"enabled": pacEnabledCode(hint),
"op1": 'XDest',
"op2": 'Op164',
"op": opcode }
iop = ArmInstObjParams(mnem, mnem, templateBase+"Op", code, optArgs)
header_output += eval(templateBase + "Declare").subst(iop)
decoder_output += eval(templateBase + "Constructor").subst(iop)
exec_output += BasicExecute.subst(iop)
def buildXPauthObject(mnem, hint, optArgs=[]):
global header_output, decoder_output, exec_output
templateBase = "XPauthOpRegReg"
code = pacEnabledCode(hint) + """
uint64_t res;
fault = stripPAC(xc->tcBase(), XDest, data, &res);
XDest = res;
"""
regoptype = 'RegOp'
iop = ArmInstObjParams(mnem, mnem, regoptype, code, optArgs)
header_output += eval(templateBase + "Declare").subst(iop)
decoder_output += eval(templateBase + "Constructor").subst(iop)
exec_output += BasicExecute.subst(iop)
buildPauthObject("Pacda", "DataX1Reg", 'addPACDA', hint=False)
buildPauthObject("Pacdza", "DataX1Reg", 'addPACDA', hint=False)
buildPauthObject("Pacdb", "DataX1Reg", 'addPACDB', hint=False)
buildPauthObject("Pacdzb", "DataX1Reg", 'addPACDB', hint=False)
buildPauthObject("Pacga", "DataX2Reg", 'addPACGA', hint=False)
buildPauthObject("Pacia", "DataX1Reg", 'addPACIA', hint=False)
buildPauthObject("Pacia1716", "DataX1Reg", 'addPACIA', hint=True)
buildPauthObject("Paciasp", "DataX1Reg", 'addPACIA', hint=True)
buildPauthObject("Paciaz", "DataX1Reg", 'addPACIA', hint=True)
buildPauthObject("Paciza", "DataX1Reg", 'addPACIA', hint=False)
buildPauthObject("Pacib", "DataX1Reg", 'addPACIB', hint=False)
buildPauthObject("Pacib1716", "DataX1Reg", 'addPACIB', hint=True)
buildPauthObject("Pacibsp", "DataX1Reg", 'addPACIB', hint=True)
buildPauthObject("Pacibz", "DataX1Reg", 'addPACIB', hint=True)
buildPauthObject("Pacizb", "DataX1Reg", 'addPACIB', hint=False)
buildPauthObject("Autda", "DataX1Reg", 'authDA', hint=False)
buildPauthObject("Autdza", "DataX1Reg", 'authDA', hint=False)
buildPauthObject("Autdb", "DataX1Reg", 'authDB', hint=False)
buildPauthObject("Autdzb", "DataX1Reg", 'authDB', hint=False)
buildPauthObject("Autia", "DataX1Reg", 'authIA', hint=False)
buildPauthObject("Autia1716", "DataX1Reg", 'authIA', hint=True)
buildPauthObject("Autiasp", "DataX1Reg", 'authIA', hint=True)
buildPauthObject("Autiaz", "DataX1Reg", 'authIA', hint=True)
buildPauthObject("Autiza", "DataX1Reg", 'authIA', hint=False)
buildPauthObject("Autib", "DataX1Reg", 'authIB', hint=False)
buildPauthObject("Autib1716", "DataX1Reg", 'authIB', hint=True)
buildPauthObject("Autibsp", "DataX1Reg", 'authIB', hint=True)
buildPauthObject("Autibz", "DataX1Reg", 'authIB', hint=True)
buildPauthObject("Autizb", "DataX1Reg", 'authIB', hint=False)
buildXPauthObject("Xpacd", hint=False)
buildXPauthObject("Xpaci", hint=False)
buildXPauthObject("Xpaclri", hint=True)
}};